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

相关推荐
mengge.cloud几秒前
10-29-Kubernetes动态卷供应StatefulSet与ETCD
容器·kubernetes·etcd
小哈里2 分钟前
【推理】NVIDIA DLI培训:大规模部署与优化 AI 推理(推理原理,K8S,网关层,pd分离,MoE,Dynamo)
人工智能·容器·kubernetes·nvidia·推理
Android系统攻城狮5 分钟前
Linux FFmpeg深度解析之avcodec_default_get_buffer2调用流程与实战(二十)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
深圳恒讯7 分钟前
香港云主机硬盘满了怎么办?Linux和Windows在线扩容操作教程
linux·运维·windows
饭后一颗花生米9 分钟前
GitHub Actions 自动化:5 个真实运维提效案例
运维·自动化·github
Android系统攻城狮15 分钟前
Linux FFmpeg深度解析之av_parser_init调用流程与实战(二十一)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
Canmag 兴隆磁性36 分钟前
钕铁硼磁片取向方向检测自动化方案:从人工目检到流水线在线分选的工程实践
运维·数据库·自动化·工业自动化·钕铁硼·自动化检测·磁材料
寺中人1 小时前
CentOS 7进程与任务管理
linux·运维·centos·服务器搭建与管理·linux运维命令·nohup screen
wtblszn1 小时前
凹版印刷机智慧运维物联网系统方案
java·运维·物联网
Yula99331 小时前
把“凌晨电话”消灭在邮件系统架构设计阶段——从运维痛点反推企业邮件系统的工程选择
运维·exchange·数据库管理员·企业邮箱管理员·企业电子邮件系统·企业通讯安全