Argo Rollouts 核心概念:资源定义与发布策略

Argo Rollouts 是 Kubernetes 原生的渐进式交付控制器,它通过自定义资源 Rollout 替代原生 Deployment,为应用提供灰度(Canary)和蓝绿(Blue-Green)两种高级发布策略,并内置自动回滚机制。理解这些核心概念是掌握实战演练的基础。

2.1 Rollout 资源定义

Rollout 是 Argo Rollouts 的核心自定义资源(CRD),其 YAML 结构与 Kubernetes Deployment 高度相似,但增加了 strategy 字段来定义发布策略。一个典型的 Rollout 资源包含以下关键部分:

字段路径 说明 示例值
apiVersion API 版本 argoproj.io/v1alpha1
kind 资源类型 Rollout
spec.replicas 期望副本数 5
spec.template Pod 模板(与 Deployment 一致) 包含容器镜像、端口等
spec.strategy 发布策略定义(核心差异) canary 或 bluegreen
关键区别: 原生 Deployment 仅支持滚动更新(RollingUpdate),而 Rollout 通过 spec.strategy 字段支持灰度(Canary)和蓝绿(Blue-Green)两种高级策略,并提供了自动回滚、流量分割、指标分析等原生 Deployment 不具备的能力。

2.2 灰度(Canary)策略

灰度策略将新版本应用逐步暴露给一小部分用户流量,在验证新版本稳定后,再逐步增加流量比例,直至完全替换旧版本。这种策略风险最低,适合大多数生产环境。

适用场景: 功能验证、性能测试、用户体验反馈收集。灰度策略允许你在影响最小化的前提下,快速发现并修复问题。

灰度策略的核心参数定义在 spec.strategy.canary 下:

spec:
  strategy:
    canary:
      steps:
      - setWeight: 10
      - pause: {duration: 60}
      - setWeight: 50
      - pause: {duration: 120}
      - setWeight: 100
      - pause: {duration: 0}
参数 说明 示例
steps[].setWeight 设置灰度实例接收流量的百分比 10 表示 10% 流量
steps[].pause.duration 在当前步骤暂停的时长(秒),用于观察 60 表示暂停 60 秒
steps[].pause(无 duration) 无限期暂停,需手动批准(Promote) pause: {}
analysis 关联 AnalysisTemplate 进行自动指标分析 见后续章节
灰度(Canary)发布流程 灰度(Canary)发布流程 初始状态 旧版本 100% Step 1: 10% 灰度 10% 流量 Step 2: 50% 灰度 50% 流量 Step 3: 100% 全量发布 暂停与自动回滚 每个步骤可设置 pause.duration 等待观察 若指标异常,自动触发回滚到旧版本 回滚 灰度策略通过逐步增加流量比例,降低新版本发布风险 每个步骤可设置暂停时长或等待人工批准 结合 Analysis 可实现全自动指标驱动的发布决策

2.3 蓝绿(Blue-Green)策略

蓝绿策略同时维护两个完整的环境:蓝环境(当前稳定版本)和绿环境(新版本)。发布时,先在新环境(绿)中部署并验证,验证通过后,一次性将流量从蓝环境切换到绿环境。这种策略切换速度快,但资源消耗较高。

注意事项: 蓝绿策略需要双倍资源(两套完整副本),且切换瞬间流量变化剧烈,适合对切换速度要求高、且能接受资源冗余的场景。

蓝绿策略的核心参数定义在 spec.strategy.bluegreen 下:

spec:
  strategy:
    bluegreen:
      activeService: my-app-active
      previewService: my-app-preview
      autoPromotionEnabled: false
      scaleDownDelaySeconds: 300
参数 说明 示例
activeService 接收生产流量的 Service 名称 my-app-active
previewService 新版本预览 Service 名称(用于验证) my-app-preview
autoPromotionEnabled 是否自动切换流量(false 需手动批准) false
scaleDownDelaySeconds 切换后延迟缩容旧版本的时间(秒) 300
蓝绿(Blue-Green)发布流程 蓝绿(Blue-Green)发布流程 阶段 1:初始状态 蓝环境(旧版本) activeService 指向蓝 绿环境(空) 阶段 2:部署绿 蓝环境(旧版本) 绿环境(新版本) previewService 指向绿 阶段 3:切换流量 activeService 指向绿 蓝环境(待缩容) 绿环境(新版本) 关键特性 切换瞬间完成,无流量渐进过程 切换后旧版本(蓝)按 scaleDownDelaySeconds 延迟缩容,便于快速回滚 回滚 蓝绿策略适合需要快速切换、且能接受双倍资源消耗的场景 通过 autoPromotionEnabled 控制是否自动切换,支持人工审批

2.4 自动回滚机制

自动回滚是 Argo Rollouts 的核心价值之一。当发布过程中检测到异常(如错误率升高、延迟增加、健康检查失败),Rollout 控制器会自动将应用回滚到上一个稳定版本,无需人工干预。

自动回滚的触发条件包括:

  • 指标分析失败: 通过 AnalysisTemplate 定义的指标(如 HTTP 错误率 > 5%)触发失败。
  • Pod 健康检查失败: 新版本 Pod 无法通过就绪探针(Readiness Probe)或存活探针(Liveness Probe)。
  • 手动回滚: 通过 kubectl argo rollouts abort 命令手动触发。
  • 发布超时: 在指定时间内未完成发布(通过 progressDeadlineSeconds 配置)。
回滚流程: 当触发回滚时,Rollout 控制器会立即将流量切回旧版本,并终止新版本的部署。旧版本的 ReplicaSet 会重新扩展至期望副本数,新版本的 ReplicaSet 会被缩容至 0。整个过程自动完成,无需人工操作。

自动回滚的配置示例:

spec:
  strategy:
    canary:
      analysis:
        templates:
        - templateName: error-rate-analysis
        args:
        - name: service-name
          value: my-app
      steps:
      - setWeight: 10
      - pause: {duration: 60}
      - setWeight: 50
      - pause: {duration: 120}
      - setWeight: 100
  progressDeadlineSeconds: 600  # 发布超时时间
回滚触发方式 配置字段 说明
指标分析失败 spec.strategy.canary.analysis 关联 AnalysisTemplate,自动评估指标
Pod 健康检查失败 spec.template.spec.containers[].readinessProbe Kubernetes 原生健康检查机制
手动回滚 kubectl argo rollouts abort <rollout-name> 运维人员手动干预
发布超时 spec.progressDeadlineSeconds 超过指定时间未完成发布则回滚
最佳实践: 建议在生产环境中至少配置一种自动回滚机制(推荐使用 AnalysisTemplate 进行指标分析),并设置合理的 progressDeadlineSeconds 作为兜底。同时,灰度策略的每个步骤都应设置足够的暂停时间,以便指标分析有足够的数据样本。