「Kubernetes」- kubeconfig

认识

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

组成

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

文件格式

kubernetes/kubeconfig-file.md at release-1.1 · kubernetes/kubernetes · GitHub

配置文件 ~/.kube/config 的格式如下(通常使用 kubectl config 命令修改,无需手动编辑):

# cat $HOME/.kube/config
apiVersion: v1
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}

# 配置集群
clusters:
- cluster:
    certificate-authority-data: <ca-data>
    server: https://10.10.50.90:6443
  name: kubernetes

# 配置用户
users:
- name: kubernetes-admin
  user:
    client-certificate-data: <client-cert-data>
    client-key-data: <client-key-data>

# 配置上下文(要使用的用户及要访问的集群)
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes

构建

创建 kubeconfig 配置

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

在初始化集群后,我们使用 kubectl 命令能够控制整个集群,这是因为 ~/.kube/config 的凭证权限足够高。

如果要访问集群,需要使用 kubeconfig 配置文件,该文件位于 ~/.kube/config(在集群主机上),是集群初始化时创建的(手动复制):

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

但是,

  • 官方并不建议直接分发该凭证,应该创建新凭证并限制访问权限。比如,某些用户仅能访问和控制特定明明空间的资源;在访问 Dashboard 界面时,因该使用受限的 TOKEN 凭证。
  • 如果使用云商提供的 Kubernetes 服务,则通常并不提供 admin.conf 文件;

创建 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

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

第一步、创建 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 create token -n kube-system cluster-admin-4ci --duration 25h # 最多 24 小时

第二步、在 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 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