「Kubernetes」- kubeconfig

认识

kubeconfig 文件是 Kubernetes 中用于配置集群访问信息的配置文件,它包含了连接到 Kubernetes 集群所需的所有信息。命令 kubectl 需要使用 kubeconfig 来连接 Kubernetes 集群。

组成

WIP 针对 kubeconfig 文件,其文件的结构。

构建

当创建集群时,生成 kubeconfig 文件 /etc/kubernetes/admin.conf

在初始化集群后,我们使用 kubectl 命令能够控制整个集群,这是因为 ~/.kube/config 的凭证权限足够高。但是官方并不建议直接分发该凭证,应该创建新凭证并限制访问权限。比如,某些用户仅能访问和控制特定明明空间的资源;在访问 Dashboard 界面时,因该使用受限的 TOKEN 凭证。

该笔记的其他部分将记录:在 Kubernetes 中,如何创建 TOKEN 来授权管理集群、管理特定命名空间等等操作,以及相关问题处理方法。

创建 TOKEN 凭证,来创建 kubeconfig 文件

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_create/kubectl_create_token/
https://stackoverflow.com/questions/47770676/how-to-create-a-kubectl-config-file-for-serviceaccount

第一步、创建 Admin Token(以管理整个集群)

# ----------------------------------------------------------------------------- # 创建 Role 或 ClusterRole 资源

我们该处直接使用 ClusterRole cluster-admin 资源,所以未进行创建 

# ----------------------------------------------------------------------------- # 创建 Service Account 资源

kubectl create serviceaccount "cluster-admin-4ci" -n kube-system

# ----------------------------------------------------------------------------- # 创建 ClusterRoleBinding 资源

kubectl create clusterrolebinding "cluster-admin-4ci"                          \
    --clusterrole=cluster-admin                                                \
    --serviceaccount=kube-system:cluster-admin-4ci

# ----------------------------------------------------------------------------- # 生成 token 信息

# for Kubernetes 1.24-
secret=$(kubectl get -n kube-system serviceaccounts "cluster-admin-4ci" -o jsonpath='{.secrets[0].name}')
kubectl get -n kube-system secrets $secret -o jsonpath='{.data.token}' | base64 -d

# for Kubernetes 1.24+
kubectl create token -n kube-system "cluster-admin-4ci" # SERVICE_ACCOUNT_NAME

第二步、在 kubectl 中,增加配置

  • 在 .kube/config 中,使用该 TOKEN 信息:users[].user.token: xxxxxxx

创建长期凭证 | https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#manually-create-a-long-lived-api-token-for-a-serviceaccount

kubectl create token --duration 25h -n kube-system cluster-admin-4ci # 最多 24 小时

kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: cluster-admin-4ci
  namespace: kube-system
  annotations:
    kubernetes.io/service-account.name: cluster-admin-4ci
type: kubernetes.io/service-account-token
EOF

kubectl get -n kube-system secret/cluster-admin-4ci -o jsonpath='{.data.token}' | base64 -d

通过 view-serviceaccount-kubeconfig 创建

GitHub/superbrothers/kubectl-view-serviceaccount-kubeconfig-plugin

通过该插件,我们能够使用特定 ServiceAccount 直接生成 kubeconfig 文件;

插件安装:

// 安装 krew 插件
// https://krew.sigs.k8s.io/

...

// 安装 view-serviceaccount-kubeconfig 插件

# kubectl krew install view-serviceaccount-kubeconfig
Updated the local copy of plugin index.
...

使用插件:

kubectl create serviceaccount "cluster-admin-4ci" -n kube-system

kubectl create clusterrolebinding "cluster-admin-4ci"                          \
    --clusterrole=cluster-admin                                                \
    --serviceaccount=kube-system:cluster-admin-4ci

kubectl view-serviceaccount-kubeconfig -n kube-system cluster-admin-4ci

参考文献

docker – How to get the admin-user token from kubectl – Super User
How To Create Admin User to Access Kubernetes Dashboard | ComputingForGeeks