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 后,基于权重进行流量分发的完整路径:

基于权重的流量切分流程 客户端请求 Gateway(权重计算引擎) 权重归一化计算(90:10) v1 后端(权重 90) 90% 流量 v2 后端(权重 10) 10% 流量

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 匹配让内部团队验证新版本,确认无误后再逐步调整权重,实现全量用户的平滑迁移。