滚动更新(Rolling Update)策略
滚动更新是 Kubernetes 的默认部署策略。它的工作方式很简单:逐步替换旧版本的 Pod,用新版本的 Pod 取而代之。
这种方式不需要双倍资源,可以渐进式地完成更新。如果在更新过程中发现问题,Kubernetes 会自动暂停更新,防止故障蔓延。
滚动更新是最「保守」的部署策略,适合大多数场景。但它也有自己的局限性:更新过程中会同时存在两个版本,部分用户可能体验到不一致性。
滚动更新的原理
工作流程
Kubernetes 原生实现
rolling-update.yaml
参数详解
组合策略:
maxSurge: 0, maxUnavailable: 1:最保守,逐个替换maxSurge: 25%, maxUnavailable: 0:最激进,保持最大可用性maxSurge: 1, maxUnavailable: 0:平衡策略
高级配置
分层滚动更新
layered-rolling-update.yaml
健康检查
readiness-probe.yaml
滚动更新的控制
Argo Rollout 增强
增强的滚动策略
argocd-rolling.yaml
蓝绿与滚动更新混合
hybrid-strategy.yaml
滚动更新的问题与解决
服务发现中断
问题:滚动更新期间,Endpoint 变化导致部分请求失败。
解决:使用 readyReplicas 而非 replicas 作为 Service Selector。
stable-service.yaml
版本不一致
问题:滚动更新期间,新旧版本同时存在。
解决:使用 PodDisruptionBudget 确保最小可用副本。
pdb.yaml
资源配置
问题:资源不足导致 Pod 无法调度。
解决:确保集群有足够资源。
监控与告警
滚动更新指标
Prometheus 查询
最佳实践
推荐配置
best-practice.yaml
滚动更新流程
注意事项
:::warning 滚动更新的陷阱:
- 过度激进的配置:
maxSurge: 100%+maxUnavailable: 100%等于同时启动全部新 Pod - 缺少健康检查:没有 readinessProbe 会导致流量到未就绪的 Pod
- 资源评估不足:需要确保集群有足够的额外资源
- 忽略超时设置:长时间卡住会影响其他发布 :::
与其他策略对比
常见问题
何时选择滚动更新
适用场景
- 常规的功能发布
- 无状态应用(微服务)
- 资源受限环境
- 需要逐步验证的场景
不适用场景
- 有状态应用(可能需要蓝绿)
- 需要完整环境验证(蓝绿更好)
- 高风险变更(金丝雀更好)
- 需要精确流量控制(金丝雀更好)
延伸思考
滚动更新是 Kubernetes 的「默认选项」,这意味着它是最通用、最安全的策略。对于大多数场景,你不需要考虑其他策略。
但「通用」也意味着「不专门」。当你有特定需求时,其他策略可能更合适:
- 如果你需要精确控制流量分配,选择金丝雀
- 如果你需要秒级回滚,选择蓝绿
- 如果你有严格的资源限制,滚动更新仍然是首选
建议:把滚动更新作为默认策略,只有在特殊需求时才考虑其他策略。这会大大简化你的发布系统。