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。信任链如下:

  1. 根 CA 自签生成 ca.crt(公钥)和 ca.key(私钥)。
  2. 根 CA 使用自己的私钥为每个组件签发组件证书(服务端或客户端)。
  3. 组件证书中携带签发者信息(Issuer = 根 CA 的 Subject)。
  4. 验证时,验证方使用本地信任的 ca.crt 检查组件证书的签名是否匹配。
K8s 证书信任链与双向 TLS 握手 K8s 证书信任链与双向 TLS 握手 根 CA (ca.crt / ca.key) 签发 API Server 服务端证书 (apiserver.crt) 签发 kubelet 客户端证书 (kubelet-client.crt) 双向 TLS 握手验证过程 ① kubelet 连接 API Server ② API Server 出示服务端证书 ③ kubelet 用 ca.crt 验证服务端证书 ④ kubelet 出示客户端证书 ⑤ API Server 用 ca.crt 验证客户端证书 ⑥ 提取 CN → RBAC 鉴权

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
证书字段到 RBAC 映射流程 证书字段 → RBAC 映射流程 客户端证书 CN=system:kube-scheduler O=system:kube-scheduler API Server 提取 User = CN Group = O RBAC 鉴权 匹配 ClusterRole 允许/拒绝操作 轮换影响说明 • 证书轮换后 CN/O 字段不变 → RBAC 绑定无需修改 • 若轮换时错误修改了 CN/O → 用户/组变更 → 权限丢失 → 调度组件无法通过鉴权 • 排查时使用 openssl x509 -in client.crt -text -noout 检查 CN/O 是否与预期一致

2.6 证书轮换的常见触发场景

在 K8s 集群生命周期中,以下场景会触发证书轮换:

  • 证书到期:kubeadm 默认签发 1 年有效期的证书,到期前需要手动或自动轮换。
  • 集群升级:K8s 版本升级时,CA 或组件证书的签名算法、SAN 要求可能变化。
  • 节点重加入:节点被重置后重新加入集群,需要签发新的 kubelet 证书。
  • 安全合规:私钥泄露或安全策略要求定期更换证书。
调度异常关联:当 kube-scheduler 或 kube-controller-manager 的客户端证书过期或 CN 不匹配时,它们将无法通过 API Server 的 RBAC 鉴权,导致 Pod 调度失败、控制器无法创建/更新资源。这是证书轮换失败影响调度稳定性的直接路径。