文章目录
refs:
- https://kubernetes.io/zh/docs/tasks/access-application-cluster/configure-access-multiple-clusters/
- https://cloud.tencent.com/developer/article/1938130
1. kubeconfig 配置文件结构
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: apiserver-certifi-base64 # 集群认证数据,可以写文件路径,也可以是经过 base64 加密后的字符串
server: https://xxx:6443 # 集群 apiserver 地址
name: kubernetes # 集群名称
contexts:
- context:
cluster: kubernetes # 上下文关联的用户
user: kubernetes-admin # 上下文关联的用户
name: kubernetes-admin@kubernetes # 上下文名称
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin # 用户名称
user:
client-certificate-data: fake-client-cert # 用户认证证书
client-key-data: fake-client-cert-key # 用户认证密钥
默认 kubeconfig 中 “cluster -》 certificate-authority-data” 的字符串是使用 base64 加密过后的,可以用下面的方式来证明
$ enc_str=`base64 -w0 /etc/kubernetes/pki/ca.crt `
$ grep $enc_str ${HOME}/.kube/config
certificate-authority-data: LS0tLS1CRUdxxxxxxtLS0tLQo=
1.1 kubeconfig 配置文件组成
kubeconfig文件由以下四部分组成:
• 集群列表
• 用户列表
• 上下文列表
• 当前 上下文名称
每个集群、 用户和上下文都有一个名称用于区分。
a. 集群
- 集群条目代表Kubemetes集群,包含用户凭据信息集群条目代表Kubemetes集群, 并包含API服务器的URL、证书颁发机构(CA)文件, 以及可能与通过API服务器进行通信相关的一些其他配置选项。
- CA证书可以存储在单独的文件中并在kubeconfig文件中引用,也可以直接将其包含在 certificate-authority-data字段中。
b. 用户
- 每个用户定义了在与API服务器交谈时使用的凭据。
- 可以是
- 用户名和密码
- 身份验证令牌
- 客户端密钥和证书
- 证书和密钥可以包含在kubeconfig文件中(通过 client-certificate-data 和 client-key-data 属性),或者存储在单独的文件中并在配置文件中引用
c. 上下文
- 上下文将kubectl执行命令时应使用的集群、 用户以及默认命名空间关联在一起。
- 多个上下文可以指向同一个用户或集群。
d. 当前上下文
- 虽然可以在kubeconfig文件中定义多个上下文, 但在同一时间,只有其中一个是当前上下文。
2. 以 token 的方式来配置 kubeconfig 文件
refs: https://www.cnblogs.com/37yan/p/14781546.html
2.1 配置服务账户及授权
- 创建服务账户
kubectl create sa api-admin
- 获取TOKEN
# 为什么获取到 token 后还要 base64 解密
# 猜测:未查证
# k8s 集群中的凭证存储都是以 base64 加密过的,服务端对客户端认证时,会把携带的认证数据通过 base64 加密后来比对,因此这里需要使用解密后的数据(即客户端使用的是原始数据,服务端是 base64 加密后的)
TOKEN=(kubectl get secrets $(kubectl get sa api-admin -ojsonpath='{.secrets[0].name}') -ojsonpath='{.data.token}' |base64 -d)
下面是 ucloud k8s 的配置(猜想验证)
# 获取加密验证的字符串
$ kubectl -n kube-system get secrets user-admin-token-gr5zw -ojsonpath='{.data.token}' | base64 -d -w 0
# k8s kubeconfig 凭证部分内容
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: xxxxxxxxx
server: https://xxx:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: user-admin
name: kubernetes
current-context: kubernetes
kind: Config
preferences: {}
users:
- name: user-admin
user:
token: xxx
- 集群管理员授权
kubectl create clusterrolebinding cluster-api-admin --clusterrole=cluster-admin --serviceaccount=default:api-admin
2.2 设置kubeconfig文件
- 设置集群配置
ubectl config set-cluster k8s-test --server=$APISERVER --certificate-authority=/home/admin/kubernetes.ca.crt
上面是直接使用证书的形式,如果本地没有证书,则可以使用下面的方式
- ucloud 的根证书文件位置为:/etc/kubernetes/ssl/ca.pem,正常位置是 /etc/kubernetes/pki
- 证书文件是明文的,kubeconfig 中要使用 base64 加密过后的
- kubeconfig 中 cluster 属性不再是
certificate-authority
而是certificate-authority-data:
后面跟主节点根证书 base64 加密后的字符串
- 设置客户端配置
kubectl config set-credentials api-admin --token=$TOKEN
- 设置上下文配置
kubectl config set-context k8s-test --cluster=k8s-test --user=api-admin
- 设置默认上下文
kubectl config use-context k8s-test
3 多集群配置的其他方法
refs: https://cloud.tencent.com/developer/article/1938130
利用 kubectl 来合并多个配置文件
思路
- 将多个集群的 kubeconfig 文件路径以
:
拼接后赋值给KUBECONFIG
环境变量 - 利用
kubectl config view --merge --flatten
合并配置文件
操作示例
KUBECONFIG=./config-01:./config-02:./config-03:./config-04 kubectl config view --merge --flatten > ~/.kube/config
需要注意的地方:集群的配置文件默认都是 kubeadm 安装的, kubeconfig 中 cluster.name 都是 kubernetes, 因此需要自己提前改好标识,不然 context 里面没有办法关联到实际的集群