Kubernetes原生Deployment做滚动更新只能按比例增减副本,无法依据指标自动判断新版本好坏。Argo Rollouts是渐进式交付(Progressive Delivery)工具,用金丝雀策略配合Prometheus指标自动推进或回滚,把上线决策从人工观察变成指标驱动。本文从安装、Rollout资源定义、分析策略到流量切换,给出可直接落地的配置。
渐进式交付与滚动更新的区别
传统Deployment更新策略靠maxSurge和maxUnavailable控制副本比例,但不具备灰度分析能力。Argo Rollouts新增了strategy、analysis、trafficRouting三段核心配置:灰度放量比例可编排,每步等待指标验证;指标不通过自动回滚。上线期间保持新旧版本共存,旧版本随时可切回。
安装与基础Rollout定义
安装控制器与CLI:
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
kubectl argo rollouts version
一个最小金丝雀Rollout:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: web-app
spec:
replicas: 5
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: app
image: registry.example.com/web-app:v2.0.0
ports:
- containerPort: 8080
strategy:
canary:
steps:
- setWeight: 20
- pause: {duration: 2m}
- setWeight: 60
- pause: {duration: 2m}
- setWeight: 100
steps定义了放量节奏:先切20%流量观察2分钟,再切60%观察,全部切换。中间任意一步分析失败,自动回退。
分析模板与自动回滚触发
回滚靠AnalysisTemplate执行指标查询。以Prometheus HTTP错误率为例:
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: http-error-rate
spec:
metrics:
- name: error-rate
interval: 30s
count: 5
failureLimit: 3
provider:
prometheus:
address: http://prometheus.monitoring:9090
query: |
sum(rate(nginx_http_requests_total{status=~"5.."}[2m]))
/ sum(rate(nginx_http_requests_total[2m]))
AnalysisRun每30秒拉取一次指标,错误率超过阈值判定失败,Rollout自动把流量切回100%稳定版本。
流量路由:与Ingress/Service Mesh集成
Argo Rollouts支持多种流量路由后端。采用Ingress NGINX时,通过canary Service按权重分流:
strategy:
canary:
trafficRouting:
nginx:
stableIngress: web-ingress
steps:
- setWeight: 20
- pause: {duration: 2m}
采用Istio时,接入VirtualService权重切换,可做到Header级灰度(按用户ID分流),适合需要内测灰度场景。
灰度部署的验收与回滚验证
灰度过程中用CLI观测状态:
kubectl argo rollouts get rollout web-app --watch
kubectl argo rollouts status web-app
模拟失败:构造一个带bug的镜像发布,观察AnalysisRun状态变为Failing,确认Rollout自动回滚,记录回滚耗时。回滚后验证新副本被移除、老版本服务恢复,并核对Prometheus错误率回落,这才算完整走通一次渐进式交付。
生产落地注意事项
AnalysisTemplate的查询条件务必在生成集群确认过数据口径,比如HTTP错误率统计范围、status维度是否完整,避免误判。指标查询间隔不宜小于30秒,避免压垮Prometheus。灰度测试期间资源开销会翻倍,容量规划时预留1.5倍副本。Argo Rollouts不会自动清理历史ReplicaSet,定期清理避免集群资源泄漏。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/wang-zhan-yun-wei-shi-zhan-argorollouts-jian-jin-shi-jiao/