Kubernetes 证书体系基础:API Server、kubelet、etcd 之间的 TLS 通信与证书作用

在 Kubernetes 集群中,API Server、kubelet 和 etcd 是三个核心组件,它们之间的通信必须经过双向 TLS(mTLS)加密,以确保集群的控制面安全。证书轮换一旦出错,轻则导致组件间认证失败,重则引发控制器无法同步副本数,最终表现为 Deployment 副本数异常。理解这三者之间的证书关系,是定位此类故障的前提。

3.1 核心组件与通信链路

Kubernetes 控制面由以下关键组件构成,它们之间的 TLS 链路可归纳为三条:

通信链路 发起方 → 接收方 认证方式 关键证书
链路 A kubelet → API Server 双向 TLS kubelet 客户端证书 + API Server 服务端证书
链路 B API Server → etcd 双向 TLS API Server 客户端证书 + etcd 服务端证书
链路 C kubelet → kubelet(节点间) 双向 TLS kubelet 服务端证书 + 客户端证书
故障关联提示: 当 API Server 与 etcd 之间的证书过期或 CN 不匹配时,API Server 将无法读写集群状态,导致 Deployment Controller 无法更新 ReplicaSet 的期望副本数,从而引发副本数异常。

3.2 证书类型与作用

Kubernetes 使用 PKI(公钥基础设施)体系,每个组件持有不同的证书对。下表列出了与副本数异常排查最相关的证书:

证书名称 持有者 用途 常见轮换周期
ca.crt 所有组件 集群根证书,用于签发和验证其他证书 10 年(手动轮换)
apiserver.crt API Server 服务端证书,供 kubelet、kubectl、控制器连接 1 年
apiserver-kubelet-client.crt API Server 客户端证书,用于 API Server 主动连接 kubelet 1 年
etcd-server.crt etcd 服务端证书,供 API Server 连接 etcd 1 年
etcd-client.crt API Server 客户端证书,用于 API Server 向 etcd 发起请求 1 年
kubelet.crt kubelet 服务端证书,供 API Server 访问 kubelet 的 /metrics、/pods 等端点 1 年(自动轮换)

3.3 TLS 握手与证书验证流程

以 API Server → etcd 链路为例,证书验证过程如下:

  1. API Server 作为客户端,向 etcd 发起 TLS 连接请求。
  2. etcd 出示其服务端证书 etcd-server.crt,并附带证书链。
  3. API Server 使用本地 ca.crt 验证 etcd 服务端证书的签名、有效期、CN(Common Name)。
  4. API Server 出示其客户端证书 etcd-client.crt,证明自己的身份。
  5. etcd 使用本地 ca.crt 验证 API Server 客户端证书的有效性。
  6. 双向验证通过后,建立加密通信通道。
轮换陷阱: 如果只轮换了 etcd-server.crt 而未同步更新 API Server 上的 ca.crt,或者轮换后的证书 CN 与 etcd 的 --client-cert-auth 配置不匹配,API Server 将无法通过 etcd 的健康检查,导致整个控制面不可用。

3.4 证书体系架构图

下图展示了 API Server、kubelet、etcd 之间的证书分发与信任关系:

Kubernetes 证书体系:API Server / kubelet / etcd 信任关系 控制面节点 etcd 集群 工作节点 API Server apiserver.crt etcd etcd-server.crt kubelet kubelet.crt API Server 证书集 ca.crt apiserver.crt etcd-client.crt kubelet-client.crt etcd 证书集 ca.crt etcd-server.crt peer.crt kubelet 证书集 ca.crt kubelet.crt kubelet-client.crt mTLS etcd-client.crt mTLS kubelet-client.crt mTLS kubelet.crt ⚠ 证书轮换关键点 • 所有组件共享同一份 ca.crt,轮换 ca 需要全局更新 • API Server 同时持有服务端证书(apiserver.crt)和客户端证书(etcd-client.crt、kubelet-client.crt) • kubelet 证书支持自动轮换(kubelet-rook 特性),但 API Server 证书通常需要手动管理

3.5 证书轮换对副本数的影响路径

当证书轮换出现问题时,故障传递路径如下:

  • etcd 证书过期 → API Server 无法连接 etcd → 无法读取/写入 /registry/deployments 等关键路径 → Deployment Controller 无法同步期望副本数。
  • kubelet 服务端证书过期 → API Server 无法访问 kubelet 的 /pods 端点 → 节点状态异常 → 控制器将 Pod 标记为 Unknown → 触发 unhealthyPodEvictionPolicy 导致副本数波动。
  • API Server 服务端证书过期 → 所有客户端(kubectl、控制器、kubelet)无法连接 API Server → 整个控制面瘫痪,副本数无法更新。
排查建议: 当遇到 Deployment 副本数异常时,优先检查 /var/lib/kubelet/pki/ 和 /etc/kubernetes/pki/ 下的证书有效期。使用 openssl x509 -in <证书文件> -text -noout | grep -E "Not Before|Not After" 快速定位过期证书。

3.6 证书轮换的典型操作流程

以手动轮换 API Server 证书为例,标准步骤包括:

  1. 生成新的私钥和证书签名请求(CSR)。
  2. 使用集群 CA 签发新证书。
  3. 将新证书分发到所有控制面节点的 /etc/kubernetes/pki/ 目录。
  4. 重启 API Server 静态 Pod(或 kubelet 服务)。
  5. 验证 API Server 与 etcd、kubelet 的 TLS 握手是否正常。
  6. 监控 Deployment 副本数是否恢复稳定。
常见错误: 轮换 API Server 证书后未重启 kube-controller-manager 和 kube-scheduler,导致这些组件仍使用旧证书连接 API Server,引发间歇性认证失败。