3、证书轮换机制:Cilium内置证书轮换流程、自动轮换触发条件、轮换超时与重试策略
Cilium Agent 使用 mTLS 与 Kubernetes API Server、Hubble Relay、Cluster Mesh 等组件通信。证书轮换机制是保障长期运行集群通信安全的核心能力。本章深入分析 Cilium 内置的证书轮换流程、自动轮换的触发条件以及轮换超时与重试策略,帮助运维人员理解证书生命周期管理的底层逻辑。
3.1 Cilium 内置证书轮换流程
Cilium 的证书轮换由 cilium-agent 和 cilium-operator 协作完成。Agent 负责本地证书的加载与监听,Operator 负责证书的签发与分发。轮换流程分为四个阶段:
- 证书到期检测:Agent 定期检查本地证书文件的过期时间,默认检查间隔为 5 分钟。
- CSR 发起:当证书剩余有效期低于阈值(默认 30 天),Agent 向 Operator 发起 Certificate Signing Request (CSR)。
- Operator 签发:Operator 验证 CSR 合法性后,使用集群 CA 签发新证书,并通过 Kubernetes Secret 或 gRPC 流返回给 Agent。
- 热加载生效:Agent 接收新证书后,在不重启进程的情况下更新 TLS 上下文,旧连接优雅关闭,新连接使用新证书。
关键指标:从 CSR 发起到新证书生效,正常耗时应小于 10 秒。若超过 30 秒,则可能触发轮换超时逻辑。
3.2 自动轮换触发条件
Cilium 的证书自动轮换并非基于固定时间间隔,而是由以下三个条件共同决定:
| 触发条件 | 默认值 | 说明 |
|---|---|---|
| 证书剩余有效期阈值 | 30 天 | 当证书剩余有效期低于此值时,Agent 发起 CSR 请求 |
| 证书已用时长比例 | 80% | 当证书已用时长超过总有效期的 80% 时触发轮换 |
| 强制轮换间隔 | 180 天 | 即使未达到上述条件,超过此间隔也会强制轮换 |
最佳实践:在生产环境中,建议将证书有效期设置为 365 天,并保持默认的 30 天阈值。这样既能保证证书有足够的缓冲期,又能避免过于频繁的轮换。
触发条件的优先级为:强制轮换间隔 > 证书已用时长比例 > 证书剩余有效期阈值。当任意一个条件满足时,Agent 立即进入轮换流程。
3.3 轮换超时与重试策略
Cilium 为证书轮换设计了完善的超时与重试机制,防止因网络抖动或 Operator 负载过高导致轮换失败。核心参数如下:
| 参数名称 | 默认值 | 作用 |
|---|---|---|
certificate-renewal-timeout |
30s | 单次 CSR 请求的超时时间 |
certificate-renewal-retry-interval |
5s | 失败后的重试间隔 |
certificate-renewal-max-retries |
3 | 最大重试次数 |
certificate-renewal-backoff-factor |
2.0 | 指数退避因子 |
重试策略采用 指数退避 + 抖动 算法:
// 重试间隔计算逻辑
retry_interval = base_interval * (backoff_factor ^ retry_count)
// 加入随机抖动,防止惊群效应
actual_interval = retry_interval + random(0, retry_interval * 0.1)
// 示例:第 1 次重试等待 5s,第 2 次 10s,第 3 次 20s
// 每次重试增加 0~10% 的随机抖动
注意:如果 3 次重试全部失败,Agent 不会立即崩溃,而是进入 降级模式。降级模式下,Agent 继续使用旧证书,但会在日志中记录
CRITICAL 级别告警,并每 5 分钟重新尝试一次轮换。若旧证书已过期,Agent 将停止接受新连接,仅维持已有连接。
3.4 轮换失败常见原因与排查路径
证书轮换失败通常由以下原因导致:
- Operator 不可达:Agent 无法连接到 Operator 的 gRPC 端口(默认 4434)。
- CA 证书过期:集群 CA 证书已过期,Operator 无法签发新证书。
- CSR 被拒绝:Kubernetes CSR 资源被准入控制器或策略拒绝。
- 磁盘空间不足:Agent 无法写入新证书文件。
- 时间偏差:Agent 节点与 Operator 节点时间偏差超过 5 分钟,导致证书验证失败。
排查命令:
kubectl logs -n kube-system cilium-agent-xxxxx | grep -i certificatekubectl get csr -n kube-system | grep ciliumcilium status | grep -i cert