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 进行自动指标分析 | 见后续章节 |
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 |
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 作为兜底。同时,灰度策略的每个步骤都应设置足够的暂停时间,以便指标分析有足够的数据样本。