![eca5c9eedb55eda20b5002ad05a6c5a0.png](https://i-blog.csdnimg.cn/blog_migrate/2bd3b02a9ca7749335a144f08f3e96de.jpeg)
第一性原则看问题
kubectl
本质上是一个与 kube-apiserver
做 7 层通信的客户端工具,因为 kube-apiserver
会做鉴权,所以 kubectl
使用过程中需要 kubeconfig
文件来保存一些配置信息,这些信息包括:
- 用来验证
kube-apiserver
的 CA 根证书 - 用来标识
kubectl
管理员的证书 & 私钥
,或者用来标识普通用户的token
kubeconfig
是一个 YAML 格式的配置文件,其主要字段如下:
clusters
类型为数组,每个元素代表一个 k8s clusterusers
类型为数组,每个元素代表拥有访问权限的用户contexts
类型为数组,每个元素表示要使用的cluster
&user
组合current-context
当前正在使用的上下文
kubectl 做多集群的管理,本质上就是把集群的相关参数,以及用户的相关信息全都记录下来,然后通过 context
将其组合,通过 current-context
参数来标明当前正在使用的 context
。
多集群管理实操
1. 创建 kubeconfig
文件脚手架
kubeconfig
是一个 YAML 格式的配合文件,假定我们现在的需求是:管理开发集群 dev
和测试集群 test
。这时我们先定义两个集群 test
& dev
,此外 test
集群管理员我们命名为 test-admin
,dev
集群的管理员命名为 dev-admin
。
最后我们通过 test context
来表示测试集群上下文,用dev context
来表示开发集群上下文。
apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
name: test
- cluster:
name: dev
users:
- name: test-admin
- name: dev-admin
contexts:
- context:
name: test
- context:
name: dev
2. 向 kubeconfig
中填写参数
该步骤的任务是向 kubeconfig
文件中填写配置信息,主要包含 cluster
、user
、context
。不需要手动填写,kubectl config
会将我们传入的参数填入到配置文件中去。默认的,kubectl
会操作 $HOME/.kube/config
文件(没有 KUBECONFIG
环境变量做特殊声明的话),我们可以使用 --kubeconfig
参数来指明要操作的 kubeconfig
文件。
对 cluster
做配置
分别对 dev
& test
集群配置,填写内容包括 kube-apiserver
的地址端口和集群的根证书路径。--embed-certs=true
参数可以把证书内容内嵌到配置文件中。
kubectl config --kubeconfig=kubeconfig set-cluster ${Cluster_Name}
--server=${API_Server_Addr}
--certificate-authority=${CA_PATH}
--embed-certs=true
对 user
做配置
分别对 test-admin
& user-admin
做参数配置,填写的内容包括标识 admin
身份的证书和私钥。
kubectl config --kubeconfig=kubeconfig set-credentials ${User_Name}
--client-certificate=${Client_Cert}
--client-key=${Client_Private_Key}
--embed-certs=true
对 context
做配置
context
本质上是 cluster
、user
、namespace
的组合,其中 namespace
选填,默认为 default
。
# 配置 test 集群
kubectl config --kubeconfig=kubeconfig set-context test
--cluster=test
--user=test-admin
# 配置 dev 集群
kubectl config --kubeconfig=kubeconfig set-context dev
--cluster=dev
--user=dev-admin
选定要使用的集群
切换集群的本质就是改变 current-context
的值,通过 current-context
来标识当前 kubectl
访问的是哪个集群。
kubectl config use-context ${Context_Name}
核查配置结果
本文要达到的最终目的就是通过 kubectl config use-context
快速的在多个集群之间切换,效果如下:
➜ kubectl get node
NAME STATUS ROLES AGE VERSION
master1.safehouse.mydomain.com Ready,SchedulingDisabled master 87d v1.15.5
worker1.safehouse.mydomain.com Ready node 87d v1.15.5
worker2.safehouse.mydomain.com Ready node 87d v1.15.5
➜ kubectl config use-context dev
Switched to context "dev".
➜ kubectl get node
NAME STATUS ROLES AGE VERSION
master1.dev.sf.com Ready,SchedulingDisabled master 82d v1.15.5
worker1.dev.sf.com Ready node 82d v1.15.5
worker2.dev.sf.com Ready node 82d v1.15.5