4、证书轮换触发机制:kubeadm证书自动轮换、手动轮换、证书过期检测与告警
Kubernetes 集群中,kubeadm 部署的证书默认有效期为 1 年。证书轮换的触发机制分为 自动轮换、手动轮换 以及 过期检测与告警 三个维度。理解这些机制是保障节点通信兼容性的前提。
4.1 kubeadm 证书自动轮换
kubeadm 自 v1.15 版本起支持控制平面节点的证书自动轮换。该机制依赖 kubelet 的 RotateKubeletServerCertificate 特性,通过 CertificateSigningRequest (CSR) 流程实现。
核心原理: kubelet 在证书到期前 80% 的时间点自动发起 CSR 请求,由 controller-manager 中的
csrapproving 控制器自动批准,kubelet 获取新证书后替换旧证书。
自动轮换的适用范围与限制:
| 组件 | 是否支持自动轮换 | 说明 |
|---|---|---|
| kubelet 客户端证书 | ✅ 是 | kubelet 向 apiserver 认证的证书,自动轮换默认开启 |
| kubelet 服务端证书 | ✅ 是 | 需设置 serverTLSBootstrap: true,kubelet 自动申请 |
| apiserver 证书 | ❌ 否 | 需手动轮换或使用 kubeadm certs renew |
| etcd 证书 | ❌ 否 | 需手动轮换,etcd 成员证书变更需重启集群 |
| admin.conf / controller-manager.conf | ❌ 否 | 用户侧 kubeconfig 文件,需手动更新 |
运维建议: 自动轮换仅覆盖 kubelet 层面。控制平面核心组件(apiserver、etcd)的证书仍需纳入手动轮换计划,不可完全依赖自动机制。
4.2 手动轮换:kubeadm certs renew
对于不支持自动轮换的证书,kubeadm 提供 kubeadm certs renew 命令进行手动轮换。该命令会重新生成证书文件,但不会自动重启相关组件。
手动轮换的标准流程:
- 检查证书到期时间:
kubeadm certs check-expiration - 执行证书续期:
kubeadm certs renew all或指定具体证书名称 - 重启受影响组件: 手动重启 apiserver、controller-manager、scheduler 等静态 Pod
- 更新 kubeconfig 文件:
kubeadm init phase kubeconfig all --config=kubeadm-config.yaml - 分发新证书: 将新证书同步至所有控制平面节点
关键注意: 手动轮换后必须重启组件,否则旧证书仍被加载。重启顺序建议:etcd → apiserver → controller-manager → scheduler → kubelet。etcd 证书轮换需逐个节点进行,避免集群脑裂。
手动轮换与自动轮换的对比:
| 对比维度 | 自动轮换 | 手动轮换 |
|---|---|---|
| 触发方式 | kubelet 自动检测到期时间 | 运维人员执行命令 |
| 覆盖范围 | 仅 kubelet 证书 | 所有 kubeadm 管理的证书 |
| 组件重启 | 自动重启 kubelet | 需手动重启静态 Pod |
| 风险等级 | 低(仅影响 kubelet) | 中(需规划停机窗口) |
| 适用场景 | 日常节点证书维护 | 证书批量更新、集群升级前 |
4.3 证书过期检测与告警
证书过期是集群通信故障的常见原因。建立有效的检测与告警机制,可以在证书到期前主动干预,避免节点间通信中断。
4.3.1 检测方法
- kubeadm 内置检测:
kubeadm certs check-expiration输出所有证书的到期时间,支持--v=5查看详细 CSR 状态。 - OpenSSL 手动检测:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A2 "Validity" - Prometheus 指标: 通过
cert_manager_certificate_expiry_timestamp_seconds或kubelet_certificate_manager_client_expiration_seconds监控。 - 自定义脚本: 遍历
/etc/kubernetes/pki/目录下所有.crt文件,计算到期天数。
4.3.2 告警阈值建议
| 告警级别 | 剩余天数 | 建议动作 |
|---|---|---|
| 信息 (Info) | 90 天 | 记录日志,纳入运维排期 |
| 警告 (Warning) | 30 天 | 发送邮件/钉钉/企业微信通知 |
| 严重 (Critical) | 7 天 | 触发 PagerDuty/电话告警,立即安排轮换 |
| 紧急 (Emergency) | 1 天 | 自动执行轮换脚本(需审批) |
4.3.3 告警实现示例
使用 Prometheus + Alertmanager 实现证书过期告警:
# prometheus 告警规则片段
groups:
- name: kubernetes-certificates
rules:
- alert: KubeCertificateExpiringSoon
expr: |
(kubelet_certificate_manager_client_expiration_seconds - time()) < 2592000
for: 5m
labels:
severity: warning
annotations:
summary: "Kubelet 客户端证书将在 30 天内过期"
description: "节点 {{ $labels.node }} 证书剩余 {{ $value | humanizeDuration }}"
- alert: KubeCertificateExpired
expr: |
kubelet_certificate_manager_client_expiration_seconds < time()
for: 1m
labels:
severity: critical
annotations:
summary: "Kubelet 客户端证书已过期"
description: "节点 {{ $labels.node }} 证书已过期,节点通信可能中断"
最佳实践: 建议将证书检测脚本集成到集群巡检工具中,每日自动执行。对于 etcd 证书,由于轮换涉及集群成员变更,建议设置更严格的告警阈值(提前 60 天告警)。
4.4 轮换触发后的节点通信兼容性影响
证书轮换过程中,节点间通信的兼容性取决于以下关键因素:
- 证书 SAN 一致性: 新证书必须包含旧证书中的所有 Subject Alternative Name,否则 apiserver 会拒绝连接。
- CA 证书不变性: 轮换仅更新叶子证书,CA 证书保持不变,否则所有节点需重新信任新 CA。
- kubeconfig 更新时机: 客户端 kubeconfig 中的
client-certificate-data必须与新证书匹配,否则认证失败。 - etcd 成员证书: etcd 使用 peer 证书进行成员间通信,轮换后需逐个节点更新并重启,否则集群可能失联。
常见故障场景: 手动轮换 apiserver 证书后未更新
admin.conf,导致 kubectl 无法连接集群;或 etcd 证书轮换时同时重启多个节点,引发 etcd 集群选举超时。建议每次轮换后执行 kubectl get nodes 和 etcdctl endpoint health 验证通信正常。