利用 kubectl 管理多集群/命令空间

文章目录

  • 1. kubeconfig 配置文件结构
    • 1.1 kubeconfig 配置文件组成
      • a. 集群
      • b. 用户
      • c. 上下文
      • d. 当前上下文
  • 2. 以 token 的方式来配置 kubeconfig 文件
    • 2.1 配置服务账户及授权
    • 2.2 设置kubeconfig文件
  • 3 多集群配置的其他方法
    • 利用 kubectl 来合并多个配置文件

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

上面是直接使用证书的形式,如果本地没有证书,则可以使用下面的方式

  1. ucloud 的根证书文件位置为:/etc/kubernetes/ssl/ca.pem,正常位置是 /etc/kubernetes/pki
  2. 证书文件是明文的,kubeconfig 中要使用 base64 加密过后的
  3. 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 来合并多个配置文件

思路

  1. 将多个集群的 kubeconfig 文件路径以 : 拼接后赋值给 KUBECONFIG 环境变量
  2. 利用 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 里面没有办法关联到实际的集群

你可能感兴趣的:(kubernetes,kubectl,kubernetes,云原生)