istio流量切换需先在destinationrule中定义子集(如v1/v2),再于virtualservice中通过weight字段按整数比例(如70/30)分发请求,权重为概率性分配且支持match条件实现精细化路由。

流量切换在Istio中主要靠 VirtualService 配合 DestinationRule 实现,核心是通过 weight 字段按比例分发请求到不同子集(如 v1/v2),但必须确保子集已在 DestinationRule 中正确定义。
必须先定义 DestinationRule 子集
VirtualService 中引用的 subset(例如 v1、v2)不能凭空存在——它必须在对应服务的 DestinationRule 里用 labels 明确声明。否则路由规则会被 Pilot 忽略或报错。
- DestinationRule 示例(为 reviews 服务定义 v1 和 v2 子集):
apiVersion: networking.istio.io/v1<br>kind: DestinationRule<br>metadata:<br> name: reviews<br>spec:<br> host: reviews<br> subsets:<br> - name: v1<br> labels:<br> version: v1<br> - name: v2<br> labels:<br> version: v2
- 标签
version: v1必须真实存在于后端 Pod 的 Kubernetes label 中,否则匹配不到实例。
VirtualService 中用 weight 实现流量切分
在 VirtualService 的 http.route 下,多个 destination 可以共存,各自带 weight 值,总和建议为 100(非强制,但语义清晰)。
- 示例:70% 流量到 v1,30% 到 v2
apiVersion: networking.istio.io/v1<br>kind: VirtualService<br>metadata:<br> name: reviews<br>spec:<br> hosts:<br> - reviews<br> http:<br> - route:<br> - destination:<br> host: reviews<br> subset: v1<br> weight: 70<br> - destination:<br> host: reviews<br> subset: v2<br> weight: 30
- 权重是概率性分配,不是严格计数;实际比例需多次请求观测验证
- 不支持小数权重(如 66.6),只能用整数,靠总和归一化理解
结合 match 条件做更精细的切流
weight 分流是全局基础策略,若需“特定用户走 v2,其他人走 v1”,就用 match + route 组合。
- 示例:Header 中含
end-user: jason的请求全走 v2,其余走 v1
http:<br>- match:<br> - headers:<br> end-user:<br> exact: jason<br> route:<br> - destination:<br> host: reviews<br> subset: v2<br>- route:<br> - destination:<br> host: reviews<br> subset: v1
- match 是“且”逻辑(所有条件同时满足才命中)
- 未被 match 捕获的请求会落到后续无 match 的 route 上(即默认兜底)
验证与注意事项
- 应用配置后,用
kubectl get vs,dr -o wide确认资源已生效 - 检查 Istio 控制平面日志(Pilot)是否有 subset 未找到、host 不匹配等告警
- 从网格内发起测试请求(如用 sleep pod curl),避免网关层干扰
- 权重变更可热更新,无需重启服务或 Envoy,但生效有秒级延迟











