通常我们使用 K8S 的时候,都是在一个新的 namespace 下部署应用,但是 kubectl 命令默认是在 default 的 namespace 下,每个操作都需要指定 namespace,非常不方便。有没有什么办法可以随时切换默认的namespace呢?
认识 kubectl
从用户角度看,kubectl 是控制 Kubernetes 的命令行工具,用它来执行各项管理操作。从技术角度看,kubectl 是 Kubernetes 的 API 客户端。Kubernetes API 是 HTTP Rest API,是 Kubernetes 各种资源对象的交互入口。所以 kubectl 的主要工作是对 Kubernetes API 执行各种 HTTP 请求。

kubectl 通过自己的配置和指定的 K8S 集群交互,默认的配置文件位置在 ~/.kube/config,也可以通过 --kubeconfig 选项,或者 $KUBECONFIG 环境变量来指定。
我们来看看配置里都有什么:
$ kubectl config viewapiVersion: v1#集群clusters:- cluster:certificate-authority-data: DATA+OMITTEDserver: https://192.168.201.1:6443name: kubernetes#上下文contexts:- context:cluster: kubernetesuser: kubernetes-adminname: kubernetes-admin@kubernetes#默认上下文current-context: kubernetes-admin@kuberneteskind: Configpreferences: {}#用户users:- name: kubernetes-adminuser:client-certificate-data: REDACTEDclient-key-data: REDACTED
可以看到,配置文件中主要包含三部分:
clusters:指定CA证书和api server地址
users:集群用户,可以使用证书或者用户名、密码的方式登录
contexts:上下文,绑定用户与集群,可以设置默认使用的context
kubeconfig 可以通过 kubectl config SUBCOMMAND 来管理,下面我们看下怎么通过修改配置来实现切换 namespace。
方法一:直接修改当前 context
$ kubectl config set-context --current --namespace={{ namespace }}
修改后的结果:
$ kubectl config view- context:cluster: kubernetesnamespace: openstackuser: kubernetes-adminname: kubernetes-admin@kubernetescurrent-context: kubernetes-admin@kubernetes
方法二:建一个新的 context
$ kubectl config set-context {{ namespace }} --namespace={{ namespace }} --cluster=kubernetes --user=kubernetes-admin
切换到新context
$ kubectl config use-context {{ namespace }}
修改后的结果:
- context:cluster: kubernetesnamespace: openstackuser: kubernetes-adminname: kubernetes-admin@openstackcurrent-context: kubernetes-admin@openstack
方法三:使用别名封装
$ alias kubectl='_kubectl_custom(){ if [[ "$1" == "project" && "$2" != "" ]]; then kubectl config set-context --current --namespace=$2; elif [[ "$1" == "projects" && "$2" == "" ]]; then kubectl get ns; elif [[ "$1" == "project" && "$2" == "" ]]; then kubectl config get-contexts | sed -n "2p" | awk "{print \$5}"; else kubectl $*; fi;}; _kubectl_custom'
使用方法:
$ kubectl projectsNAME STATUS AGEdefault Active 27hopenstack Active 21h$ kubectl project openstackContext "kubernetes-admin@kubernetes" modified.$ kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEcinder ClusterIP 10.96.203.111 <none> 80/TCP,443/TCP 21h
好了,现在可以敞开用了,Have Fun!




