最直接有效的方式是配置加权轮询,需新旧版本服务使用不同ip+端口或域名解析,权重设为正整数比(如20:1),并配套健康检查、热更新及响应头标识,但仅适用于http层整体流量分发。

用负载均衡实现灰度发布按比例分发流量,最直接有效的方式是配置加权轮询(Weighted Round Robin),核心在于让不同后端服务节点拥有可区分的权重值,Nginx、Ingress-nginx、Nacos 等主流组件都原生支持该机制。
明确后端服务必须可区分
灰度生效的前提是新旧版本服务在负载均衡层能被识别为独立节点:
- 不能共用同一 IP + 端口(如都写 10.0.1.10:8080);必须用不同地址,例如 v1 → 10.0.1.10:8080,v2 → 10.0.1.11:8080
- 若走域名,需确保解析到不同后端,如 v1.example.com 和 v2.example.com 指向不同机器或 Service
- K8s 场景下,v1 和 v2 应为两个独立 Service 或同一 Service 下带不同 label 的 Pod,由 Ingress 或网关识别
配置权重比例要讲技巧
权重不是百分比,而是相对整数比,实际分流效果取决于比值本身:
- 想导 5% 流量给新版本,推荐设 v1 weight=20, v2 weight=1,而非 95/5 —— 小基数能减少 Nginx 内部调度时的四舍五入误差
- weight=100 和 weight=5 效果等同于 weight=20 和 weight=1,都是 20:1,但大数值在高并发连接复用场景下易出现偏差
- 所有 weight 值必须为正整数,不支持小数或负数;部分旧版 Nginx 对 0 权重支持不稳定,慎用
配套必须启用健康检查与热更新机制
仅配 weight 不足以保障灰度稳定,还需基础防护和运维能力:
- 每个 server 行加上 max_fails=1 fail_timeout=10s,避免某台实例卡顿或假死仍持续收请求
- 修改配置后使用 nginx -t && nginx -s reload 热更新,不中断现有连接
- 建议在响应头中添加 X-Version: v1 或 X-Canary: true,便于前端或监控快速识别流量走向
- 预设回滚路径:保留上一版配置文件,出问题时 10 秒内 reload 回退
注意适用边界与替代方案
纯权重方式适合初期验证,但有明确局限:
- 只做 HTTP 层整体流量切分,无法按用户 ID、Cookie、Header、IP 等做精细化路由
- 若需“VIP 用户走新版本”或“内网 IP 全量灰度”,就得升级到 Nginx+Lua、Istio、Spring Cloud Gateway 或 Nacos 标签路由等方案
- Ingress-nginx 可用 canary-weight: "30" 注解实现类似效果,逻辑一致,只是配置位置不同










