kubectl连接到不同的集群

在公司运维多个k8s集群的过程中,经常需要kubectl到不同的集群。如果每次都不断的ssh到各个集群,这种感觉就很难受了。我们需要配置本地kubectl,能方便的在多个k8s集群间切换。

kubeconfig文件的结构

首先看一下kubeconfig文件的结构

部署好一个k8s集群后,我们在服务器上连接本地的k8s,默认用的是下面的kubeconfig文件

bash 复制代码
cat ~/.kube/config

和/etc/kubernetes/admin.conf一样的

kubeconfig文件主要分成三部分

context部分

yaml 复制代码
contexts:
- context:
    cluster: kubernetes
    namespace: default
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes

cluster部分

yaml 复制代码
clusters:
- cluster:
    certificate-authority-data: {BASE64格式的数据xxxxxx}
    server: https://apiserver.cluster.local:6443
  name: kubernetes

user部分

yaml 复制代码
users:
- name: kubernetes-admin
  user:
    client-certificate-data: {BASE64格式的数据xxxxxx}
    client-key-data: {BASE64格式的数据xxxxxx}

其他

makefile 复制代码
apiVersion: v1
kind: Config
current-context: kubernetes-admin@kubernetes   // 这个字段有用,标识当前用的哪个context
preferences: {}

这样分解之后,就比较清晰了。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这边用来解密的私钥

如何查看证书

arduino 复制代码
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角色是由所有资源的所有权限。

arduino 复制代码
kubectl get clusterrolebinding cluster-admin -o yaml
kubectl get clusterrole cluster-admin -o yaml

添加其他集群的context

bash 复制代码
cd ~/.kube
cp config config.bak

添加cluster信息

先把base64格式的证书数据保存成证书。

bash 复制代码
echo "base64数据" | base64 -d>sit.ca

然后执行添加

arduino 复制代码
kubectl config --kubeconfig=config set-cluster sit --server=https://10.250.x.x:6443 --certificate-authority=sit.ca

看一下

已经加上了

添加user信息

同样先保存证书

bash 复制代码
echo "base64数据" | base64 -d>sit-admin.crt
echo "base64数据" | base64 -d>sit-admin.key

添加

arduino 复制代码
kubectl config --kubeconfig=config set-credentials sit-admin --client-certificate=sit-admin.crt --client-key=sit-admin.key

看一下已经加上了

添加context信息

最后一步,添加context信息

arduino 复制代码
kubectl config --kubeconfig=config set-context sit --cluster=sit --namespace=default --user=sit-admin

查看一下,可以使用config view命令

arduino 复制代码
kubectl config view

好了,现在就有了2个集群的连接信息

如果加错了要删除

删除cluster

arduino 复制代码
kubectl --kubeconfig=config config unset clusters.sit

删除user

arduino 复制代码
kubectl --kubeconfig=config config unset users.sit-admin

删除context

arduino 复制代码
kubectl --kubeconfig=config config unset contexts.sit

测试一下

默认context连接的集群

指定一下context

arduino 复制代码
kubectl --context sit get nodes

就可以连接sit集群了。

还是不太方便,每次都要--context。可以把sit设置为默认连接

arduino 复制代码
kubectl config use-context sit

现在,current-context就是sit环境了

好了。以后就方便了~

本文使用 markdown.com.cn 排版

相关推荐
潮流coder36 分钟前
ssh公钥 key生成
运维·ssh
守城小轩1 小时前
基于Chrome140的Reddit账号自动化(关键词浏览)——运行脚本(三)
运维·自动化
eventer1231 小时前
构建 HertzBeat Docker 镜像的技术实践
运维·docker·容器
深耕AI1 小时前
【wordpress系列教程】02 Blocksy主题
运维·服务器·前端
遇见火星2 小时前
Jenkins核心部署流程
运维·jenkins
gaize12133 小时前
服务器异常如何解决
运维·服务器
dragoooon343 小时前
仿muduo库实现高并发服务器-面试常见问题
运维·服务器·面试
Empty_7774 小时前
K8S-Job & Cronjob
java·linux·docker·容器·kubernetes
开***能4 小时前
ASI转Profinet网关助力包装全产业自动化
运维·自动化