2. Kubernetes 证书体系基础:CA证书、服务证书、kubelet证书、etcd证书的作用与生命周期

Kubernetes 集群的安全通信建立在多层 PKI(公钥基础设施)之上。理解各类证书的角色、签发关系及生命周期,是进行证书轮换与故障恢复的前提。本章从根 CA 出发,逐层拆解集群中四类核心证书的职责与时效特征。

2.1 证书体系全景:分层信任模型

Kubernetes 采用两级 CA 架构:集群根 CA 和前端代理 CA(可选),但生产环境通常共用同一根 CA 签发所有组件证书。下图展示了证书分层与通信关系:

Kubernetes 证书分层信任模型 集群根 CA (ca.crt) kube-apiserver 服务证书 (server.crt) etcd 集群 peer/server/client 证书 kubelet 服务+客户端证书 kube-controller-manager 客户端证书 kube-scheduler 客户端证书 kube-proxy 客户端证书 kubelet (客户端) 向 API Server 认证 说明:所有证书均由根 CA 签发,形成“根 CA → 中间层 → 叶子节点”的信任链。kubelet 同时持有服务端和客户端证书,是唯一双向角色。

2.2 四类证书的作用与签发关系

证书类型 持有组件 核心作用 签发者 常见文件
CA 证书 所有组件(信任锚点) 签发其他所有证书;验证对端身份 自签发(集群初始化时生成) ca.crt, ca.key
API Server 服务证书 kube-apiserver 对外提供 HTTPS 服务;客户端(kubectl、kubelet、controller)验证服务端身份 集群 CA apiserver.crt, apiserver.key
kubelet 证书 kubelet(每个节点) 服务端:kubelet 监听端口;客户端:向 API Server 注册并上报状态 集群 CA 或 kubelet 证书签名请求(CSR)自动签发 kubelet.crt, kubelet.key
etcd 证书 etcd 集群成员 服务端:etcd 节点间 gRPC 通信;客户端:API Server 访问 etcd 集群 CA(通常独立 etcd CA 或共用) etcd-server.crt, etcd-peer.crt, etcd-client.crt

关键区别:API Server 服务证书仅用于服务端身份证明;kubelet 证书是唯一同时承担服务端(kubelet API)和客户端(向 API Server 发起请求)双重角色的证书;etcd 证书则分为 peer(节点间)、server(客户端访问)、client(API Server 访问)三种子类型。

2.3 证书生命周期与默认有效期

Kubernetes 各组件证书的默认有效期因签发方式和集群版本而异。下表汇总了常见场景下的生命周期参数:

证书类型 默认有效期 轮换触发条件 自动轮换支持
集群根 CA 10 年(kubeadm 默认) 手动轮换(极少操作) 否(需手动更新所有子证书)
API Server 服务证书 1 年(kubeadm 默认) 到期前 90 天(kubeadm 自动检查) kubeadm 支持 kubeadm certs renew
kubelet 证书 1 年(kubeadm 默认) 到期前 30 天(kubelet 自动发起 CSR) 是(kubelet 证书轮换特性)
etcd 证书 1 年(kubeadm 默认) 到期前 90 天(kubeadm 自动检查) kubeadm 支持 kubeadm certs renew
kube-controller-manager / kube-scheduler 客户端证书 1 年(kubeadm 默认) 到期前 90 天 kubeadm 支持

生命周期管理要点:

  • 根 CA 有效期最长(10 年),但一旦轮换,所有子证书必须重新签发,属于高风险操作。
  • kubelet 证书是唯一支持自动 CSR 轮换的组件,但需在 kubelet 配置中启用 rotateCertificates: true。
  • etcd 证书轮换需按节点逐个进行,且必须保证集群多数节点在线,否则可能导致 etcd 集群分裂。
  • API Server 证书轮换后,所有客户端(kubectl、kubelet、controller)必须重新加载信任链,通常需要重启相关 Pod 或进程。

2.4 证书文件路径与命名规范

以 kubeadm 部署的集群为例,证书文件默认存放在各节点的 /etc/kubernetes/pki/ 目录下:

/etc/kubernetes/pki/
├── ca.crt                  # 集群根 CA 证书(公钥)
├── ca.key                  # 集群根 CA 私钥(⚠️ 最高机密)
├── apiserver.crt           # API Server 服务证书
├── apiserver.key           # API Server 服务私钥
├── apiserver-kubelet-client.crt  # API Server 访问 kubelet 的客户端证书
├── apiserver-kubelet-client.key
├── front-proxy-ca.crt      # 前端代理 CA(可选)
├── front-proxy-client.crt  # 前端代理客户端证书
├── etcd/
│   ├── ca.crt              # etcd CA 证书
│   ├── ca.key              # etcd CA 私钥
│   ├── server.crt          # etcd 服务端证书
│   ├── server.key
│   ├── peer.crt            # etcd 节点间通信证书
│   ├── peer.key
│   ├── healthcheck-client.crt  # etcd 健康检查客户端证书
│   └── healthcheck-client.key
└── sa.key / sa.pub         # Service Account 密钥对(非证书,用于 JWT 签名)

⚠️ 安全警告:CA 私钥(ca.key、etcd/ca.key)是集群安全的根基。一旦泄露,攻击者可签发任意证书,完全接管集群。生产环境中应使用硬件安全模块(HSM)或密钥管理服务(KMS)保护,并严格限制文件权限为 0600。

2.5 证书过期对集群的影响

不同证书过期会导致不同的故障模式。理解这些模式有助于在升级前制定证书检查策略:

过期证书 故障表现 影响范围 恢复难度
根 CA 所有组件 TLS 握手失败;kubectl 无法连接集群 全局 高(需重建信任链)
API Server 服务证书 客户端报 x509: certificate has expired or is not yet valid 全局(所有 API 调用中断) 中(kubeadm renew 后重启组件)
kubelet 证书 节点状态变为 NotReady;kubectl get nodes 显示节点不可达 单节点 低(自动 CSR 或手动签发)
etcd 证书 etcd 集群脑裂;API Server 无法读写 etcd;Pod 调度异常 全局(数据面中断) 高(需逐个节点轮换并验证成员关系)

升级前检查建议:在集群升级前,使用 kubeadm certs check-expiration 检查所有证书剩余有效期。对于剩余不足 90 天的证书,优先执行轮换再启动升级流程,避免升级过程中证书过期导致回滚困难。

2.6 证书轮换的基本流程(概念层)

证书轮换的核心步骤不因组件而异,但不同证书的轮换顺序和重启要求不同。下图展示了通用轮换流程:

证书轮换通用流程 1. 检查证书状态 kubeadm certs check-expiration 2. 生成新证书 kubeadm certs renew <name> 3. 分发新证书 scp / 配置管理工具 4. 重启组件 systemctl restart / Pod 滚动 5. 验证通信 kubectl get nodes / etcdctl endpoint health 6. 清理旧证书 备份后删除旧 .crt/.key 注意:etcd 证书轮换必须按节点逐个执行,且每次轮换后需确认集群成员状态(etcdctl member list)正常, 再操作下一个节点。API Server 和 kubelet 证书轮换后需重启对应 Pod 或 systemd 服务。

2.7 证书与 Pod 调度的隐性关联

证书状态直接影响 Pod 调度决策,这种关联在升级场景中尤为关键:

  • kubelet 证书过期 → 节点 NotReady → 调度器将 Pod 驱逐:当 kubelet 证书过期,节点状态变为 NotReady,调度器会在 pod-eviction-timeout(默认 5 分钟)后将 Pod 标记为 Terminating,并调度到其他可用节点。
  • etcd 证书过期 → API Server 不可用 → 调度器停止工作:etcd 是集群的持久化存储,证书过期导致 API Server 无法读写 etcd,调度器无法获取节点信息和 Pod 状态,所有调度决策暂停。
  • API Server 证书过期 → 所有客户端连接失败 → 调度器无法注册:kube-scheduler 作为 API Server 的客户端,证书过期后无法通过 TLS 握手,调度器 Pod 会持续 CrashLoopBackOff。

升级协同策略:在集群升级前,先执行证书轮换并验证所有节点 Ready、etcd 集群健康,再启动控制面组件升级。这可以避免证书过期与版本不兼容问题叠加,降低故障恢复复杂度。