Kubernetes rollouts:基于 SLO 推广,而非 “pods are Ready”
发布: (2026年3月14日 GMT+8 23:57)
3 分钟阅读
原文: Dev.to
Source: Dev.to
Readiness 是局部信号。生产影响是全局的。
Pods 在你的 SLO 窗口已经开始燃烧时仍可能 Ready。
失败链
- Rollout 快速切换流量。
- 新的 pod 在 HPA 响应之前就已经饱和。
- HPA 的抓取窗口最少为 15–30 秒。
- P95 延迟上升。
- 错误率上升。
- SLI 下降。
一切看起来都很健康,但错误预算正悄悄被消耗。
为什么 “pods are Ready” 会误导你
- Ready 只表示容器已启动并通过了健康检查。
- 它并不说明 P95 延迟、错误率,或你的 SLO 切片是否仍然满足。
- Canary 可能因为指标过于粗糙而卡在 “green”。
- 没有标签、没有切片 → 爆炸半径保持不可见。
三个解决方案
1. 在第一次 Canary 步骤之前预先扩容
- 在流量切换 之前 增加副本数。
- HPA 从安全的基线而不是饱和状态开始追赶。
2. 将步骤间隔匹配到你的 HPA 扩容窗口
- 默认的稳定窗口为 3 分钟。
- 使用以下命令检查你的设置:
kubectl get hpa -o yaml- 在该窗口关闭之前进行提升相当于盲目提升。
3. 基于 SLI 健康状况来控制步骤
- 在 Argo Rollouts 中接入
AnalysisRun,在提升前检查错误率和 P95 延迟是否在 SLO 范围内。 - 如果 SLI 仍在恢复中,提升将等待。
规则
仅当 Canary 持有对固定窗口重要的 SLO 切片时才进行提升。
窗口之外的任何情况都会触发自动回滚。
Rollout 速度和自动扩缩容的响应时间是独立调校的。正是这段间隙导致错误预算在任何人报警之前被消耗。
深入探讨
你现在的 Rollout 步骤间隔是多少?