4、滚动升级策略配置:Rolling Update 参数(maxSurge、maxUnavailable)、更新策略选择、Pod 中断预算

在 Kubernetes 工作负载(Deployment / StatefulSet)中,滚动升级(Rolling Update)是默认且最常用的更新策略。Argo CD 作为 GitOps 工具,本身不直接执行 Pod 滚动,而是通过管理 Kubernetes 资源清单中的 strategy 字段来控制升级行为。本章聚焦三个核心配置维度:Rolling Update 参数(maxSurge / maxUnavailable)、更新策略选择(Recreate vs RollingUpdate)、以及Pod 中断预算(PDB),确保在 Argo CD 自动同步场景下,资源配额校准与业务连续性得到保障。

4.1 Rolling Update 参数:maxSurge 与 maxUnavailable

Deployment 的 spec.strategy.rollingUpdate 下有两个关键参数,直接决定滚动升级的速率与资源消耗峰值:

参数 类型 默认值 含义 对资源配额的影响
maxSurge 整数或百分比 25% 滚动升级期间,允许超出期望副本数的最大 Pod 数量 增加临时资源占用,需预留额外 CPU/内存配额
maxUnavailable 整数或百分比 25% 滚动升级期间,允许不可用 Pod 的最大数量 影响最小可用副本数,需确保配额能支撑剩余 Pod
校准要点: 在 Argo CD 自动同步且资源配额紧张的环境下,建议将 maxSurge 设置为 0 或较小值(如 10%),避免因临时 Pod 激增导致配额不足而触发同步失败。同时,maxUnavailable 应结合 PodDisruptionBudget 的 minAvailable 统一规划。

参数组合典型场景:

  • 快速滚动(高可用优先): maxSurge=50%, maxUnavailable=0 —— 先创建新 Pod,再终止旧 Pod,保证始终有完整副本数,但资源峰值翻倍。
  • 保守滚动(资源受限): maxSurge=0, maxUnavailable=1 —— 先终止一个旧 Pod,再创建新 Pod,资源峰值不变,但滚动速度较慢。
  • 均衡模式: maxSurge=25%, maxUnavailable=25% —— 默认值,适合大多数场景,需确保配额能容纳 125% 的 Pod 同时运行。
滚动升级参数对比:资源峰值与可用性 快速滚动 maxSurge=50% maxUnavailable=0 旧 Pod: 10 新 Pod: 5 (临时) 总峰值: 15 可用性: 100% ⚠ 配额需 150% 保守滚动 maxSurge=0 maxUnavailable=1 旧 Pod: 9 (可用) 新 Pod: 1 (创建中) 总峰值: 10 可用性: 90% 配额无额外需求 均衡模式 maxSurge=25% maxUnavailable=25% 旧 Pod: 8 (可用) 新 Pod: 3 (临时) 总峰值: 13 可用性: 80% 配额需 125%

4.2 更新策略选择:Recreate vs RollingUpdate

Kubernetes Deployment 支持两种更新策略,选择依据主要取决于应用是否支持多版本共存以及数据层状态:

策略 行为 适用场景 Argo CD 同步影响
Recreate 先删除所有旧 Pod,再创建新 Pod 有状态应用、数据库迁移、单实例服务 同步期间服务完全中断,需配合维护窗口
RollingUpdate 逐步替换 Pod,保持服务在线 无状态应用、微服务、Web 服务 同步期间持续可用,但需配额弹性
策略选择避坑: 如果应用依赖持久化卷(PVC)且不支持 ReadWriteMany,使用 RollingUpdate 可能导致新 Pod 挂载同一 PVC 时冲突。此时应选择 Recreate 策略,或在 StatefulSet 中使用 OnDelete 更新类型。

Argo CD 中的策略配置示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    spec:
      containers:
      - name: app
        image: my-app:v2

4.3 Pod 中断预算(PodDisruptionBudget)

PodDisruptionBudget(PDB)是 Kubernetes 提供的自愿中断保护机制,用于限制同时中断的 Pod 数量。在 Argo CD 滚动升级场景中,PDB 与 maxUnavailable 共同决定升级的可用性边界。

PDB 两种定义方式:

  • minAvailable: 指定最少可用 Pod 数量(值或百分比),例如 minAvailable: 4 表示最多允许 1 个 Pod 不可用。
  • maxUnavailable: 指定最多不可用 Pod 数量(值或百分比),例如 maxUnavailable: 1 表示最多允许 1 个 Pod 被中断。
配额校准联动: 当 PDB 的 minAvailable 设置较高(如 90%)时,Deployment 的 maxUnavailable 应设置为 10% 或更小,避免 PDB 阻止滚动升级。Argo CD 同步时,如果 PDB 约束导致 Pod 无法正常终止,同步将卡在 Progressing 状态,需人工干预。

PDB 配置示例:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-app-pdb
spec:
  minAvailable: 4
  selector:
    matchLabels:
      app: my-app
滚动升级中断保护:PDB 与 RollingUpdate 协同 PodDisruptionBudget minAvailable: 4 (共 5 副本) → 最多允许 1 个 Pod 中断 Pod-1 Pod-2 Pod-3 Pod-4 Pod-5 ↑ 中断中(受 PDB 限制) RollingUpdate 参数 maxSurge: 1 maxUnavailable: 1 新-1 旧-1 旧-2 旧-3 旧-4 ↑ 新 Pod 创建中,旧 Pod 逐步终止

4.4 参数校准与测试验证清单

在 Argo CD 环境中完成滚动升级策略配置后,建议按以下清单进行资源配额校准与验证:

  1. 配额预检: 计算 maxSurge 峰值所需 CPU/内存,确保 Namespace 配额足够。
  2. PDB 一致性检查: 确认 PDB 的 minAvailable 与 Deployment 的 maxUnavailable 不冲突(minAvailable + maxUnavailable ≤ replicas)。
  3. 同步模拟: 使用 argocd app sync --dry-run 验证资源清单语法。
  4. 渐进式验证: 先在测试环境设置 maxSurge=0, maxUnavailable=1,观察 Pod 替换行为。
  5. 中断容忍测试: 手动驱逐一个 Pod(kubectl drain),验证 PDB 是否阻止过度中断。
生产建议: 对于关键业务,建议在 Argo CD Application 的 syncPolicy 中设置 retry 和 validate 选项,并在 PreSync hook 中执行配额检查脚本,确保滚动升级不会因资源不足而失败。