Argo Rollouts 蓝绿发布与业务门禁
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| ALB | Application Load Balancer | 应用负载均衡器 |
| API | Application Programming Interface | 应用程序编程接口 |
| CD | Continuous Delivery / Continuous Deployment | 持续交付/持续部署;是否自动上线取决于流程 |
| CI | Continuous Integration | 持续集成 |
| CLI | Command-Line Interface | 命令行接口 |
| HA | High Availability | 高可用 |
| IP | Internet Protocol | 网际协议;IP 地址是网络寻址标识 |
| NaN | Not a Number | 非数值结果 |
| PDB | Pod Disruption Budget | Pod 中断预算,约束自愿驱逐 |
| TCP | Transmission Control Protocol | 传输控制协议 |
| TLS | Transport Layer Security | 传输层安全协议 |
前置:实践约定、固定 Argo Rollouts controller/CLI、真实 API 及预生产数据库、TLS Gateway;数据库必须兼容新旧两版。本文使用新名字部署 Rollout,不与已有 Deployment 抢同一 selector。
1. 安装并准备业务清单#
export ROLLOUTS_VERSION='vREPLACE_VERSION'
curl -fsSL "https://github.com/argoproj/argo-rollouts/releases/download/$ROLLOUTS_VERSION/install.yaml" -o rollouts-install.yaml
kubectl create namespace argo-rollouts --dry-run=client -o yaml | kubectl apply -f -
kubectl apply -n argo-rollouts -f rollouts-install.yaml
kubectl -n argo-rollouts rollout status deployment/argo-rollouts --timeout=5m
kubectl argo rollouts version安装清单经审查后纳入平台 Git,按当前版本 leader election/HA 支持配置副本、PDB、资源与分散。为业务保存 rollout.yaml:
apiVersion: v1
kind: Service
metadata: {name: orders-active, namespace: orders}
spec:
selector: {app: orders-progressive}
ports: [{name: http, port: 80, targetPort: http}]
---
apiVersion: v1
kind: Service
metadata: {name: orders-preview, namespace: orders}
spec:
selector: {app: orders-progressive}
ports: [{name: http, port: 80, targetPort: http}]
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata: {name: orders-progressive, namespace: orders}
spec:
replicas: 3
revisionHistoryLimit: 3
selector:
matchLabels: {app: orders-progressive}
strategy:
blueGreen:
activeService: orders-active
previewService: orders-preview
autoPromotionEnabled: false
scaleDownDelaySeconds: 120
template:
metadata:
labels: {app: orders-progressive}
spec:
serviceAccountName: orders-api
automountServiceAccountToken: false
terminationGracePeriodSeconds: 90
securityContext: {runAsNonRoot: true, seccompProfile: {type: RuntimeDefault}}
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector: {matchLabels: {app: orders-progressive}}
containers:
- name: api
image: REPLACE_APPROVED_V1_IMAGE_AT_DIGEST
ports: [{name: http, containerPort: 8080}]
envFrom: [{secretRef: {name: orders-runtime}}]
resources:
requests: {cpu: 500m, memory: 512Mi}
limits: {cpu: '2', memory: 1Gi}
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities: {drop: [ALL]}
startupProbe:
httpGet: {path: /healthz, port: http}
periodSeconds: 5
failureThreshold: 30
readinessProbe:
httpGet: {path: /readyz, port: http}
livenessProbe:
httpGet: {path: /healthz, port: http}
volumeMounts: [{name: tmp, mountPath: /tmp}]
volumes: [{name: tmp, emptyDir: {sizeLimit: 256Mi}}]
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata: {name: orders-progressive, namespace: orders}
spec:
minAvailable: 2
selector: {matchLabels: {app: orders-progressive}}PDB 匹配新旧两版,不能单凭它保证 active 副本可用,维护时另检查 active ReplicaSet。为新标签补齐 NetworkPolicy、ServiceMonitor 和入口路由,初始只绑定测试域名;preview 入口仅内网鉴权,避免绕过生产访问控制。
2. 首次部署与预览#
kubectl apply --dry-run=server -f rollout.yaml
kubectl apply -f rollout.yaml
kubectl argo rollouts status orders-progressive -n orders --timeout=10m
kubectl -n orders get svc orders-active orders-preview -o yaml首次部署与已有版本更新的 pause 行为不同;先建立健康 v1,再用独立测试域名验证 orders-active 全链路。确认容量可同时容纳两套三副本和 surge、Quota/IP 足够。
3. 发布 v2 并执行门禁#
export NEW_IMAGE='REPLACE_APPROVED_V2_IMAGE_AT_DIGEST'
kubectl argo rollouts set image orders-progressive "api=$NEW_IMAGE" -n orders
kubectl argo rollouts get rollout orders-progressive -n orders
kubectl -n orders get endpointslices -l kubernetes.io/service-name=orders-preview新 ReplicaSet Ready、preview Service 指向新 hash,active 仍旧 hash。通过仅内部可达的 preview 域名运行 综合项目 的业务测试;持续压测 active 确认无退化。
| 门禁 | 要求 |
|---|---|
| 正确性 | 创建/查询订单、幂等重放、消息与账务对账 |
| 性能 | 至少一个稳定观测窗口的请求数、错误率、p95/p99,不用零流量“全绿” |
| 数据兼容 | v1/v2 同时读写成功,回退仍可读 v2 数据 |
| 身份与依赖 | 错误身份拒绝,数据库连接/队列积压没有超预算 |
生产将这些检查做成 CI 必过 job,CI 只有全部成功才可执行 promote;进一步自动化可使用 AnalysisTemplate/AnalysisRun,查询应限定新 revision、处理空结果/NaN并设置失败阈值。本文采用明确的暂停+CI 门禁,不宣称已配置自动指标回滚。
kubectl argo rollouts promote orders-progressive -n orders
kubectl argo rollouts status orders-progressive -n orders --timeout=10m4. 失败恢复#
promote 前失败:kubectl argo rollouts abort orders-progressive -n orders,保持旧 active,Git 恢复旧 digest。切流后观察到回归:回退 Git 的镜像,执行 kubectl argo rollouts undo orders-progressive -n orders(仅独立 CLI 演练),检查 active selector、EndpointSlice 与真实业务,而非只看命令成功。
旧 ReplicaSet 已缩容时,回退可能需要重新启动副本,且 autoPromotionEnabled: false 可能让恢复版本再次暂停。执行 get rollout 检查状态;若停在待晋级阶段,先验证恢复版本的 preview,再执行 promote,最后等待 Healthy:
kubectl argo rollouts get rollout orders-progressive -n orders
kubectl -n orders get svc orders-active orders-preview -o yaml
# 仅在恢复版本已通过验证且确实等待晋级时执行:
kubectl argo rollouts promote orders-progressive -n orders
kubectl argo rollouts status orders-progressive -n orders --timeout=10m
kubectl -n orders get endpointslices -l kubernetes.io/service-name=orders-active本路径以 Gateway 数据面为入口;如果 ALB 直接注册业务 Pod,不把修改 Service selector 视为原子切流,需使用已验证的 ALB 集成/权重切换流程并测量目标注册延迟。
蓝绿 Service 切换不等于旧 TCP 连接即时切换;保留旧副本等待连接排空,数据库破坏性变更不能通过 undo 修复。迁移正式入口前评审 HTTPRoute/Service 所有权;Argo CD 需允许 Rollout 资源并忽略 controller 管理的 Service selector 字段,避免抢写。