3. 蓝绿发布流程与操作:发布前检查清单、流量切换步骤、回滚操作流程、常见自动化工具
蓝绿发布的核心在于维护两套完全独立的生产环境——蓝环境(当前稳定版本)与绿环境(新版本)。发布流程的严谨性直接决定故障恢复速度(MTTR)与业务连续性。本节从检查清单、流量切换、回滚操作到自动化工具,构建完整的操作体系。
3.1 发布前检查清单
发布前检查是降低故障概率的第一道防线。以下清单按基础设施、应用配置、数据层、监控告警四个维度组织:
| 维度 | 检查项 | 验证方式 | 常见遗漏 |
|---|---|---|---|
| 基础设施 | 绿环境资源配额(CPU/内存/存储) | 云平台配额检查 + kubectl describe node | 突发流量下节点自动扩缩容策略未验证 |
| 基础设施 | 网络策略与安全组规则 | 连通性测试(telnet/curl) | 跨AZ/跨VPC的防火墙规则遗漏 |
| 应用配置 | 环境变量与Secret一致性 | diff工具对比蓝绿环境配置 | 数据库连接串、第三方未同步 |
| 应用配置 | 健康检查端点(/health /ready) | curl -f 返回200 | Readiness Probe与Liveness Probe混淆 |
| 数据层 | Schema兼容性(向后兼容) | 数据库迁移脚本dry-run | 新增NOT NULL列导致旧版本写入失败 |
| 数据层 | 缓存预热策略 | 模拟流量触发缓存填充 | 冷启动导致大量缓存穿透 |
| 监控告警 | 绿环境指标采集与Dashboard | Grafana面板数据可见 | 自定义业务指标未接入 |
| 监控告警 | 告警规则覆盖(错误率/延迟/饱和度) | 触发测试告警验证通知链路 | PagerDuty/钉钉/企微webhook未配置 |
SRE 实践建议:将检查清单编码为自动化脚本(如 Python + kubectl + curl),在发布流水线中作为前置门禁(Gate)。任何一项检查失败则阻断发布,避免人工遗漏。
3.2 流量切换步骤
流量切换是蓝绿发布的核心操作,通常分为灰度验证与全量切换两个阶段。以下为标准的5步切换流程:
- 预热绿环境:启动绿环境后,先发送少量内部探测流量(如健康检查、影子流量),确认应用正常响应。
- 灰度切流(1%-5%):通过负载均衡器(如 Nginx/ALB/Envoy)将1%-5%的生产流量导向绿环境,持续观察5-15分钟。
- 指标验证:对比蓝绿环境的错误率(<1%)、P99延迟(<基线+10%)、业务成功率(>99.9%)。
- 逐步切流(25% → 50% → 100%):每步间隔3-5分钟,观察指标无异常后继续。
- 流量锁定与蓝环境保留:全量切换后,蓝环境保持运行至少30分钟(或一个完整业务周期),用于快速回滚。
关键指标阈值(参考):
- HTTP 5xx 错误率 < 0.5%
- P99 延迟增加 < 20%
- 业务核心接口成功率 > 99.9%
- 无新增告警(P0/P1级别)
3.3 回滚操作流程
回滚是蓝绿发布的核心优势——只需将负载均衡流量切回蓝环境,无需重新部署。但回滚决策必须基于明确的故障判定标准,避免盲目操作。标准回滚流程如下:
| 步骤 | 操作 | 时间目标 | 负责人 |
|---|---|---|---|
| 1. 故障判定 | 确认错误率 > 5% 或 P99延迟 > 基线2倍 或 核心业务中断 | < 1分钟 | 值班SRE |
| 2. 决策通知 | 在故障群组发出回滚决策,确认无反对意见 | < 30秒 | 值班SRE / 发布经理 |
| 3. 执行回滚 | 负载均衡器将流量权重从绿环境100%切回蓝环境100% | < 10秒 | 自动化工具 / SRE |
| 4. 验证恢复 | 确认蓝环境错误率恢复至基线,业务指标正常 | < 2分钟 | 值班SRE |
| 5. 绿环境隔离 | 停止绿环境服务,保留现场用于根因分析 | < 5分钟 | SRE / 开发 |
回滚避坑指南:
- 数据库回滚陷阱:如果新版本包含数据库Schema变更(如新增列、修改索引),回滚后旧版本可能无法兼容新Schema。解决方案:确保所有Schema变更都是向后兼容的,或使用数据库版本化迁移工具(如 Flyway/Liquibase)支持回滚。
- 缓存与Session状态:回滚后,绿环境产生的缓存数据可能污染蓝环境。建议在回滚时清空共享缓存(如Redis),或使用环境隔离的缓存实例。
- 异步消息积压:新版本可能向消息队列发送了旧版本无法处理的消息格式。回滚后需检查并清理异常消息。
3.4 常见自动化工具
蓝绿发布的自动化程度直接影响MTTR。以下对比业界主流工具:
| 工具 | 部署模型 | 流量切换方式 | 回滚机制 | 适用场景 |
|---|---|---|---|---|
| Spinnaker | Pipeline驱动,支持K8s/ECS/VM | 通过负载均衡器权重调整(内置蓝绿策略) | 一键回滚到上一版本(保留历史部署快照) | 大型微服务、多云/混合云、复杂发布策略 |
| ArgoCD | GitOps,K8s原生 | Service + Ingress权重切换(需配合Argo Rollouts) | Git回滚(revert commit)自动同步 | K8s原生环境、GitOps工作流、云原生应用 |
| Flagger | K8s Operator,与Istio/NGINX集成 | 服务网格流量权重(自动渐进式切换) | 自动回滚(基于Prometheus指标) | 服务网格(Istio/Linkerd)、自动化灰度发布 |
| Jenkins X | Pipeline + K8s,内置环境管理 | 通过Preview Environment验证后Promote | 环境版本回退(基于Git标签) | 云原生CI/CD一体化、快速原型验证 |
3.5 自动化工具关键配置示例
以下为ArgoCD配合Argo Rollouts实现蓝绿发布的简化配置片段:
# argo-rollouts-bluegreen.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: myapp-bluegreen
spec:
replicas: 5
revisionHistoryLimit: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.2.3
ports:
- containerPort: 8080
strategy:
blueGreen:
# 蓝环境Service(当前稳定版本)
activeService: myapp-active
# 绿环境Service(新版本预览)
previewService: myapp-preview
# 自动回滚条件:基于Prometheus指标
autoPromotionEnabled: false
scaleDownDelaySeconds: 1800 # 蓝环境保留30分钟
prePromotionAnalysis:
templates:
- templateName: success-rate
args:
- name: service-name
value: myapp-preview
工具选型建议:
- 如果团队已深度使用K8s且推崇GitOps,优先选择ArgoCD + Argo Rollouts,回滚速度最快(Git revert + 自动同步)。
- 如果环境复杂(多云、VM+容器混合),或需要可视化Pipeline审批流程,Spinnaker更成熟。
- 如果已使用服务网格(Istio),Flagger可提供基于指标的自动渐进式发布与回滚,减少人工决策延迟。