制作 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权限(如Role或ClusterRole),否则无操作权限- 生产环境建议为不同用户生成独立
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-certificate 和 client-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-data 和 client-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