argo rollouts 在 linux 中实现基于 prometheus 流量指标的自动金丝雀发布,通过 rollout 配置权重与暂停、analysistemplate 定义错误率等健康条件、结合 istio 等路由组件完成自动放量或回滚。

在 Linux 环境下用 Argo Rollouts 实现基于流量指标的自动金丝雀推进,核心是让新版本按权重接收流量,同时实时采集 Prometheus 指标(如错误率、延迟),满足条件才继续放量,异常则自动回滚。整个过程不依赖人工干预,关键在于 Rollout 配置、AnalysisTemplate 定义和流量路由集成三者协同。
安装与基础准备
确保集群已就绪:
- 通过
kubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml安装 Argo Rollouts 控制器 - 安装 kubectl 插件:
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64 && chmod +x ./kubectl-argo-rollouts-linux-amd64 && sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts - 确认已部署 Istio(或 Nginx Ingress / ALB)并配置好 VirtualService;Prometheus 必须可查,且已采集
http_requests_total等基础指标
定义带分析的金丝雀 Rollout
Rollout 资源需明确指定 canary 策略、每阶段流量权重、暂停时长,以及关键的 analysis 步骤:
- setWeight 控制新版本接收的流量百分比(如 5、20、50)
-
pause 提供观察窗口,单位支持
s、m、h - analysis 引用 AnalysisTemplate,在该阶段执行指标校验;失败即终止流程并回滚
- trafficRouting 必须配置(如 istio.virtualService),否则仅做副本伸缩,不切流量
示例片段(rollout.yaml):
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
canary:
steps:
- setWeight: 5
- pause: {duration: 2m}
- setWeight: 20
- pause: {duration: 3m}
- setWeight: 50
- analysis:
templates:
- templateName: error-rate-check
args:
- name: service
value: myapp
trafficRouting:
istio:
virtualService:
name: myapp-vs
编写 AnalysisTemplate 验证指标
AnalysisTemplate 描述“什么算健康”,它调用 Prometheus 查询,设定成功条件与采样频率:
- 查询语句要能区分新旧版本(例如加 label
version="v2"或利用 Istio 的 subset 标签) -
successCondition是布尔表达式,如result[0] 表示错误率 ≤1% -
interval决定多久查一次;count或duration控制总共运行几次或多久
示例(analysis-template.yaml):
apiVersion: argoproj.io/v1alpha1kind: AnalysisTemplate
metadata:
name: error-rate-check
spec:
metrics:
- name: error-rate
interval: 30s
successCondition: result[0] failureLimit: 3
provider:
prometheus:
serverAddress: http://prometheus-server.prometheus.svc:9090
query: |
sum(rate(http_requests_total{app="myapp",version="v2",status=~"5.*"}[1m])) /
sum(rate(http_requests_total{app="myapp",version="v2"}[1m]))
触发与验证自动推进
提交后,Argo Rollouts 会自动执行流程,你可通过 CLI 或 Dashboard 观察状态:
- 运行
kubectl argo rollouts get rollout myapp-rollout --watch查看当前阶段、权重、分析结果 - 若某阶段 analysis 失败(如连续 3 次错误率超阈值),Rollout 状态变为
Progressing→Failed,控制器立即把流量权重切回 0%,并缩容新版本 Pod - 所有步骤完成后,Rollout 进入
Healthy状态,新版本接管全部流量 - 手动干预可用:
kubectl argo rollouts abort myapp-rollout强制中止,kubectl argo rollouts promote myapp-rollout跳过当前 pause










