在公司运维多个k8s集群的过程中,经常需要kubectl到不同的集群。如果每次都不断的ssh到各个集群,这种感觉就很难受了。我们需要配置本地kubectl,能方便的在多个k8s集群间切换。
kubeconfig文件的结构
首先看一下kubeconfig文件的结构
部署好一个k8s集群后,我们在服务器上连接本地的k8s,默认用的是下面的kubeconfig文件
1 | cat ~/.kube/config |
和/etc/kubernetes/admin.conf一样的
kubeconfig文件主要分成三部分
context部分
1 | contexts: |
cluster部分
1 | clusters: |
user部分
1 | users: |
其他
1 | apiVersion: v1 |
这样分解之后,就比较清晰了。cluster部分是要连接的集群的信息。user部分负责用户鉴权信息。
context部分组装cluser+user。供kubectl使用。
cluster部分
certificate-authority-data是什么?
这个认证数据的作用是用来验证k8s集群的。如果kubectl 开启了 –insecure-skip-tls-verify=true 配置,那么这个certificate-authority-data是错的也无所谓。
怎么验证k8s集群的呢?
首先要清楚kubectl和k8s交互的流程。
当kubectl发送请求给k8s的api-server时,api-server会返回master的服务端证书给kubectl。(这个证书就是/etc/kubernetes/pki/apiserver.crt )
kubectl 就会校验 apiserver.crt 的正确性,这个校验就使用certificate-authority-data
然后,以后kubectl发送消息就会用 apiserver.crt进行加密
apiserver那边会对消息进行解密,使用/etc/kubernetes/pki/apiserver.key
在这份场景下,/etc/kubernetes/pki/apiserver.crt 就是公钥,/etc/kubernetes/pki/apiserver.key就是私钥了
user部分
cluster部分说到了kubectl发送的消息使用apiserver的公钥进行加密。
那么apiserver回给kubectl的消息呢?
当然也是需要加密的
那么用的公钥是啥?
就是这个user部分定义的client-certificate-data
嗯,你也就猜到了,client-key-data就是kubectl这边用来解密的私钥
如何查看证书
1 | openssl x509 -in apiserver.crt -noout -text |

这里可以看到证书的过期时间,我这搞成100年
也可以把user的client-certificate-data先用base64解码之后保存成crt文件,解析看看

里面会有用户的信息。CN表示user,O是group
可见,当前客户端证书的用户是kubernetes-admin,组是system:masters
system:masters组是k8s内置的用户组。通过查看clusterrolebinding看到system:masters组是绑定了cluster-admin角色,cluster-admin角色是由所有资源的所有权限。
1 | kubectl get clusterrolebinding cluster-admin -o yaml |
添加其他集群的context
1 | cd ~/.kube |
添加cluster信息
先把base64格式的证书数据保存成证书。
1 | echo "base64数据" | base64 -d>sit.ca |
然后执行添加
1 | kubectl config --kubeconfig=config set-cluster sit --server=https://1x.xxx.x.x:6443 --certificate-authority=sit.ca |
看一下

已经加上了
添加user信息
同样先保存证书
1 | echo "base64数据" | base64 -d>sit-admin.crt |
添加
1 | kubectl config --kubeconfig=config set-credentials sit-admin --client-certificate=sit-admin.crt --client-key=sit-admin.key |

看一下已经加上了
添加context信息
最后一步,添加context信息
1 | kubectl config --kubeconfig=config set-context sit --cluster=sit --namespace=default --user=sit-admin |
查看一下,可以使用config view命令
1 | kubectl config view |

好了,现在就有了2个集群的连接信息
如果加错了要删除
删除cluster
1 | kubectl --kubeconfig=config config unset clusters.sit |
删除user
1 | kubectl --kubeconfig=config config unset users.sit-admin |
删除context
1 | kubectl --kubeconfig=config config unset contexts.sit |
测试一下
默认context连接的集群

指定一下context
1 | kubectl --context sit get nodes |

就可以连接sit集群了。
还是不太方便,每次都要–context。可以把sit设置为默认连接
1 | kubectl config use-context sit |

现在,current-context就是sit环境了
好了。以后就方便了~