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 命令进行手动轮换。该命令会重新生成证书文件,但不会自动重启相关组件。

手动轮换的标准流程:

  1. 检查证书到期时间: kubeadm certs check-expiration
  2. 执行证书续期: kubeadm certs renew all 或指定具体证书名称
  3. 重启受影响组件: 手动重启 apiserver、controller-manager、scheduler 等静态 Pod
  4. 更新 kubeconfig 文件: kubeadm init phase kubeconfig all --config=kubeadm-config.yaml
  5. 分发新证书: 将新证书同步至所有控制平面节点
关键注意: 手动轮换后必须重启组件,否则旧证书仍被加载。重启顺序建议:etcd → apiserver → controller-manager → scheduler → kubelet。etcd 证书轮换需逐个节点进行,避免集群脑裂。

手动轮换与自动轮换的对比:

对比维度 自动轮换 手动轮换
触发方式 kubelet 自动检测到期时间 运维人员执行命令
覆盖范围 仅 kubelet 证书 所有 kubeadm 管理的证书
组件重启 自动重启 kubelet 需手动重启静态 Pod
风险等级 低(仅影响 kubelet) 中(需规划停机窗口)
适用场景 日常节点证书维护 证书批量更新、集群升级前
证书轮换触发机制流程对比 自动轮换(kubelet 证书) kubelet 检测证书到期前 80% 发起 CSR 请求至 apiserver csrapproving 自动批准 kubelet 自动加载新证书 手动轮换(控制平面证书) kubeadm certs check-expiration kubeadm certs renew all 手动重启静态 Pod 更新 kubeconfig 并分发

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 天告警)。
证书过期检测与告警生命周期 签发日 90天告警 30天告警 7天告警 过期 告警响应策略 90天:记录日志 → 30天:邮件通知 → 7天:电话告警 → 过期:自动轮换 建议结合 PagerDuty / 企业微信机器人实现分级通知

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 验证通信正常。