1. 课程导论:蓝绿发布与灰度发布对比、Prometheus在发布中的核心价值、自动化故障排查的总体流程
1.1 蓝绿发布与灰度发布:核心概念与对比
在微服务与云原生架构下,发布策略直接决定了系统的风险暴露面与回滚速度。蓝绿发布与灰度发布是两种最主流的零宕机部署模式,但它们的切换逻辑、流量控制粒度与监控关注点存在本质差异。
| 对比维度 | 蓝绿发布 (Blue/Green) | 灰度发布 (Canary) |
|---|---|---|
| 环境数量 | 两套完整环境(蓝/绿),始终只有一套在线 | 一套生产环境 + 小比例金丝雀实例 |
| 流量切换 | 一次性全量切换(负载均衡/网关路由) | 渐进式流量迁移(5% → 20% → 50% → 100%) |
| 回滚速度 | 秒级:切回旧环境路由即可 | 分钟级:需逐步降低金丝雀权重或直接下线 |
| 资源成本 | 高(双倍资源持续运行) | 低(仅额外运行少量金丝雀实例) |
| 监控复杂度 | 低(对比两套环境整体指标) | 高(需按实例标签拆分流量与错误率) |
| 适用场景 | 数据库无破坏性变更、对回滚速度要求极高 | 功能验证、A/B测试、逐步放量 |
SRE 选型建议: 蓝绿发布适合 基础设施层 变更(如 Kubernetes 集群升级、网络插件替换);灰度发布更适合 应用层 功能迭代,尤其是涉及用户感知的 UI/API 变更。
1.2 蓝绿发布典型架构与流量切换流程
下图展示了蓝绿发布的核心组件与一次完整的版本切换过程。注意 Prometheus 需要同时采集蓝、绿两套环境的指标,并在切换前后执行预定义的 健康检查规则。
1.3 Prometheus 在发布中的核心价值
在蓝绿发布场景中,Prometheus 不仅仅是“看指标”的工具,而是自动化决策的度量基础。其核心价值体现在三个层面:
- 实时健康度评估: 通过
up、http_requests_total、grpc_server_handled_total等指标,在切换前自动判定新环境是否就绪。 - 多维标签对比: 利用
environment="blue"与environment="green"标签,在 PromQL 中直接计算错误率差异:
# 蓝环境错误率 sum(rate(http_requests_total{environment="blue", status=~"5.."}[1m])) / sum(rate(http_requests_total{environment="blue"}[1m])) # 绿环境错误率 sum(rate(http_requests_total{environment="green", status=~"5.."}[1m])) / sum(rate(http_requests_total{environment="green"}[1m])) - 自动化告警触发回滚: 当绿环境错误率超过阈值(如 > 1%)或 P99 延迟飙升时,Prometheus Alertmanager 自动触发 Webhook,驱动 CI/CD 管道执行回滚。
关键指标清单(蓝绿发布专用):
container_cpu_usage_seconds_total— CPU 使用率对比container_memory_working_set_bytes— 内存工作集对比http_request_duration_seconds{quantile="0.99"}— P99 延迟grpc_server_handled_total{grpc_code!="OK"}— gRPC 错误计数probe_success— Blackbox 探针存活检测
1.4 自动化故障排查的总体流程
基于 Prometheus 的蓝绿发布自动化故障排查,遵循 “采集 → 检测 → 定位 → 决策 → 恢复” 五步闭环。下图展示了这一流程的完整链路:
1.5 流程关键节点说明
- 指标采集层: 使用 Prometheus Operator 自动发现蓝绿环境的所有 Pod,通过
serviceMonitor或podMonitor注入environment标签。 - 异常检测层: 预置
recording rules计算错误率与延迟滑动窗口,避免直接使用原始指标导致告警抖动。 - 根因定位层: 结合
kube_pod_labels与container_*指标,快速定位是哪个微服务、哪个实例出现异常。 - 自动决策层: Alertmanager 的
webhook_configs调用 Jenkins/GitLab CI 的 API,传入rollback=true参数。 - 恢复与复盘层: 回滚完成后,Prometheus 自动生成 发布事件报告,包含切换前后的指标对比图,供 SRE 团队复盘。
常见陷阱: 蓝绿发布中,如果数据库 schema 不兼容(如 v2.0 新增了字段),回滚后旧版本代码可能因无法解析新数据而崩溃。此时 Prometheus 监控的
database_query_duration_seconds 和 database_error_total 指标会立即告警,但根因定位需要结合 日志标签 与 APM 追踪 才能快速锁定。