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 的自动轮换流程:
2.5 手动轮换操作示例
以下是在 kubeadm 集群中手动轮换控制平面证书的典型步骤:
- 检查证书过期时间:
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
- 手动轮换所有证书:
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
# ...
- 重启控制平面组件:
# 重启 kube-apiserver、kube-controller-manager、kube-scheduler
# 如果使用静态 Pod,重启 kubelet 即可
systemctl restart kubelet
- 更新 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 实现统一、自动化的证书生命周期管理。