3. 证书轮换机制:kubeadm 证书自动轮换、手动轮换与有效期检查

Kubernetes 集群中,TLS 证书是组件间通信的信任基石。kubeadm 部署的集群默认证书有效期为 1 年。若证书过期而未及时轮换,将导致 kube-apiserver 无法验证 kubelet、controller-manager 等组件的身份,进而引发 Deployment 副本数异常(如节点 NotReady、Pod 无法调度)。本节深入剖析 kubeadm 的证书轮换机制,涵盖自动轮换、手动轮换及有效期检查方法。

3.1 证书体系概览

kubeadm 生成的证书主要分为以下几类:

证书文件 用途 默认有效期 轮换方式
ca.crt / ca.key 集群根 CA,签发其他证书 10 年 手动(极少轮换)
apiserver.crt / apiserver.key kube-apiserver 对外服务 1 年 自动 / 手动
apiserver-kubelet-client.crt apiserver 连接 kubelet 1 年 自动 / 手动
front-proxy-ca.crt / front-proxy-client.crt API 聚合层代理 1 年 自动 / 手动
etcd/ca.crt / etcd/server.crt etcd 集群通信 1 年 手动(推荐)
kubelet.crt kubelet 服务端证书 1 年 自动(kubelet 证书轮换)
关键认知: 证书轮换的核心目标是确保 apiserver.crt、apiserver-kubelet-client.crt 及 kubelet.crt 在过期前完成更新。一旦这些证书失效,kube-controller-manager 将无法通过 apiserver 与 kubelet 通信,导致 Deployment 控制器无法更新副本状态,表现为副本数卡在旧值或持续震荡。

3.2 自动轮换机制(kubeadm v1.15+)

kubeadm 在 v1.15 版本后引入了 证书自动轮换 功能,通过 kubeadm certs renew 命令或 kube-controller-manager 的 --cluster-signing-duration 参数实现。自动轮换分为两个层面:

  • 控制平面证书自动轮换: 由 kubeadm certs renew 命令触发,可配合 cron 作业定期执行。
  • kubelet 客户端证书自动轮换: 由 kubelet 内置的 RotateKubeletServerCertificate 特性门控控制,kubelet 在证书过期前自动向 apiserver 发起 CSR 请求。
最佳实践: 在生产集群中,建议将 kubeadm certs renew 配置为每月执行的 cron 任务,同时确保 kubelet 的 serverTLSBootstrap: true 已启用,以实现 kubelet 证书的自动续期。

3.3 手动轮换流程

当自动轮换失效(如证书已过期、kubeadm 版本过低)或需要紧急修复时,需执行手动轮换。以下是标准步骤:

  1. 备份现有证书: cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak
  2. 检查证书有效期: 使用 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
  3. 执行轮换: kubeadm certs renew all(或指定证书名)
  4. 重启控制平面组件: 通过 docker restart 或 systemctl restart kubelet 使新证书生效
  5. 更新 kubeconfig: kubeadm init phase kubeconfig all --config=kubeadm-config.yaml
  6. 验证: openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep "Not After"
注意: 手动轮换后,必须重启 kube-apiserver、kube-controller-manager、kube-scheduler 以及所有 kubelet 进程。若只更新证书而不重启组件,新证书不会被加载,集群仍会使用旧证书通信,导致轮换失败。

3.4 证书有效期检查方法

运维人员需定期检查证书有效期,避免因证书过期引发集群故障。以下是三种常用检查方式:

方法 命令 / 工具 适用场景
OpenSSL 直接检查 openssl x509 -in <cert> -noout -dates 单节点、快速验证
kubeadm 内置命令 kubeadm certs check-expiration kubeadm 集群统一检查
Prometheus + 告警 node_certificate_expiry_seconds 指标 大规模集群、自动化监控

推荐使用 kubeadm certs check-expiration,其输出格式清晰,可直接显示每个证书的剩余天数:

# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Nov 10, 2025 06:12 UTC   364d                                    no
apiserver                  Nov 10, 2025 06:12 UTC   364d            ca                      no
apiserver-kubelet-client   Nov 10, 2025 06:12 UTC   364d            ca                      no
controller-manager.conf    Nov 10, 2025 06:12 UTC   364d                                    no
front-proxy-client         Nov 10, 2025 06:12 UTC   364d            front-proxy-ca          no
kubelet.conf               Nov 10, 2025 06:12 UTC   364d                                    no
scheduler.conf             Nov 10, 2025 06:12 UTC   364d                                    no
故障排查提示: 当 Deployment 副本数异常且怀疑证书问题时,优先执行 kubeadm certs check-expiration。若发现证书已过期或剩余时间不足 30 天,应立即执行 kubeadm certs renew all 并重启组件。同时检查 kubelet 日志(journalctl -u kubelet -f)中是否有 certificate has expired 或 x509: certificate is valid for 错误。

3.5 证书轮换流程示意图

下图展示了从证书过期检测到轮换完成的完整流程,以及各组件间的依赖关系:

kubeadm 证书轮换流程 kubeadm 证书轮换流程 1. 证书过期检测 2. 备份证书目录 3. kubeadm certs renew 4. 重启控制平面组件 5. 更新 kubeconfig 6. 验证证书有效期 ✅ 轮换成功,集群恢复 ❌ 失败,回滚备份 回滚 ⚠️ 关键检查点 • 重启后检查 kubelet 日志 • 验证 Deployment 副本数恢复

3.6 证书轮换与 Deployment 副本数的关联

证书轮换失败如何导致 Deployment 副本数异常?其根本链路如下:

  1. apiserver 证书过期 → kube-controller-manager 无法通过 HTTPS 与 apiserver 通信。
  2. kubelet 证书过期 → apiserver 无法验证 kubelet 身份,kubelet 被标记为 NotReady。
  3. 节点 NotReady → kube-scheduler 无法将 Pod 调度到该节点。
  4. Deployment 控制器 尝试创建新 Pod 以匹配期望副本数,但调度失败 → 副本数显示为 0/3 或 1/3 等异常状态。
  5. kube-controller-manager 日志 中出现 Failed to update status 或 connection refused 错误。
快速定位: 当遇到 Deployment 副本数异常时,执行以下三步排查:
1. kubectl get nodes 检查节点状态。
2. kubeadm certs check-expiration 检查证书有效期。
3. journalctl -u kube-controller-manager -n 50 | grep -i certificate 检查控制器日志。

3.7 证书轮换策略对比

策略 优点 缺点 推荐场景
自动轮换(cron + kubeadm) 无需人工干预,降低遗忘风险 需额外配置 cron 任务,依赖 kubeadm 版本 生产集群、大规模部署
手动轮换(按需执行) 可控性强,可结合变更窗口 易遗漏,需人工检查有效期 测试环境、小规模集群
证书管理工具(cert-manager) 支持自动签发、续期、吊销 引入额外组件,增加复杂度 需要自定义证书策略的集群

无论采用哪种策略,定期检查证书有效期 是避免 Deployment 副本数异常的第一道防线。建议将证书检查纳入日常巡检脚本,并在证书剩余时间低于 30 天时触发告警。