1. 蓝绿发布基础概念

1.1 什么是蓝绿部署

蓝绿部署(Blue-Green Deployment)是一种零停机或接近零停机的应用发布策略。其核心思想是维护两套完全独立的生产环境——蓝环境(Blue)和绿环境(Green),在任何时刻只有一套环境承载全部生产流量,另一套环境处于待命或空闲状态。

核心目标:通过环境冗余实现瞬时切换,将发布风险与流量隔离,使回滚操作如同一次路由切换般简单快速。

当需要发布新版本时,操作流程如下:

  1. 在空闲环境(例如当前未承载流量的绿环境)中部署新版本应用。
  2. 对绿环境执行全面的功能验证、健康检查和SLO预检。
  3. 通过负载均衡器或网关将流量从蓝环境一次性或逐步切换到绿环境。
  4. 蓝环境进入待命状态,作为下一轮发布的回滚目标。
蓝绿部署核心流程 用户流量入口 负载均衡器 / 网关 蓝环境 (Blue) 当前版本 v1.0 状态:🟢 承载流量 绿环境 (Green) 新版本 v2.0 状态:🟡 待命/验证中 说明:实线表示当前流量路径,虚线表示待切换路径。切换后蓝环境变为待命状态。

1.2 蓝绿环境定义

蓝绿环境在基础设施层面必须保持对等性,即两套环境拥有相同的计算资源、网络配置、中间件服务和数据存储拓扑。以下是环境定义的关键要素:

环境维度 蓝环境 (Blue) 绿环境 (Green)
当前状态 承载生产流量(活跃) 空闲或部署新版本(待命)
应用版本 稳定版本 v1.0 新版本 v2.0(部署后)
基础设施 K8s 集群 A / 服务网格 A K8s 集群 B / 服务网格 B
数据库 共享数据库(兼容模式) 共享数据库(兼容模式)
DNS/路由 指向负载均衡器主入口 指向负载均衡器备用入口
监控告警 全量生产监控 全量生产监控(预检中)
实践建议:数据库兼容性是蓝绿部署的最大挑战。通常采用“前向兼容”策略——新版本代码必须同时读写新旧两种数据格式,确保切换后旧版本回滚时仍能正常操作数据。

1.3 流量切换原理

流量切换是蓝绿部署的核心操作,其本质是修改流量路由规则,将用户请求从蓝环境导向绿环境(或反向)。切换粒度可分为以下三种模式:

  • 瞬时全量切换:一次性将100%流量从蓝切到绿。切换时间通常在秒级,适用于对切换速度要求极高的场景。
  • 渐进式切换:按比例逐步迁移流量(如10% → 30% → 50% → 100%),每阶段观察SLO指标,发现异常立即暂停或回切。
  • 灰度前置切换:先切一小部分内部测试流量或金丝雀流量到绿环境,验证通过后再全量切换。
流量切换原理与三种模式 模式一:瞬时全量切换 蓝环境 100% → 0% 绿环境 0% → 100% 切换时间:秒级 模式二:渐进式切换 阶段1: 蓝90% / 绿10% 阶段2: 蓝50% / 绿50% 阶段3: 蓝0% / 绿100% 模式三:灰度前置切换 内部流量 5% → 绿环境 验证通过 → 全量切换 验证失败 → 自动回滚 切换决策:SLO 预检通过 → 执行切换 → 切换后 SLO 监控 → 异常则自动回切 切换核心原则 1. 切换前必须完成绿环境的全量健康检查和SLO基准验证 2. 切换过程中保持蓝环境就绪,确保秒级回滚能力

1.4 与传统滚动更新的区别

滚动更新(Rolling Update)是Kubernetes等编排平台的默认更新策略,它通过逐步替换旧版本Pod实例来完成发布。蓝绿部署与滚动更新在多个维度存在本质差异:

对比维度 蓝绿部署 滚动更新
环境数量 两套完整生产环境 单套环境,逐步替换
切换速度 秒级(路由切换) 分钟级(Pod逐个替换)
回滚速度 秒级(切回旧环境) 分钟级(反向滚动替换)
资源成本 高(双倍资源占用) 低(仅需额外10%-25%缓冲)
流量影响 零停机 接近零停机(连接排空期)
版本隔离 完全隔离,无混合流量 新旧版本短暂共存
适用场景 关键业务、高风险变更、SLO敏感 常规迭代、资源受限、低风险更新
注意:蓝绿部署并非银弹。双倍资源开销在大型微服务架构中可能非常昂贵。实践中常采用“逻辑蓝绿”方案——通过Kubernetes命名空间或服务网格标签实现环境隔离,而非完全独立的物理集群,以降低成本。

选择建议:对于SLO要求极高(如99.99%可用性)的核心服务,优先采用蓝绿部署+自动SLO违约检测;对于非关键服务或快速迭代场景,滚动更新配合金丝雀发布是更经济的选择。