3. RollingUpdate 策略详解:maxSurge 与 maxUnavailable 对回滚的影响
Kubernetes 默认的更新策略是 RollingUpdate(滚动更新)。它通过逐步替换旧 Pod 实例来保证服务在更新期间持续可用。理解 RollingUpdate 的核心参数 maxSurge 和 maxUnavailable,是设计自动化回滚护栏的前提——这两个参数直接决定了更新速度、资源消耗以及回滚时的行为。
3.1 RollingUpdate 核心机制
滚动更新的本质是:在维持期望副本数(replicas)的前提下,逐步用新版本 Pod 替换旧版本 Pod。控制器(Deployment Controller)会创建新 Pod,等待其就绪,然后删除旧 Pod,重复此过程直到所有 Pod 都更新为新版本。
关键原则: 滚动更新不是一次性全部替换,而是分批次进行。批次大小由
maxSurge 和 maxUnavailable 共同控制。
3.2 参数详解:maxSurge 与 maxUnavailable
这两个参数定义在 Deployment 的 spec.strategy.rollingUpdate 字段中,可以是数值(整数)或百分比。它们共同决定了滚动更新过程中 Pod 数量的上下边界。
| 参数 | 含义 | 默认值 | 取值范围 | 对回滚的影响 |
|---|---|---|---|---|
maxSurge |
更新期间允许超出期望副本数的最大 Pod 数量 | 25% | 0 或正整数 / 0% ~ 100% | 值越大,回滚时可快速创建新 Pod;值为 0 时回滚必须等待旧 Pod 删除 |
maxUnavailable |
更新期间允许不可用的最大 Pod 数量(相对于期望副本数) | 25% | 0 或正整数 / 0% ~ 100% | 值越大,回滚时允许更多旧 Pod 同时不可用,速度更快但风险更高 |
经验法则: 生产环境建议将
maxUnavailable 设置为 0,确保更新期间服务容量不下降;同时将 maxSurge 设置为 25% 或 1(取较大值),以保留一定的更新速度。
3.3 参数组合对更新与回滚的影响
不同的参数组合会产生截然不同的更新行为。以下表格对比了三种典型配置及其对回滚的影响:
| 配置场景 | maxSurge | maxUnavailable | 更新行为 | 回滚行为 |
|---|---|---|---|---|
| 保守型 | 0 | 1(或 10%) | 先删除一个旧 Pod,再创建新 Pod;严格保持容量不超 | 回滚慢,必须逐个替换;适合无弹性场景 |
| 均衡型(默认) | 25% | 25% | 允许同时创建和删除 Pod,总容量在 75%~125% 之间波动 | 回滚速度适中,资源利用率较好 |
| 激进型 | 100% | 100% | 允许全部旧 Pod 不可用,同时创建全部新 Pod(相当于重建) | 回滚最快,但期间服务可能完全不可用 |
3.4 滚动更新与回滚的流程图示
下图展示了在 replicas=5、maxSurge=1、maxUnavailable=0 配置下,滚动更新及触发回滚的完整流程:
3.5 参数配置对回滚速度的影响
当更新过程中触发回滚时,Deployment 控制器会按照相同的 RollingUpdate 逻辑反向操作——用旧版本(v1)替换新版本(v2)。此时 maxSurge 和 maxUnavailable 同样生效:
- maxSurge 越大,回滚越快:允许同时创建更多旧版本 Pod,加速替换过程。
- maxUnavailable 越大,回滚越快但风险越高:允许更多 Pod 同时不可用,可能影响服务容量。
- maxSurge=0 且 maxUnavailable=0 时,回滚无法进行:因为没有空间创建新 Pod,也无法删除旧 Pod,更新会卡住。
避坑提示: 不要将
maxSurge 和 maxUnavailable 同时设置为 0。这会导致滚动更新无法启动,Deployment 会一直处于 Progressing 状态,永远不会完成更新或回滚。
3.6 实际配置示例
以下是一个生产环境推荐的 Deployment 配置片段:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多允许 1 个额外 Pod
maxUnavailable: 0 # 不允许 Pod 不可用
template:
spec:
containers:
- name: app
image: my-app:v2
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
自动化回滚护栏建议: 在 CI/CD 流水线中,将
maxSurge 和 maxUnavailable 作为可调参数暴露给运维人员。当检测到回滚事件时,可以临时增大 maxSurge 以加速回滚,待恢复后再改回保守值。
3.7 参数配置决策矩阵
根据不同的业务场景,选择合适的参数组合:
| 业务场景 | 推荐 maxSurge | 推荐 maxUnavailable | 理由 |
|---|---|---|---|
| 关键在线服务(SLA > 99.99%) | 1 或 10% | 0 | 保证容量不降,回滚时逐个替换 |
| 内部工具/非关键服务 | 25% | 25% | 平衡速度与可用性 |
| 批量任务/无状态计算 | 100% | 100% | 追求最快更新速度,允许短暂不可用 |
| 金丝雀发布(Canary) | 1 或 10% | 0 | 严格控制新版本暴露比例 |