跳到主要内容

渐进式交付实践

Argo Rollouts 是一款 Kubernetes Controller,提供更加高级且平滑的渐进式交付(Progressive Delivery)功能,例如金丝雀发布 (Canary)蓝绿发布 (Blue-Green)。它在功能上完美替代并超越了 K8s 原生 Deployment 的滚动更新(RollingUpdate)。


1. 金丝雀发布模型(Rollout CRD)

以下是一个生产级的 Rollout 清单,使用了 Istio 流量网格实现基于比例的精准流量切分:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: payment-service
namespace: default
spec:
replicas: 5
strategy:
canary:
# 用于灰度流量比例划分的服务与路由定义
stableService: payment-stable-svc
canaryService: payment-canary-svc
trafficRouting:
istio:
virtualService:
name: payment-vs
routes:
- primary # 对应 virtualService 中的路由名
# 灰度发布的具体步骤
steps:
- setWeight: 10 # 1. 引入 10% 的生产流量到新版本中
- pause: {duration: 1h} # 2. 暂停 1 小时,由运维和测试观察监控/APM
- setWeight: 30 # 3. 流量提升到 30%
- pause: {} # 4. 无时间限制暂停,等待运维通过 CLI 手动点击确认继续
- setWeight: 60 # 5. 提升到 60%
- pause: {duration: 30m}
- setWeight: 100 # 6. 100% 发布,完成旧版本 Pods 的平滑回收
template:
metadata:
labels:
app: payment-service
spec:
containers:
- name: app
image: registry.company.com/apps/payment-service:v2.0.0
ports:
- containerPort: 8080

2. 命令行运维与发布控制

使用 kubectl-argo-rollouts 插件可以直观、图形化地查看发布进度:

# 1. 实时监控金丝雀发布的每一个 Pod 状态和流量权重
kubectl argo rollouts get rollout payment-service -n default

# 2. 手动终止当前灰度发布,恢复流量,自动将新容器下线(秒级回滚安全保证)
kubectl argo rollouts abort payment-service -n default

# 3. 在步骤 4 处于无限期暂停时,手动输入命令确认,继续后续的流量合并
kubectl argo rollouts promote payment-service -n default

# 4. 重试处于中止或卡住状态的灰度
kubectl argo rollouts retry payment-service -n default