3. 滚动升级策略基础:Kubernetes Deployment 滚动更新原理、maxSurge 与 maxUnavailable 参数详解

在 Argo CD 管理应用交付的实践中,滚动升级(Rolling Update)是 Deployment 默认且最常用的更新策略。理解其底层原理与核心参数,是后续进行资源配额校准与瓶颈分析的前提。本章将深入剖析 Kubernetes 滚动更新的工作机制,并详细解读 maxSurge 与 maxUnavailable 两个关键参数。

3.1 Kubernetes Deployment 滚动更新原理

滚动更新的核心目标是在不中断服务的前提下,逐步用新版本的 Pod 替换旧版本的 Pod。其本质是通过控制新旧两个 ReplicaSet 的副本数量,实现平滑过渡。

核心机制:Deployment 控制器通过操作 ReplicaSet 来管理 Pod 的生命周期。更新时,控制器会创建一个新的 ReplicaSet,并逐步增加其副本数,同时减少旧 ReplicaSet 的副本数,直至新版本完全接管。

下图展示了滚动更新的基本流程:

Kubernetes Deployment 滚动更新流程 Kubernetes Deployment 滚动更新流程 旧 ReplicaSet (v1) replicas: 5 触发滚动更新 新 ReplicaSet (v2) replicas: 0 → 逐步增加 旧 ReplicaSet (v1) replicas: 3 滚动进行中 新旧 Pod 共存 新 ReplicaSet (v2) replicas: 2 新 ReplicaSet (v2) replicas: 5

滚动更新的关键步骤可以概括为:

  1. 触发更新:修改 Deployment 的 Pod 模板(如镜像版本),控制器检测到差异后开始执行滚动更新。
  2. 创建新 ReplicaSet:控制器根据新的 Pod 模板创建一个新的 ReplicaSet,初始副本数为 0。
  3. 逐步扩缩:按照 maxSurge 和 maxUnavailable 的配置,逐步增加新 ReplicaSet 的副本数,同时减少旧 ReplicaSet 的副本数。
  4. 健康检查:新 Pod 就绪后,才会继续下一轮替换。如果新 Pod 启动失败,更新过程会暂停或回滚。
  5. 完成更新:旧 ReplicaSet 副本数降为 0,新 ReplicaSet 达到期望副本数,更新完成。

3.2 maxSurge 与 maxUnavailable 参数详解

maxSurge 和 maxUnavailable 是控制滚动更新速率和可用性的两个核心参数。它们可以设置为数值(整数)或百分比,默认值均为 25%。

参数 定义 默认值 作用
maxSurge 滚动更新过程中,允许超出期望副本数的最大 Pod 数量。 25% 控制更新速度,值越大,一次性创建的新 Pod 越多,更新越快。
maxUnavailable 滚动更新过程中,允许不可用 Pod 的最大数量(相对于期望副本数)。 25% 控制服务可用性,值越大,允许同时终止的旧 Pod 越多,但服务容量下降越多。
计算规则:当使用百分比时,Kubernetes 会向上取整计算实际数值。例如,期望副本数为 4,maxSurge=25% 时,实际允许超出 1 个 Pod(4 * 25% = 1,向上取整为 1)。

3.3 参数组合与行为分析

不同的参数组合会产生不同的滚动更新行为。理解这些组合对于设计合理的更新策略至关重要。

maxSurge 与 maxUnavailable 参数组合行为 maxSurge 与 maxUnavailable 参数组合行为 场景一:快速更新 maxSurge: 50% maxUnavailable: 0% 先创建新 Pod,再终止旧 Pod 更新快,资源峰值高 场景二:保守更新 maxSurge: 0% maxUnavailable: 25% 先终止旧 Pod,再创建新 Pod 更新慢,资源峰值低 场景三:默认配置 maxSurge: 25% maxUnavailable: 25% 新旧 Pod 交替替换 更新速度与可用性平衡 参数组合对集群资源的影响 • 高 maxSurge + 低 maxUnavailable:更新速度快,但会瞬间消耗大量额外资源(CPU/内存),可能导致集群资源紧张。 • 低 maxSurge + 高 maxUnavailable:资源消耗平稳,但更新速度慢,且服务容量会暂时下降,可能影响用户体验。 • 默认配置 (25%/25%):在大多数场景下提供了更新速度与可用性的良好平衡,是推荐的起始配置。

3.4 参数配置示例

以下是一个 Deployment 的 YAML 配置示例,展示了如何设置 maxSurge 和 maxUnavailable:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1          # 允许超出期望副本数 1 个 Pod
      maxUnavailable: 0    # 不允许有不可用的 Pod
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:v2
        resources:
          requests:
            cpu: "500m"
            memory: "256Mi"
          limits:
            cpu: "1"
            memory: "512Mi"
注意:当 maxUnavailable 设置为 0 时,滚动更新会严格保证服务容量不下降,但更新速度会变慢,因为必须等待新 Pod 完全就绪后,才能终止旧 Pod。这种配置在资源紧张的环境中可能导致更新卡住。

3.5 滚动更新与资源配额的关系

滚动更新过程中,新旧 Pod 会同时存在一段时间,这会导致集群资源使用量出现临时峰值。这个峰值的大小直接由 maxSurge 参数决定。

期望副本数 maxSurge maxUnavailable 更新期间最大 Pod 数 更新期间最小可用 Pod 数
10 25% (3) 25% (3) 13 7
10 50% (5) 0% (0) 15 10
10 0% (0) 25% (3) 10 7
10 1 1 11 9

从表中可以看出,maxSurge 越大,更新期间的最大 Pod 数就越多,对资源配额的需求也越高。在 Argo CD 的自动化部署场景中,如果集群资源配额设置不当,滚动更新可能会因为资源不足而失败或卡住。

关键结论:在配置 Argo CD 管理的应用时,必须将滚动更新带来的资源峰值纳入资源配额的计算中。建议在集群资源配额中预留 期望副本数 × (1 + maxSurge) 的资源量,以确保滚动更新能够顺利进行。