第 9 章 · 蓝绿与金丝雀发布跟练
本章目标:在 staging-app 完成 蓝绿零停机切换 与 Ingress 金丝雀渐进流量;与 ch07 监控 联动对比蓝/绿指标;掌握大促发布节奏与秒级回切。
学时建议:3~3.5 小时(含 2.5 小时跟练)
前置:ops-deploy ch04 滚动升级;ch07 监控 Dashboard;架构 ch03 发布策略设计。
9.1 场景说明
| 项目 | 内容 |
|---|---|
| 背景 | demo-api 2.0.0 大版本含 checkout 重构;滚动升级风险高,需秒级回切能力 |
| 决策 | staging 用蓝绿验证切换;prod 大促前用金丝雀 5%→20%→100% |
| 你的角色 | 发布执行 + 监控值守 |
| 本章任务 | 蓝绿切换+回切;金丝雀 10% 运行 15min 并记录对比指标 |
| 约束 | 每阶段最小观察 15min;未达标 禁止 提权重 |
9.2 学完你能
| 能力 | 验收标准 |
|---|---|
| 策略选型 | 滚动/蓝绿/金丝雀场景对照 |
| 蓝绿实操 | 双 Deployment + Service selector 切换 |
| 金丝雀实操 | Ingress canary-weight 分阶段 |
| 监控对比 | 蓝绿 5xx/P99 表格 |
| DB 协同 | 破坏性迁移时为何不能简单蓝绿 |
| 回滚对比 | 三种策略 RTO 排序 |
9.3 策略选型
| 场景 | 推荐 | 原因 |
|---|---|---|
| 常规迭代 | 滚动(ch04) | 资源省 |
| 大版本 / Schema 变更 | 蓝绿 | 秒级回切 |
| 高风险功能 | 金丝雀 | 控制爆炸半径 |
| 大促期间 | 金丝雀 5%→20%→100% | 观察错误预算 |
9.4 逐步跟练 · 剧本 A:蓝绿发布(约 60 分钟)
拓扑:demo-api-blue(v1.4.3)+ demo-api-green(v2.0.0),共用 Service demo-api。
步骤 1 — 部署 green(不挂流量)
# demo-api-green Deployment 片段
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-api-green
namespace: staging-app
labels: { app: demo-api, version: green }
spec:
replicas: 2
selector:
matchLabels: { app: demo-api, version: green }
template:
metadata:
labels: { app: demo-api, version: green }
spec:
containers:
- name: api
image: registry.devops.svc:5000/demo-api:2.0.0
应用部署 → staging-app 创建 green;Service 仍 selector version: blue。
你应该看到:green Pod Running;系统容器 内 curl green Pod IP /health 200。
步骤 2 — 内网冒烟
# 进入集群内 jump pod 或 port-forward green
curl -sf http://<green-pod-ip>:8080/health
curl -sf http://<green-pod-ip>:8080/api/v1/products
步骤 3 — 切换流量(<1min)
kubectl patch service demo-api -n staging-app \
-p '{"spec":{"selector":{"app":"demo-api","version":"green"}}}'
或小紫 应用部署 → Service demo-api → 编辑 selector。
你应该看到:运维 → 监控告警 Dashboard 流量切到 green;5xx 无突增。
步骤 4 — 观察 5min,失败则回切
kubectl patch service demo-api -n staging-app \
-p '{"spec":{"selector":{"app":"demo-api","version":"blue"}}}'
RTO:selector 改回 < 1 分钟。
9.5 逐步跟练 · 剧本 B:金丝雀发布(约 90 分钟)
前提:集群 Ingress 支持 canary(Nginx Ingress / APISIX)。
步骤 1 — 部署 canary Deployment + Service
demo-api-canary→ 镜像 2.0.0demo-api-stable→ 镜像 1.4.3
步骤 2 — 创建金丝雀 Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-api-canary
namespace: staging-app