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 排版

相关推荐
KIDULT°6 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
wewowilling9 小时前
认识微服务
java·运维·微服务·springcloud
玖石书9 小时前
Ubuntu 24.04 UFW 全命令攻略:从入门到端口开放实战
linux·运维·ubuntu
weifont11 小时前
自动化抓取和上架商品:能不动手,就少动手
运维·前端·自动化
拂拉氏11 小时前
【知识讲解】 Linux之动静态库的了解
linux·运维·服务器·动静态库
Mikko712 小时前
Linux 重启后日志没了?进程被 OOM 杀了去哪看?logrotate 之后日志还往旧文件写?三台真机实测日志与性能排查
linux·运维·centos
光依旧12 小时前
发版就掉请求?Spring Boot优雅停机的四步
运维·spring boot·nginx·高可用·优雅停机·mcp server
yichengerp14 小时前
电子行业常用erp系统有哪些?推荐适合中小电子厂的易呈erp软件,操作简单,易落地
大数据·运维·人工智能·云计算·制造
天国梦14 小时前
国密门禁品牌怎么选?2026年最新3个避坑要点
运维·服务器·数据库·python
信可维15 小时前
自动化操作多平台账号:登录态、双会话与 User Data 的 3 个坑
运维·自动化