2. K8s 证书体系基础:K8s 中 TLS 证书的作用、CA 证书、服务端证书、客户端证书、kubeconfig 中的证书
2.1 为什么 Kubernetes 需要 TLS 证书
Kubernetes 控制面组件(API Server、etcd、kubelet、scheduler、controller-manager)之间以及组件与客户端(kubectl、Pod)之间的所有通信,默认都要求双向 TLS 加密。证书体系解决了三个核心问题:
- 身份认证:确认通信对方的身份,防止中间人攻击。
- 传输加密:确保 API 请求和响应在传输过程中不被窃听或篡改。
- 授权基础:证书中的 CN(Common Name)或组织(O)字段通常映射到 RBAC 用户或组,是权限控制的起点。
排查视角:证书轮换失败时,最常见的现象是 API Server 拒绝来自 kubelet 或 kube-controller-manager 的请求,错误日志中会出现
x509: certificate has expired 或 x509: certificate signed by unknown authority。理解证书角色是定位这类问题的第一步。
2.2 证书体系核心角色
K8s 证书体系分为三个层次:CA 证书(签发者)、服务端证书(提供服务的组件)、客户端证书(调用服务的组件)。
| 角色 | 典型文件 | 持有者 | 用途 |
|---|---|---|---|
| CA 证书 | ca.crt / ca.key |
集群信任根(通常由 kubeadm 或 PKI 系统管理) | 签发所有其他证书;验证对端证书是否由本 CA 签发 |
| 服务端证书 | apiserver.crt / apiserver.key |
API Server、kubelet(监听端口时) | 向客户端证明自己是合法的服务端;包含 SAN(Subject Alternative Name) |
| 客户端证书 | kubelet-client.crt / kubelet-client.key |
kubelet(主动请求 API Server 时)、kube-controller-manager、kube-scheduler | 向服务端证明自己是合法的客户端;CN 字段映射为用户名 |
| kubeconfig 证书 | 嵌入在 ~/.kube/config 或 /etc/kubernetes/admin.conf 中 |
管理员、kubectl、组件 | 将客户端证书和 CA 证书打包为连接配置,供外部访问集群 |
关键区别:服务端证书用于“被连接”,客户端证书用于“主动连接”。同一个组件(如 kubelet)可能同时持有两种证书——监听端口时用服务端证书,请求 API Server 时用客户端证书。
2.3 证书签发与信任链
K8s 采用自签名 CA 模式,不依赖外部公共 CA。信任链如下:
- 根 CA 自签生成
ca.crt(公钥)和ca.key(私钥)。 - 根 CA 使用自己的私钥为每个组件签发组件证书(服务端或客户端)。
- 组件证书中携带签发者信息(Issuer = 根 CA 的 Subject)。
- 验证时,验证方使用本地信任的
ca.crt检查组件证书的签名是否匹配。
2.4 kubeconfig 中的证书结构
kubeconfig 文件(如 admin.conf、kubelet.conf)是集群访问的“连接配置包”,内部以 YAML 格式存储了三个关键证书字段:
| kubeconfig 字段 | 对应证书角色 | 内容说明 |
|---|---|---|
clusters[].cluster.certificate-authority-data |
CA 证书(base64) | 用于验证服务端证书的信任根 |
users[].user.client-certificate-data |
客户端证书(base64) | 向 API Server 证明用户身份 |
users[].user.client-key-data |
客户端私钥(base64) | 客户端证书对应的私钥,用于签名 TLS 握手 |
典型 kubeconfig 片段示例:
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRV... # CA 证书 base64
server: https://192.168.1.100:6443
name: kubernetes
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRV... # 客户端证书 base64
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVk... # 客户端私钥 base64
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
轮换排查要点:kubeconfig 中的证书是静态嵌入的,不会自动更新。当 CA 或客户端证书轮换后,必须同步更新所有 kubeconfig 文件中的
certificate-authority-data 和 client-certificate-data。否则即使组件证书已更新,kubectl 或组件仍会使用旧证书连接,导致 x509: certificate signed by unknown authority 错误。
2.5 证书与 RBAC 的映射关系
证书中的 CN(Common Name) 和 O(Organization) 字段直接映射到 Kubernetes 的 RBAC 系统:
- CN → 映射为用户名(User)。例如
CN=system:kube-controller-manager对应system:kube-controller-manager用户。 - O → 映射为用户所属组(Group)。例如
O=system:masters对应system:masters组,该组默认绑定cluster-admin角色。
常见组件证书的 CN/O 约定:
| 组件 | CN 字段 | O 字段 | RBAC 绑定 |
|---|---|---|---|
| kube-controller-manager | system:kube-controller-manager |
system:kube-controller-manager |
ClusterRole system:kube-controller-manager |
| kube-scheduler | system:kube-scheduler |
system:kube-scheduler |
ClusterRole system:kube-scheduler |
| kubelet(客户端) | system:node:<nodeName> |
system:nodes |
ClusterRole system:node |
| 管理员 | kubernetes-admin |
system:masters |
ClusterRoleBinding cluster-admin |
2.6 证书轮换的常见触发场景
在 K8s 集群生命周期中,以下场景会触发证书轮换:
- 证书到期:kubeadm 默认签发 1 年有效期的证书,到期前需要手动或自动轮换。
- 集群升级:K8s 版本升级时,CA 或组件证书的签名算法、SAN 要求可能变化。
- 节点重加入:节点被重置后重新加入集群,需要签发新的 kubelet 证书。
- 安全合规:私钥泄露或安全策略要求定期更换证书。
调度异常关联:当 kube-scheduler 或 kube-controller-manager 的客户端证书过期或 CN 不匹配时,它们将无法通过 API Server 的 RBAC 鉴权,导致 Pod 调度失败、控制器无法创建/更新资源。这是证书轮换失败影响调度稳定性的直接路径。