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 版本过低)或需要紧急修复时,需执行手动轮换。以下是标准步骤:
- 备份现有证书:
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak - 检查证书有效期: 使用
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates - 执行轮换:
kubeadm certs renew all(或指定证书名) - 重启控制平面组件: 通过
docker restart或systemctl restart kubelet使新证书生效 - 更新 kubeconfig:
kubeadm init phase kubeconfig all --config=kubeadm-config.yaml - 验证:
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 证书轮换流程示意图
下图展示了从证书过期检测到轮换完成的完整流程,以及各组件间的依赖关系:
3.6 证书轮换与 Deployment 副本数的关联
证书轮换失败如何导致 Deployment 副本数异常?其根本链路如下:
- apiserver 证书过期 → kube-controller-manager 无法通过 HTTPS 与 apiserver 通信。
- kubelet 证书过期 → apiserver 无法验证 kubelet 身份,kubelet 被标记为
NotReady。 - 节点 NotReady → kube-scheduler 无法将 Pod 调度到该节点。
- Deployment 控制器 尝试创建新 Pod 以匹配期望副本数,但调度失败 → 副本数显示为
0/3或1/3等异常状态。 - kube-controller-manager 日志 中出现
Failed to update status或connection refused错误。
快速定位: 当遇到 Deployment 副本数异常时,执行以下三步排查:
1.
2.
3.
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 天时触发告警。