摘要:理解 kubeconfig 中 clusters、users 与 contexts 的关系,掌握多集群配置合并、上下文切换、凭据保护及连接和授权故障排查。
1. kubeconfig 是什么?
kubeconfig 是 Kubernetes 客户端使用的配置文件。
它告诉 kubectl 三件事情:
- Cluster:连接哪个 Kubernetes 集群?
- User:使用什么身份访问?
- Context:使用哪个集群、哪个用户,以及默认哪个 Namespace?
默认配置文件位置:
~/.kube/config也可以通过环境变量指定:
export KUBECONFIG=/path/to/config查看当前使用的 kubeconfig:
kubectl config view查看当前 Context:
kubectl config current-context查看所有 Context:
kubectl config get-contexts1.1 kubeconfig 的整体结构
一个典型的 kubeconfig 文件:
apiVersion: v1kind: Config
clusters: - name: dev-cluster cluster: server: https://192.168.1.100:6443 certificate-authority-data: BASE64_CA_CERT
users: - name: dev-user user: client-certificate-data: BASE64_CLIENT_CERT client-key-data: BASE64_CLIENT_KEY
contexts: - name: dev-context context: cluster: dev-cluster user: dev-user namespace: dev
current-context: dev-context重点看四个部分:
| 字段 | 作用 |
|---|---|
| clusters | 定义 Kubernetes 集群连接信息 |
| users | 定义客户端身份认证信息 |
| contexts | 将集群、用户和 Namespace 组合起来 |
| current-context | 指定当前默认使用的 Context |
可以把它们理解成:
- Cluster:服务器地址。
- User:登录凭据。
- Context:登录哪个服务器、使用哪个身份、默认进入哪个 Namespace。
2. clusters:集群连接信息
2.1 Cluster 配置
Cluster 用来定义 Kubernetes API Server 的连接信息。
例如:
clusters: - name: production cluster: server: https://10.0.0.10:6443 certificate-authority: /etc/kubernetes/pki/ca.crt两个重要字段:
server
API Server 的访问地址:
server: https://10.0.0.10:6443默认情况下,kubeadm 集群 API Server 监听的端口通常是 6443。
certificate-authority
指定 CA 证书文件路径。
certificate-authority: /etc/kubernetes/pki/ca.crt也可以将证书内容直接 Base64 编码后放入:
certificate-authority-data: LS0tLS1CRUdJTi...注意:
CA 证书用于验证 API Server 的服务端身份,避免客户端连接到伪造的 API Server。
2.2 查看当前集群信息
kubectl config get-clusters查看配置:
kubectl config view只查看当前使用的集群信息:
kubectl config view --minify如果想查看完整证书数据:
kubectl config view --raw注意:--raw 可能显示私钥和 Token,不要随意将输出分享给他人。
3. users:客户端身份凭据
User 定义客户端访问 Kubernetes API Server 时使用的身份凭据。
常见方式:
| 认证方式 | kubeconfig 配置 |
|---|---|
| 客户端证书 | client-certificate、client-key |
| Token | token |
| 外部认证插件 | exec |
| 用户名密码 | username、password(不推荐,现代 Kubernetes 不支持通用的内置密码认证) |
3.1 客户端证书认证
例如:
users: - name: alice user: client-certificate: /home/alice/alice.crt client-key: /home/alice/alice.key这里:
alice.crt:客户端证书。alice.key:客户端私钥。
API Server 通过配置的 CA 验证客户端证书,并从证书信息中识别用户身份。
例如证书 Subject:
CN=aliceO=developers对应的身份信息:
username: alicegroups: - developers - system:authenticated3.2 Token 认证
如果使用 ServiceAccount Token,也可以这样配置:
users: - name: app-user user: token: eyJhbGciOiJSUzI1NiIs...实际生产中不建议将长期有效的敏感 Token 明文写入共享 kubeconfig。
对于需要动态获取凭据的环境,可以使用 exec 插件。
3.3 exec 认证插件
某些企业集群使用外部身份提供商,例如云厂商 IAM 或 OIDC 身份系统。
这时 kubeconfig 可以通过 exec 调用外部程序获取凭据。
例如:
users: - name: cloud-user user: exec: apiVersion: client.authentication.k8s.io/v1 command: example-auth interactiveMode: Never args: - get-token执行 kubectl 时,客户端会调用指定程序获取凭据。
外部程序需要返回符合 Kubernetes ExecCredential 规范的数据。
例如:
{ "apiVersion": "client.authentication.k8s.io/v1", "kind": "ExecCredential", "status": { "token": "EXAMPLE_TOKEN" }}这样可以避免在 kubeconfig 中长期保存静态 Token。
4. contexts:集群、用户与命名空间组合
这是 kubeconfig 最重要的部分之一。
Context 用于组合:
- Cluster
- User
- Namespace
例如:
contexts: - name: dev-context context: cluster: dev-cluster user: dev-user namespace: dev它表示:
使用 dev-user 身份,访问 dev-cluster 集群,默认操作 dev Namespace。
再创建一个生产环境 Context:
contexts: - name: prod-context context: cluster: prod-cluster user: prod-user namespace: production现在就有了两个访问上下文。
flowchart LR
D["dev-context"] --> DC["Cluster: dev-cluster"]
D --> DU["User: dev-user"]
D --> DN["Namespace: dev"]
P["prod-context"] --> PC["Cluster: prod-cluster"]
P --> PU["User: prod-user"]
P --> PN["Namespace: production"]
Context 是引用关系,不是独立的身份或权限。实际权限由集群端认证和授权机制决定。
4.1 查看所有 Context
kubectl config get-contexts输出示例:
CURRENT NAME CLUSTER AUTHINFO NAMESPACE* dev-context dev-cluster dev-user dev prod-context prod-cluster prod-user production4.2 切换 Context
切换到开发环境:
kubectl config use-context dev-context切换到生产环境:
kubectl config use-context prod-context查看当前 Context:
kubectl config current-context4.3 修改 Context 默认 Namespace
kubectl config set-context dev-context \ --namespace=testing之后使用该 Context 执行:
kubectl get pods默认就会访问 testing Namespace。
也可以临时指定 Namespace:
kubectl get pods -n production临时指定不会修改当前 Context。
5. kubectl config 常用命令
| 命令 | 作用 |
|---|---|
kubectl config view | 查看 kubeconfig |
kubectl config current-context | 查看当前 Context |
kubectl config get-contexts | 查看所有 Context |
kubectl config get-clusters | 查看所有集群 |
kubectl config get-users | 查看所有用户 |
kubectl config use-context | 切换 Context |
kubectl config set-context | 创建或修改 Context |
kubectl config set-cluster | 创建或修改集群配置 |
kubectl config set-credentials | 创建或修改用户凭据 |
kubectl config delete-context | 删除 Context |
kubectl config rename-context | 重命名 Context |
kubectl config unset | 删除指定配置字段 |
例如创建一个 Context:
kubectl config set-context dev-context \ --cluster=dev-cluster \ --user=dev-user \ --namespace=dev注意:这条命令不会自动创建对应的 Cluster 或 User。它们需要提前存在。
创建集群配置:
kubectl config set-cluster dev-cluster \ --server=https://192.168.1.100:6443 \ --certificate-authority=/etc/kubernetes/pki/ca.crt \ --embed-certs=true--embed-certs 将 CA 证书内容嵌入 kubeconfig。
创建证书用户:
kubectl config set-credentials dev-user \ --client-certificate=/home/alice/alice.crt \ --client-key=/home/alice/alice.key \ --embed-certs=true这会把客户端证书和私钥嵌入 kubeconfig。生成的 kubeconfig 包含私钥,应当作为敏感凭据保护。
如果需要使用 Token:
kubectl config set-credentials app-user \ --token='TOKEN_VALUE'这些命令会修改当前 kubeconfig 文件,操作前应注意备份。
6. 多集群管理与 kubeconfig 合并
这是生产环境非常常见的场景。
假设你有三套集群:
| 集群 | 地址 | 用途 |
|---|---|---|
| dev | 192.168.1.100:6443 | 开发环境 |
| test | 192.168.1.200:6443 | 测试环境 |
| prod | 10.0.0.100:6443 | 生产环境 |
每套集群可能分别提供一份 kubeconfig。
例如:
flowchart LR
K["~/.kube/"] --> C["config"]
K --> D["dev-config"]
K --> T["test-config"]
K --> P["prod-config"]
6.1 临时使用不同 kubeconfig
使用开发环境:
kubectl --kubeconfig="$HOME/.kube/dev-config" get pods使用测试环境:
kubectl --kubeconfig="$HOME/.kube/test-config" get pods使用生产环境:
kubectl --kubeconfig="$HOME/.kube/prod-config" get pods这种方式不会修改默认 kubeconfig。
6.2 合并多个 kubeconfig
如果希望统一管理,可以使用 KUBECONFIG 环境变量。
Linux:
export KUBECONFIG=~/.kube/dev-config:~/.kube/test-config:~/.kube/prod-configWindows PowerShell 使用分号分隔:
$env:KUBECONFIG="$HOME\.kube\dev-config;$HOME\.kube\test-config;$HOME\.kube\prod-config"查看合并结果:
kubectl config get-contexts此时可以看到三个集群的 Context。
需要注意:
- 多个 kubeconfig 通过环境变量合并时,配置项按合并规则处理。
- 如果多个文件存在相同名称的 Cluster、User 或 Context,可能发生命名冲突。
- 多文件合并通常不应直接视为可写的单一配置文件。
- 需要持久化合并结果时,可以显式使用
kubectl config view --flatten --raw,但要妥善保护其中的敏感凭据。
例如:
kubectl config view --merge --flatten --raw > ~/.kube/merged-config设置:
export KUBECONFIG=~/.kube/merged-config注意:--raw 会暴露敏感凭据,生成的文件应限制访问权限。
chmod 600 ~/.kube/merged-config6.3 实际生产中的多集群切换
建议使用明确的 Context 名称:
company-devcompany-testcompany-prod切换:
kubectl config use-context company-dev执行生产环境操作之前:
kubectl config current-context确认当前环境。
还可以给命令增加显式 Context:
kubectl --context=company-prod get pods -A这样不依赖当前默认 Context,可以降低误操作风险。
7. kubeadm 集群中的 kubeconfig
使用 kubeadm 部署 Kubernetes 后,控制平面节点通常会生成多个 kubeconfig 文件。
查看:
ls -l /etc/kubernetes/常见结构:
flowchart LR
K["/etc/kubernetes/"] --> A["admin.conf"]
K --> C["controller-manager.conf"]
K --> S["scheduler.conf"]
K --> L["kubelet.conf"]
K --> M["manifests/"]
K --> P["pki/"]
几个重要文件:
| 文件 | 用途 |
|---|---|
| admin.conf | 管理员 kubectl 访问集群 |
| controller-manager.conf | Controller Manager 访问 API Server |
| scheduler.conf | Scheduler 访问 API Server |
| kubelet.conf | kubelet 访问 API Server |
7.1 admin.conf
这是 kubeadm 集群中非常重要的 kubeconfig。
查看:
kubectl config view \ --kubeconfig=/etc/kubernetes/admin.conf可以看到:
- API Server 地址。
- 集群 CA 证书。
- 管理员客户端证书。
- 当前 Context。
通常可以将它复制到管理员用户的家目录:
mkdir -p ~/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/config
sudo chown "$(id -u):$(id -g)" ~/.kube/config
chmod 600 ~/.kube/config之后就可以直接执行:
kubectl get nodes注意:admin.conf 包含高权限访问凭据,不能随意分发给开发人员,也不应提交到 Git 仓库。
7.2 kubelet.conf
kubelet 是运行在每个 Node 上的重要组件。
它需要与 API Server 通信:
- 注册 Node。
- 上报 Node 状态。
- 获取 Pod 相关信息。
- 更新节点运行状态。
kubelet 使用自己的 kubeconfig:
/etc/kubernetes/kubelet.conf通常对应的身份类似:
system:node:<node-name>并属于:
system:nodes例如:
system:node:worker-01Kubernetes 还通过 Node Authorizer 和 NodeRestriction 等机制,限制节点身份能够访问的资源范围。
7.3 Scheduler 与 Controller Manager
它们同样需要访问 API Server。
Scheduler:
/etc/kubernetes/scheduler.confController Manager:
/etc/kubernetes/controller-manager.conf它们使用独立身份执行各自的控制平面任务,而不是所有组件共用管理员身份。
这体现了一个重要的生产设计原则:
不同组件应该使用不同的身份,并且只拥有完成自身职责所需的权限。
8. kubeconfig 与证书认证的关系
假设 Alice 需要访问 Kubernetes 集群。
她获得以下文件:
alice.crtalice.keyca.crt分别代表:
- alice.crt:客户端证书。
- alice.key:客户端私钥。
- ca.crt:集群 CA 证书。
配置 kubeconfig:
apiVersion: v1kind: Config
clusters: - name: kubernetes cluster: server: https://192.168.1.100:6443 certificate-authority: ca.crt
users: - name: alice user: client-certificate: alice.crt client-key: alice.key
contexts: - name: alice-dev context: cluster: kubernetes user: alice namespace: dev
current-context: alice-dev完整访问过程:
flowchart TB
K["kubectl 读取 kubeconfig"] --> C["Context 组合身份与集群"]
C --> CL["Cluster<br/>API Server 地址与 CA"]
C --> U["User<br/>客户端证书和私钥"]
CL --> T["建立 TLS 连接"]
U --> T
T --> A["API Server 验证客户端身份"]
A --> R["RBAC 授权<br/>检查 Alice 对 dev Namespace 的操作权限"]
R --> O["返回 API 请求结果"]
这里要记住:
- kubeconfig 负责告诉客户端如何连接、如何认证。
- API Server 负责验证身份。
- RBAC 负责检查权限。
- Context 中的 Namespace 只是默认请求范围,不代表自动获得该 Namespace 的权限。
9. kubeconfig 安全管理
kubeconfig 本身就是一个非常敏感的配置文件。
因为它可能包含:
- 客户端私钥。
- 身份认证 Token。
- 外部认证插件信息。
- 集群 API Server 地址。
如果 kubeconfig 泄露,攻击者可能直接使用其中的凭据访问集群。
9.1 文件权限
chmod 600 ~/.kube/config查看:
ls -l ~/.kube/config建议:
-rw------- 1 user user ...只有文件所有者能够读取和修改。
9.2 不要提交到 Git
错误做法:
git add ~/.kube/config正确做法:
.kube/*.kubeconfigadmin.conf还需要注意:如果 kubeconfig 已经提交到 Git,即使之后删除文件,也不代表历史版本中的凭据已经消失,应当及时吊销或轮换相关凭据。
9.3 使用独立身份
不要所有人都使用:
kubernetes-admin应该为不同角色分配不同身份:
alice-devbob-testops-adminmonitoring-sa再通过 RBAC 授予对应权限。
9.4 生产环境避免共享私钥
例如:
alice.crtalice.key不应该复制给 Bob 使用。
否则审计时很难确认到底是谁执行了操作。
应该做到:
- 每个人独立身份。
- 每个身份独立凭据。
- 每个身份独立权限。
- 定期轮换凭据。
- 对敏感操作进行审计。
10. 常见问题与故障排查
10.1 Unable to connect to the server
例如:
The connection to the server 192.168.1.100:6443 was refused可能原因:
- API Server 没有启动。
- IP 地址或端口配置错误。
- 网络不通。
- 防火墙阻断。
排查:
kubectl config view --minifync -zv 192.168.1.100 644310.2 x509: certificate signed by unknown authority
例如:
x509: certificate signed by unknown authority可能原因:
- CA 证书配置错误。
- 使用了错误的集群 CA。
- 证书文件损坏。
- 证书链不可信。
排查:
kubectl config view --raw --minify重点检查:
certificate-authority-data: ...或者:
certificate-authority: /path/to/ca.crt10.3 You must be logged in to the server
例如:
error: You must be logged in to the server (Unauthorized)可能原因:
- Token 过期。
- 客户端证书过期。
- 身份认证配置错误。
- 外部认证插件失效。
重点排查:
kubectl config view --minify如果使用客户端证书,还可以检查:
openssl x509 -in alice.crt -noout -subject -dates10.4 Forbidden
例如:
Error from server (Forbidden)说明通常已经通过身份认证,但没有相应操作权限。
排查:
kubectl auth can-i get pods -n dev进一步检查 Role 和 RoleBinding。