4. 蓝绿发布原理:蓝绿环境定义、流量切换机制、零停机部署目标
蓝绿发布(Blue-Green Deployment)是一种通过维护两套独立生产环境来实现零停机发布与快速回滚的部署策略。在 CNI 网络环境下,蓝绿发布的流量切换本质上是网络准入控制策略的原子化变更。本章从环境定义、流量切换机制和零停机目标三个维度展开,为后续基于 CNI 的网络准入控制设计奠定基础。
4.1 蓝绿环境定义
蓝绿发布的核心是同时运行两套完全独立的应用环境:
| 环境角色 | 状态 | 网络策略 | 数据层 |
|---|---|---|---|
| 蓝环境(Blue) | 当前生产环境,承载全部在线流量 | 开放对外服务端口,允许入口流量 | 连接生产数据库(读写) |
| 绿环境(Green) | 新版本预发布环境,无外部流量 | 仅开放内部探测端口,禁止外部入口 | 连接生产数据库(只读)或独立影子库 |
关键约束:蓝绿两套环境必须部署在相同的 Kubernetes 集群或网络平面内,且共享同一套 Service Mesh 或 CNI 网络策略控制面。两套环境的 Pod 通过不同的标签(version: blue / version: green)进行区分。
4.2 流量切换机制
流量切换是蓝绿发布的核心操作,在 CNI 网络环境下通过以下层次实现:
- Service 标签选择器切换:将 Kubernetes Service 的
selector从version: blue改为version: green,使新流量全部导向绿环境。 - CNI 网络策略原子更新:通过 NetworkPolicy 对象将入口准入规则从蓝环境 Pod 迁移至绿环境 Pod,确保只有绿环境 Pod 被允许接收外部流量。
- 连接 draining 与优雅终止:蓝环境在切换后进入
draining状态,等待已有连接处理完毕后再缩容。
CNI 视角:流量切换的本质是网络准入规则的原子化重绑定。在 Calico 或 Cilium 环境中,可以通过 calicoctl 或 kubectl 直接更新 GlobalNetworkPolicy 或 CiliumNetworkPolicy,实现毫秒级生效。
4.3 零停机部署目标
零停机(Zero-Downtime)是蓝绿发布的最终目标,在 CNI 网络层面需要满足以下条件:
- 连接无损:切换过程中已有 TCP/HTTP 连接不被中断,通过
preStop钩子和terminationGracePeriodSeconds实现优雅关闭。 - 流量平滑迁移:Service 切换后,kube-proxy 或 eBPF 数据面在秒级完成端点更新,避免流量黑洞。
- 回滚即时性:当绿环境出现异常时,将 Service 选择器切回蓝环境,CNI 网络策略同步回滚,整个过程应在 5 秒内完成。
常见陷阱:如果蓝绿环境共享同一组数据库且新版本包含 schema 变更,回滚时可能导致数据不兼容。建议在绿环境验证阶段使用影子库或只读副本,确保回滚路径安全。
4.4 蓝绿环境网络隔离对比
| 维度 | 蓝环境(生产) | 绿环境(预发布) |
|---|---|---|
| 网络命名空间 | 共享集群网络,无隔离 | 共享集群网络,无隔离 |
| 入口准入 | 允许所有外部流量 | 仅允许内部探测/健康检查 |
| 出口策略 | 允许访问数据库、缓存、外部 API | 允许访问数据库(只读)、影子服务 |
| DNS 解析 | 解析到生产 Service | 解析到预发布 Service(内部域名) |
| 监控指标 | 接入生产监控与告警 | 接入预发布监控,不触发告警 |
4.5 零停机验证清单
部署前检查:
- 蓝环境 Pod 已设置
preStop钩子,等待 30 秒处理已有连接 - 绿环境已通过健康检查(readinessProbe / livenessProbe)
- CNI NetworkPolicy 已预配置绿环境的准入规则,但处于
disabled状态 - Service 选择器切换脚本已测试,回滚脚本同样就绪
- 监控面板已添加蓝绿流量比例指标(如
blue_traffic_ratio/green_traffic_ratio)
蓝绿发布在 CNI 网络环境下的核心价值在于:流量切换与网络准入控制是同一枚硬币的两面。Service 选择器变更驱动流量重定向,而 CNI NetworkPolicy 的原子更新确保只有目标环境暴露在网络中。这种双重控制机制为后续实现精细化网络准入与自动回滚提供了坚实基础。