用 Argo Rollouts 做渐进式发布

适用场景

Deployment 的原生滚动更新粒度太粗,需要按比例灰度、蓝绿切换、自动分析指标和快速回滚。Argo Rollouts 适合对可用性和发布风险敏感的服务。

前置条件

步骤

  1. 安装控制器和插件:
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
  1. 把 Deployment 改成 Rollout,先做 10%→50%→100% 的金丝雀:
kubectl apply -f - <<'EOF'
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: demo
spec:
  replicas: 4
  strategy:
    canary:
      steps:
      - setWeight: 10
      - pause: {duration: 5m}
      - setWeight: 50
      - pause: {duration: 5m}
      - setWeight: 100
  selector:
    matchLabels: {app: demo}
  template:
    metadata:
      labels: {app: demo}
    spec:
      containers:
      - name: app
        image: example/demo:v2
EOF
  1. 配置 Service 和流量切分。使用 Istio 时引用 VirtualService;使用 Nginx Ingress 时配置 canary annotations。

  2. 添加 AnalysisTemplate,自动判断成功率:

kubectl apply -f - <<'EOF'
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: success-rate
spec:
  metrics:
  - name: success-rate
    interval: 1m
    successCondition: result[0] >= 0.99
    failureLimit: 2
    provider:
      prometheus:
        address: http://prometheus.monitoring:9090
        query: |
          sum(rate(http_requests_total{job="demo",code!~"5.."}[1m]))
          / sum(rate(http_requests_total{job="demo"}[1m]))
EOF
  1. 发布和观察:
kubectl argo rollouts get rollout demo --watch
kubectl argo rollouts promote demo
kubectl argo rollouts abort demo
  1. 蓝绿发布使用 strategy.blueGreen,配置 activeService 和 previewService,验证 preview 后再切换。

验证

回滚

常见坑

相关命令