3. 流量切分核心原理:基于权重(Weight)的流量分发机制
在 Gateway API 的 HTTPRoute 资源中,权重(Weight)是实现精细化流量切分的核心字段。通过为同一路由下的多个后端服务(BackendRef)分配不同的整型权重值,Gateway 实现层(如 Envoy、Contour、Istio)会按比例将请求分发至各后端,从而在不中断现有连接的前提下完成流量迁移。
3.1 权重分发的基本模型
权重机制遵循 “独立归一化” 原则:每个后端引用的权重值在所属后端组内进行归一化计算,得出该后端应承载的流量百分比。公式如下:
后端流量百分比 = 该后端权重值 / 所有后端权重值之和 × 100%
以下表展示一个典型的蓝绿部署权重配置:
| 后端服务 | 权重值 | 流量占比 | 说明 |
|---|---|---|---|
| v1(稳定版) | 90 | 90% | 承载绝大多数生产流量 |
| v2(金丝雀版) | 10 | 10% | 接收少量验证流量 |
当验证通过后,将权重调整为 v1:0、v2:100,即可完成 100% 流量切换,整个过程无需重建路由或中断连接。
3.2 权重切分的完整流程
下图展示了从客户端请求到达 Gateway 后,基于权重进行流量分发的完整路径:
3.3 权重配置的 YAML 实现
以下是一个完整的 HTTPRoute 资源示例,演示如何通过 weight 字段实现 90:10 的流量切分:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: canary-route
namespace: production
spec:
parentRefs:
- name: prod-gateway
hostnames:
- "app.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: app-v1
port: 8080
weight: 90
- name: app-v2
port: 8080
weight: 10
关键约束:权重值必须为非负整数,取值范围通常为 0–1000。权重为 0 的后端不会收到任何流量,但路由规则仍然有效,便于后续快速恢复。
3.4 权重切分的三大特性
- 无状态计算:每个请求独立进行权重归一化,不依赖会话状态或分布式计数器,实现层开销极低。
- 线性可叠加:支持三个及以上后端同时参与切分,例如
v1:70、v2:20、v3:10,系统自动归一化。 - 零中断切换:调整权重后,已有长连接不受影响,新请求按新比例分发,实现真正的无损切换。
3.5 多后端权重分配示例
下表展示一个三版本并行发布的权重分配方案:
| 阶段 | v1 权重 | v2 权重 | v3 权重 | v1 流量占比 | v2 流量占比 | v3 流量占比 |
|---|---|---|---|---|---|---|
| 初始阶段 | 100 | 0 | 0 | 100% | 0% | 0% |
| 金丝雀引入 | 90 | 10 | 0 | 90% | 10% | 0% |
| 灰度扩大 | 60 | 30 | 10 | 60% | 30% | 10% |
| 全量切换 | 0 | 0 | 100 | 0% | 0% | 100% |
注意:权重调整后,Gateway 实现层(如 Envoy)需要数秒至数十秒完成配置热更新。在集群升级场景中,建议每次调整后观察至少 30 秒,确认流量分布符合预期后再进行下一步操作。
3.6 权重与 HTTP 匹配条件的协同
权重切分可以与 HTTP 匹配条件(matches) 联合使用,实现更精细的流量路由。例如,先通过 Header 匹配将内部测试流量导向 v2,剩余流量再按权重分发:
spec:
rules:
- matches:
- headers:
- name: "X-Canary"
value: "true"
backendRefs:
- name: app-v2
port: 8080
weight: 100
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: app-v1
port: 8080
weight: 90
- name: app-v2
port: 8080
weight: 10
这种组合策略在集群升级中尤为实用:先通过 Header 匹配让内部团队验证新版本,确认无误后再逐步调整权重,实现全量用户的平滑迁移。