跳到主要内容

制作 Kube Config

Kubeconfig介绍

Kubeconfig是Kubernetes集群的认证和授权配置文件,通常保存在~/.kube/config文件中,该文件支持包含多个集群配置,每个集群配置包含多个用户配置,用户配置包含多个上下文配置,上下文配置包含集群配置和用户配置

Kubeconfig结构

Kubeconfig的通用结构如下:

apiVersion: v1
kind: Config
clusters: # 集群列表
- name: <cluster-name> # 集群名称
cluster:
server: <https://<master-ip>:<port>> # 集群API服务器地址
certificate-authority-data: <base64-encoded-ca-cert> # CA证书
users: # 用户列表
- name: <user-name> # 用户名称
user:
client-certificate-data: <base64-encoded-client-cert> # 客户端证书
client-key-data: <base64-encoded-client-key> # 客户端密钥
token: <token> # 令牌(可选)
contexts: # 上下文列表
- name: <context-name> # 上下文名称
context:
cluster: <cluster-name> # 集群名称
user: <user-name> # 用户名称
current-context: <context-name> # 当前上下文名称

token 型 kubeconfig 与证书型 kubeconfig 的区别

上面的示例中,user 部分既可以使用 client-certificate-data/client-key-data(证书方式),也可以使用 token(令牌方式):

  • 证书型 kubeconfig(client-certificate-data / client-key-data)

    • 使用 X.509 客户端证书 + 私钥完成双向 TLS 认证。
    • 常见于集群管理员、集群组件(如 kube-controller-manager)或通过集群 PKI 正式签发的证书。
    • 证书通常由集群 CA 签发,有有效期,更新证书时需要重新分发 kubeconfig。
    • 优点:安全性高、与 PKI 体系集成良好;缺点:证书签发、更新和分发相对繁琐。
  • token 型 kubeconfig(user.token)

    • 客户端只携带一个 Bearer Token 字符串,不需要本地保存私钥。
    • 常见于基于 ServiceAccount 的访问、CI/CD 系统、自动化脚本等场景。
    • Token 的权限由绑定的 ServiceAccount + RBAC 决定,更易于按需生成和回收。
    • 优点:生成和分发简单,权限粒度可控;缺点:一旦泄露即等价于泄露凭据,需要注意保密和过期策略。

整体来说:

  • 管理型、长期、需要 PKI 体系的账号:更适合使用 证书型 kubeconfig
  • 自动化、按需、短期或仅限某一应用的访问:更适合使用 token 型 kubeconfig(通常基于 ServiceAccount)

Kubeconfig生成

可以使用kubectl config命令生成完整的Kubeconfig文件

根据user token、apiserver 地址 和 cadata(Base64 编码的 CA 证书)生成 kubeconfig

设置集群参数

cadata 解码为 CA 证书文件,并绑定集群信息:

# 解码 CA 证书(假设 cadata 为 Base64 字符串)
echo "<cadata>" | base64 -d > ca.crt

# 设置集群参数
kubectl config set-cluster my-cluster \
--certificate-authority=ca.crt \
--embed-certs=true \ # 将证书嵌入 kubeconfig
--server="<apiserver-地址>" \ # 例如 https://192.168.1.100:6443
--kubeconfig=config.yaml

关键参数:

  • --embed-certs=true:将 CA 证书直接写入 kubeconfig,避免依赖外部文件
  • --server:必须是完整的 HTTPS 地址(如 https://<IP>:6443

设置用户参数

使用 token 定义用户身份:

kubectl config set-credentials my-user \
--token="<token>" \ # 提供的 token 字符串
--kubeconfig=config.yaml

Token 从哪里来?

通常我们会使用 ServiceAccount 来为某个工作负载生成访问集群的 Token,不同 Kubernetes 版本获取 Token 的方式略有不同:

Kubernetes 1.24 之前:自动创建的 ServiceAccount Secret

在 1.24 之前,Kubernetes 会为每个 ServiceAccount 自动创建一个类型为 kubernetes.io/service-account-token 的 Secret,并将其挂载到 Pod 中:

# 1. 创建 ServiceAccount
kubectl create serviceaccount my-sa -n demo

# 2. 查看自动生成的 Secret
kubectl -n demo get secret

# 3. 描述 Secret,查看其中的 token 字段
kubectl -n demo describe secret my-sa-token-xxxxx

describe 输出中的 token 字段就是可以直接写入 kubeconfig 的 Token,配合上面的 kubectl config set-credentials --token=... 即可生成 token 型 kubeconfig。

Kubernetes 1.24 及之后:手动/显式生成 Token

从 1.24 开始,默认 不再自动为 ServiceAccount 创建长期 Secret Token,推荐使用 短期 Token(TokenRequest) 或显式创建 Secret:

  • 推荐方式:使用 kubectl create token 生成短期 Token
# 为 ServiceAccount 生成一个短期 token(默认 1 小时,可以通过 --duration 调整)
kubectl -n demo create token my-sa --duration=24h

命令输出的一行字符串就是 Token,同样可以用于 kubectl config set-credentials --token=...

  • 仍可手动创建长期 ServiceAccount Secret(不推荐,除非有特别需求)
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: my-sa-token
namespace: demo
annotations:
kubernetes.io/service-account.name: my-sa
kubectl apply -f sa-token.yaml
kubectl -n demo describe secret my-sa-token

同样可以从 describe 输出中获取 token 字段,再写入 kubeconfig。

更多细节可以参考 Kubernetes 官方文档:清理自动生成的传统 ServiceAccount 令牌

权限说明:

  • Token 需绑定 RBAC 权限(如 RoleClusterRole),否则无操作权限
  • 生产环境建议为不同用户生成独立 Token,遵循最小权限原则

根据 client-certificate-data、client-key-data、apiserver 地址 和 cadata 生成 kubeconfig

证书型 kubeconfig 的前提是你已经有:

  • apiserver 地址(如 https://192.168.1.100:6443
  • 集群 CA 证书(cadata,Base64 编码)
  • 客户端证书 client.crt(或等价内容)
  • 客户端私钥 client.key

客户端证书一般由集群 CA 签发,例如通过 cfssl / openssl 或 CSR + kubectl certificate approve 流程,这里不展开签发过程,只演示如何写入 kubeconfig。

设置集群参数(与 token 方式相同)

# 解码 CA 证书(假设 cadata 为 Base64 字符串)
echo "<cadata>" | base64 -d > ca.crt

# 设置集群参数
kubectl config set-cluster my-cluster \
--certificate-authority=ca.crt \
--embed-certs=true \
--server="https://<apiserver-ip>:6443" \
--kubeconfig=config-cert.yaml

设置用户参数

使用 client-certificateclient-key 定义用户身份:

kubectl config set-credentials my-cert-user \
--client-certificate=client.crt \ # 客户端证书
--client-key=client.key \ # 客户端私钥
--embed-certs=true \ # 将证书和私钥内容写入 kubeconfig
--kubeconfig=config-cert.yaml

上述命令会在生成的 kubeconfig 中填充 client-certificate-dataclient-key-data 字段,实现证书型 kubeconfig。

创建上下文

关联集群与用户,并设置命名空间(可选)

kubectl config set-context my-context \
--cluster=my-cluster \
--user=my-user \
--namespace=default \ # 指定默认命名空间
--kubeconfig=config.yaml

设为默认上下文

kubectl config use-context my-context --kubeconfig=config.yaml

与kubeconfig常用的相关命令

  • 打印当前上下文对应的kubeconfig内容:
kubectl config view --minify --raw