Istio 权重与灰度路由
Istio 用 VirtualService 声明式描述流量路由:把请求按权重分给不同版本(route.weight),或按 headers、uri、method 等条件精确命中特定 subset;DestinationRule 先用标签把 Pod 划成 subset(如 v1、v2),路由目标就是这些 subset。典型灰度是组合两条规则:内部用户凭 header 精确进新版本,外部用户先小权重观测;另有镜像(mirror)能力把生产流量复制一份到新版本,副本响应被丢弃,用于上线前用真实流量压测。注意路由只作用于网格内流量(经 sidecar 或网关进入的请求),绕过网格直连 Pod 的调用不受控制。
基本信息
| 权重 | route.weight,按比例分配流量 |
|---|---|
| 条件匹配 | match 按 headers、uri、method 等 |
| 镜像 | mirror + mirrorPercentage,复制流量副本 |
| 前提 | DestinationRule 定义 subset(按标签选 Pod) |
| 生效范围 | 仅网格内流量,入口需纳入网格 |
典型使用场景
- header 定向:内部测试用户带定制请求头先走新版本,问题早发现早回退。
- 权重放量:5% 到 50% 再到 100% 逐步提权,每一步观测错误率与延迟。
- 影子压测:mirror 把真实流量复制给新版本,验证容量与正确性而不影响线上响应。
- 路径灰度:新增 API 路径单独路由到新版本,老路径保持不变。
- AB 实验:按条件把流量分流到两个版本,对比业务指标后择优。
- 发布预检:先用镜像流量跑一段,提前发现性能退化再开始正式放量。
header 定向 + 权重
header 定向 + 权重
http:
- match:
- headers: {x-canary: {exact: "true"}} # 内部用户精确命中
route:
- destination: {host: web, subset: v2}
- route:
- destination: {host: web, subset: v1}
weight: 95 # 稳定版本
- destination: {host: web, subset: v2}
weight: 5 # 新版本 5%路由机制对比
| 机制 | 关键字段 | 用途 |
|---|---|---|
| 权重分配 | route.weight | 按比例放量 |
| 条件匹配 | match headers/uri/method | 精确人群或路径 |
| 镜像 | mirror/mirrorPercentage | 影子流量验证 |
| 超时重试 | timeout/retries | 抖动时降低错误率 |
权重建议合计为 100:不足 100 时剩余流量按比例分配,容易与预期不符。
版本标签要先打进 Pod(如 version: v2),subset 用标签选择器圈定;目标不存在的路由会直接报错。
镜像流量是发后不理:副本响应被丢弃,但副作用(写库、发消息)真实发生,慎对写路径开启。