3. 滚动更新策略原理:maxSurge、maxUnavailable 参数详解与工作流程

滚动更新(Rolling Update)是 Kubernetes Deployment 默认的更新策略,它通过逐步替换旧 Pod 实例来保证服务在更新期间始终可用。理解 maxSurge 和 maxUnavailable 两个核心参数,是掌握零停机证书轮换的关键。

3.1 核心参数详解

在 Deployment 的 spec.strategy.rollingUpdate 字段下,有两个参数共同控制滚动更新的速率和可用性边界:

参数 类型 默认值 含义 对证书轮换的影响
maxSurge 整数或百分比 25% 更新期间允许超出期望副本数的最大 Pod 数量 控制同时启动的新 Pod 数量,影响证书挂载速度
maxUnavailable 整数或百分比 25% 更新期间允许不可用 Pod 的最大数量 控制同时终止的旧 Pod 数量,决定最小可用实例数
关键公式:
更新期间最小可用 Pod 数 = replicas - maxUnavailable
更新期间最大 Pod 总数 = replicas + maxSurge

3.1.1 maxSurge 详解

  • 整数模式:例如 maxSurge: 2,表示最多允许超出期望副本数 2 个 Pod。
  • 百分比模式:例如 maxSurge: 25%,向上取整。若 replicas=10,则允许额外启动 3 个新 Pod。
  • 证书轮换场景:较大的 maxSurge 可以加速新证书 Pod 的启动,但会消耗更多集群资源。

3.1.2 maxUnavailable 详解

  • 整数模式:例如 maxUnavailable: 1,表示最多允许 1 个 Pod 不可用。
  • 百分比模式:例如 maxUnavailable: 25%,向下取整。若 replicas=10,则允许最多 2 个 Pod 不可用。
  • 证书轮换场景:设置为 0 或较小值可保证服务零停机,但更新速度会变慢。
零停机最佳实践: 对于证书轮换这类敏感操作,建议设置 maxUnavailable: 0,确保旧 Pod 全部存活时才开始创建新 Pod。

3.2 滚动更新工作流程

当 Deployment 的 Pod 模板(如挂载的新证书 Secret)发生变化时,Kubernetes 控制器会按照以下步骤执行滚动更新:

  1. 创建新 ReplicaSet:控制器根据新的 Pod 模板创建 ReplicaSet,初始副本数为 0。
  2. 扩容新 ReplicaSet:按照 maxSurge 的限制,逐步增加新 Pod 的数量。
  3. 缩容旧 ReplicaSet:在新 Pod 进入 Ready 状态后,按照 maxUnavailable 的限制,逐步删除旧 Pod。
  4. 健康检查等待:每个新 Pod 必须通过 readinessProbe 探测后,才会被视为可用。
  5. 重复迭代:步骤 2-4 反复执行,直到所有旧 Pod 被替换,新 ReplicaSet 达到期望副本数。
滚动更新工作流程 滚动更新工作流程(replicas=4, maxSurge=1, maxUnavailable=0) 旧 ReplicaSet (4 Pod) 创建新 ReplicaSet 扩容新 Pod (maxSurge) 等待 readinessProbe 缩容旧 Pod (maxUnavailable) 详细步骤说明: 1. 检测到 Pod 模板变更(如证书 Secret 更新) 2. 控制器创建新 ReplicaSet,副本数=0 3. 按 maxSurge=1 扩容新 Pod(最多 5 个总 Pod) 4. 新 Pod 通过 readinessProbe 后标记为 Ready 5. 按 maxUnavailable=0 缩容旧 Pod(每次删 1 个) 6. 重复步骤 3-5,直到全部替换完成 零停机关键: maxUnavailable=0 确保始终有 4 个 Pod 提供服务 maxSurge=1 允许额外创建 1 个新 Pod 加速更新

3.3 参数配置示例

以下是一个针对证书轮换优化的 Deployment 配置片段:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1          # 最多额外启动 1 个新 Pod
      maxUnavailable: 0    # 不允许旧 Pod 不可用,保证零停机
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        volumeMounts:
        - name: tls-certs
          mountPath: /etc/nginx/certs
          readOnly: true
        readinessProbe:
          httpGet:
            path: /healthz
            port: 443
            scheme: HTTPS
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: tls-certs
        secret:
          secretName: tls-certificate
注意: 当 maxUnavailable=0 时,滚动更新会严格等待每个新 Pod 就绪后才删除旧 Pod。如果 readinessProbe 配置不当或证书挂载失败,更新可能会卡住。建议在证书轮换前先验证新 Secret 的有效性。

3.4 滚动更新状态观察

使用以下命令可以实时观察滚动更新的进度:

# 查看更新状态
kubectl rollout status deployment/web-server

# 查看 ReplicaSet 变化
kubectl get rs -l app=web-server -w

# 查看 Pod 逐个替换过程
kubectl get pods -l app=web-server -w
滚动更新 Pod 状态变化 滚动更新过程中 Pod 状态变化(replicas=3, maxSurge=1, maxUnavailable=0) T0 T1 T2 T3 T4 Pod-A (旧) Pod-B (旧) Pod-C (旧) Pod-A (旧) Pod-B (旧) Pod-C (旧) Pod-D (新) Pod-B (旧) Pod-C (旧) Pod-D (新) Pod-A (删除) Pod-C (旧) Pod-D (新) Pod-E (新) Pod-B (删除) Pod-D (新) Pod-E (新) Pod-F (新) 旧 Pod 新 Pod (就绪) 新 Pod (启动中) 旧 Pod (删除中)

3.5 证书轮换场景的参数推荐

场景 replicas maxSurge maxUnavailable 说明
严格零停机 ≥3 1 0 最安全,更新速度较慢,适合生产环境
快速轮换 ≥5 25% 1 允许少量 Pod 不可用,加速更新
资源受限 2 1 0 最小副本数下的零停机方案
证书轮换建议: 对于关键服务的证书更新,推荐使用 maxUnavailable: 0 配合 maxSurge: 1。这样既能保证服务不降级,又能通过逐个替换的方式平稳加载新证书。如果集群资源充足,可以适当增大 maxSurge 来加速轮换过程。