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=
kubeconfig文件由以下四部分组成:
• 集群列表
• 用户列表
• 上下文列表
• 当前 上下文名称
每个集群、 用户和上下文都有一个名称用于区分。
refs: https://www.cnblogs.com/37yan/p/14781546.html
kubectl create sa api-admin
# 为什么获取到 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
ubectl config set-cluster k8s-test --server=$APISERVER --certificate-authority=/home/admin/kubernetes.ca.crt
上面是直接使用证书的形式,如果本地没有证书,则可以使用下面的方式
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
refs: https://cloud.tencent.com/developer/article/1938130
思路
:
拼接后赋值给 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 里面没有办法关联到实际的集群