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=10m

4. 失败恢复#

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 字段,避免抢写。

参考:蓝绿机制、Analysis。

其他发布方式与选型见 部署策略路线,基于真实请求比例的演练见 Canary。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭