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 配置下,滚动更新及触发回滚的完整流程:

RollingUpdate 更新与回滚流程 RollingUpdate 更新与回滚流程 (replicas=5, maxSurge=1, maxUnavailable=0) 阶段 1 初始状态 v1 Pod 1 v1 Pod 2 v1 Pod 3 v1 Pod 4 v1 Pod 5 阶段 2 创建 v2 Pod v1 Pod 1 v1 Pod 2 v1 Pod 3 v1 Pod 4 v1 Pod 5 v2 Pod 6 (maxSurge=1) 阶段 3 删除旧 v1 Pod v1 Pod 1 v1 Pod 2 v1 Pod 3 v1 Pod 4 v1 Pod 5 (删除中) v2 Pod 6 阶段 4 触发回滚 v1 Pod 1 v1 Pod 2 v1 Pod 3 v1 Pod 4 v2 Pod 6 (回滚删除) v1 Pod 5 (恢复中) 说明: 1. 阶段 2 创建 v2 Pod 6 时,总 Pod 数变为 6(超过期望 5),受 maxSurge=1 限制。 2. 阶段 3 删除旧 Pod 时,不可用 Pod 数受 maxUnavailable=0 限制,必须等新 Pod 就绪后才能删除旧 Pod。

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 严格控制新版本暴露比例