Deployment 的原生滚动更新粒度太粗,需要按比例灰度、蓝绿切换、自动分析指标和快速回滚。Argo Rollouts 适合对可用性和发布风险敏感的服务。
kubectl argo rollouts 插件。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
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
配置 Service 和流量切分。使用 Istio 时引用 VirtualService;使用 Nginx Ingress 时配置 canary annotations。
添加 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
kubectl argo rollouts get rollout demo --watch
kubectl argo rollouts promote demo
kubectl argo rollouts abort demo
strategy.blueGreen,配置 activeService 和 previewService,验证 preview 后再切换。kubectl argo rollouts history demo 能看到版本记录。kubectl argo rollouts undo demo 回到上一个稳定版本。abort 会停止当前发布并保留旧版本。pause 没有设置时长也没有人工 promote,发布长期停在中间状态。failureLimit,偶发指标抖动导致误回滚。kubectl argo rollouts — 查看、推进、中止和回滚kubectl — 管理 Rollout、Service 和 AnalysisTemplatepromtool — 校验 PromQListioctl / nginx — 检查流量切分配置