2、证书轮换核心概念:轮换策略、轮换触发条件、手动轮换 vs 自动轮换(kubeadm、cert-manager)

Kubernetes 集群的 PKI 证书都有固定的有效期(通常为 1 年)。证书轮换是指在证书过期前或过期后,用新证书替换旧证书的过程。理解轮换策略、触发条件以及手动与自动轮换的差异,是保障集群通信安全的基础。

2.1 轮换策略

轮换策略定义了证书更新的时机、频率和方式。常见的策略包括:

策略类型 描述 适用场景
基于时间(Time-based) 在证书过期前固定时间(如 30 天、7 天)触发轮换。 kubeadm 自动轮换、cert-manager 默认策略。
基于阈值(Threshold-based) 当证书剩余有效期低于某个百分比或天数时触发。 cert-manager 可配置 renewBefore。
手动触发(On-demand) 运维人员通过命令或 API 手动发起轮换。 紧急轮换、证书泄露、kubeadm 手动更新。
事件驱动(Event-driven) 监听证书相关事件(如 CRL 发布、CA 变更)触发轮换。 高级安全策略、合规要求。
最佳实践: 推荐采用“基于阈值”策略,设置 renewBefore 为证书有效期的 1/3(例如 1 年有效期,提前 4 个月轮换),既避免频繁轮换,又留有充足缓冲时间。

2.2 轮换触发条件

证书轮换的触发条件决定了轮换动作何时开始。以下是常见的触发条件:

  • 时间到期: 证书达到预设的轮换时间点(如 kubeadm 的 --certificate-renewal 默认在证书剩余 3 个月时触发)。
  • 手动命令: 管理员执行 kubeadm certs renew 或 cert-managerctl renew 等命令。
  • 证书即将过期: 监控系统检测到证书剩余有效期低于阈值,自动触发轮换。
  • CA 证书变更: 集群 CA 证书被替换或更新,所有由该 CA 签发的证书需要重新签发。
  • 安全事件: 证书私钥泄露、证书被吊销、安全审计要求立即轮换。
  • 节点加入/离开: 新节点加入集群或旧节点被移除时,相关证书可能需要重新生成。
注意: 轮换触发后,如果新证书未及时分发到所有组件,可能导致部分组件通信失败。务必在轮换前验证证书的兼容性(参见后续章节)。

2.3 手动轮换 vs 自动轮换

手动轮换和自动轮换在操作方式、风险等级和适用场景上有显著差异。下表对比了两种方式的核心区别:

对比维度 手动轮换 自动轮换
操作方式 管理员登录节点,执行命令(如 kubeadm certs renew),然后重启相关组件。 由控制器(如 kube-controller-manager、cert-manager)自动检测并执行轮换。
风险等级 高。容易因操作失误(如漏更新某个证书、重启顺序错误)导致集群故障。 低。自动化流程减少人为错误,但需确保控制器配置正确。
适用场景 紧急轮换、证书泄露、非标准集群、测试环境。 生产环境、大规模集群、合规要求严格的场景。
对集群影响 需要停机或滚动重启组件,可能影响业务。 通常支持零停机轮换(如 cert-manager 配合 ingress 自动更新)。
可审计性 依赖操作日志,审计困难。 自动记录轮换事件,便于审计和回溯。

2.3.1 kubeadm 的自动轮换机制

kubeadm 从 v1.15 版本开始支持自动证书轮换。其核心机制如下:

  • 控制器: kube-controller-manager 中的 csrapproving 控制器负责自动批准节点证书签名请求(CSR)。
  • 触发条件: 当节点证书剩余有效期小于 3 个月时,kubelet 会自动生成新的私钥和 CSR,并提交给 API Server。
  • 轮换流程: kubelet 检测证书过期 → 生成新 CSR → 提交给 API Server → 控制器自动批准 → kubelet 获取新证书并替换旧证书。
  • 配置方式: 在 kubelet 配置文件中设置 rotateCertificates: true 和 serverTLSBootstrap: true。
# kubelet 配置示例(/var/lib/kubelet/config.yaml)
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
rotateCertificates: true
serverTLSBootstrap: true
kubeadm 自动轮换限制: 仅支持 kubelet 客户端证书和服务证书的自动轮换。控制平面证书(如 apiserver、etcd 证书)仍需手动或通过 kubeadm certs renew 命令轮换。

2.3.2 cert-manager 的自动轮换机制

cert-manager 是一个 Kubernetes 原生的证书管理控制器,支持更灵活的自动轮换策略:

  • 核心资源: Issuer/ClusterIssuer(证书颁发者)、Certificate(证书定义)。
  • 轮换触发: 通过 Certificate 资源的 spec.renewBefore 字段设置提前轮换时间(如 720h 表示提前 30 天)。
  • 轮换流程: cert-manager 控制器监听 Certificate 资源 → 检测证书剩余有效期 → 如果小于 renewBefore,则自动向 Issuer 请求新证书 → 更新 Secret 中的证书数据 → 触发引用该 Secret 的 Pod 滚动更新。
  • 支持颁发者: 自签名 CA、Let's Encrypt、Vault、AWS PCA 等。
# cert-manager Certificate 示例
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-com
  namespace: default
spec:
  secretName: example-com-tls
  duration: 2160h   # 90 天
  renewBefore: 720h # 提前 30 天轮换
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: example.com
  dnsNames:
  - example.com
  - www.example.com
cert-manager 优势: 支持自动更新引用证书的 Pod(通过 revisionHistoryLimit 和 secretTemplate),实现零停机轮换。同时提供丰富的指标和事件,便于监控轮换状态。

2.4 轮换流程对比图

下图对比了 kubeadm 和 cert-manager 的自动轮换流程:

kubeadm vs cert-manager 自动轮换流程对比 kubeadm vs cert-manager 自动轮换流程对比 kubeadm 自动轮换 kubelet 检测证书剩余 < 3 个月 kubelet 生成新私钥 & CSR 提交 CSR 到 API Server csrapproving 控制器自动批准 kubelet 获取新证书并替换 cert-manager 自动轮换 Certificate 资源定义 renewBefore cert-manager 控制器监听资源 检测证书剩余 < renewBefore 向 Issuer 请求新证书 更新 Secret & 触发 Pod 滚动更新 说明:kubeadm 仅自动轮换 kubelet 证书;cert-manager 支持所有证书类型,并自动更新引用证书的 Pod。

2.5 手动轮换操作示例

以下是在 kubeadm 集群中手动轮换控制平面证书的典型步骤:

  1. 检查证书过期时间:
kubeadm certs check-expiration
# 输出示例:
# CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
# admin.conf                 Apr 10, 2025 08:12 UTC   364d                                    no
# apiserver                  Apr 10, 2025 08:12 UTC   364d            ca                      no
# apiserver-kubelet-client   Apr 10, 2025 08:12 UTC   364d            ca                      no
  1. 手动轮换所有证书:
kubeadm certs renew all
# 输出示例:
# [renew] Reading configuration from the cluster...
# [renew] Successfully renewed certificate /etc/kubernetes/pki/apiserver.crt
# [renew] Successfully renewed certificate /etc/kubernetes/pki/apiserver-kubelet-client.crt
# ...
  1. 重启控制平面组件:
# 重启 kube-apiserver、kube-controller-manager、kube-scheduler
# 如果使用静态 Pod,重启 kubelet 即可
systemctl restart kubelet
  1. 更新 kubeconfig 文件:
# 更新 admin.conf、kubelet.conf 等
kubeadm certs renew admin.conf
kubeadm certs renew kubelet.conf
手动轮换风险提示: 轮换后必须重启所有引用旧证书的组件。如果遗漏某个组件(如 kube-proxy、CoreDNS),可能导致该组件无法与 API Server 通信。建议在轮换后使用 kubectl get csr 和 openssl x509 -in /path/to/cert.crt -text -noout 验证新证书是否生效。

2.6 自动轮换配置对比

配置项 kubeadm cert-manager
启用方式 kubelet 配置 rotateCertificates: true 创建 Certificate 资源并设置 renewBefore
轮换范围 仅 kubelet 客户端和服务证书 所有通过 Certificate 资源定义的证书
触发条件 证书剩余 < 3 个月(硬编码) 证书剩余 < renewBefore(可配置)
Pod 更新 需手动重启 Pod 自动触发引用 Secret 的 Pod 滚动更新
监控支持 通过 kubelet 指标 Prometheus 指标 + 事件通知
适用证书类型 kubelet 相关证书 Ingress、Gateway、Service Mesh 等任意证书
选择建议: 对于仅需管理 kubelet 证书的集群,kubeadm 自动轮换足够;对于需要管理多种证书(如 Ingress、mTLS)的生产环境,推荐使用 cert-manager 实现统一、自动化的证书生命周期管理。