VirtualService(简称 VS)是服务网格 Istio 中用于流量治理的核心配置资源(CRD)。
简单来说,如果把微服务之间的调用比作城市的交通,那么 VirtualService 就是智能交通指挥系统。它不直接创建网络负载均衡器,而是定义了一组“路由规则”,告诉网格内的流量(请求)应该如何被匹配、转发到哪个具体的服务版本,以及转发时需要做什么处理(比如重试、超时等)。
🎯 VirtualService 主要能干什么?
VirtualService 的功能非常强大,主要涵盖以下几个核心场景:
- 流量拆分与灰度发布(金丝雀发布):将流量按权重分配给服务的不同版本。例如,将 90% 的流量发给 v1 版本,10% 的流量发给 v2 版本,用于新版本的平滑上线。
- 条件路由:根据请求的具体特征(如 HTTP 请求头、Cookie、用户代理 User-Agent、URI 路径前缀等)将流量导向特定版本。例如,让内部测试人员(带有特定 Header)的请求始终访问 v2 版本。
- 提升系统韧性:为服务配置超时(Timeout)、**重试(Retry)**策略,防止因某个服务不稳定导致整个系统卡死。
- 故障注入与流量镜像:
- 故障注入:人为地注入延迟或错误,用于测试系统的容错能力(混沌工程)。
- 流量镜像:将生产环境的流量复制一份发送到测试版本,进行无损的真实流量验证。
- 请求改写与重定向:在转发请求前,修改请求的 URI 路径,或者直接向客户端返回 301/302 重定向响应。
🛠️ VirtualService 怎么用?
在使用 VirtualService 之前,通常需要先创建一个 DestinationRule(目标规则)。DestinationRule 负责定义服务的各个子集(比如通过标签 version: v1 定义出 subset: v1),而 VirtualService 则负责把流量导向这些子集。
以下是几个典型的 VirtualService 配置实战:
场景一:按权重进行灰度发布(90% 流量走 v1,10% 走 v2)
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- reviews # 目标服务名
http:
- route:
- destination:
host: reviews
subset: v1 # 指向 DestinationRule 中定义的 v1 子集
weight: 90
- destination:
host: reviews
subset: v2
weight: 10
场景二:按请求头进行条件路由(特定用户访问 v2,其他人访问 v1)
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason # 匹配请求头中 end-user 为 jason 的请求
route:
- destination:
host: reviews
subset: v2
- route: # 兜底路由,不满足上述条件的请求全部走这里
- destination:
host: reviews
subset: v1
场景三:配置超时与重试(提升服务稳定性)
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
timeout: 3s # 设置总超时时间为 3 秒
retries:
attempts: 2 # 失败后最多重试 2 次
perTryTimeout: 1s # 每次尝试的超时时间为 1 秒
💡 最佳实践提示
- 顺序即正义:VirtualService 中的路由规则是按顺序从上到下评估的。请务必把最具体、最严格的匹配条件写在最上面,把默认的兜底路由写在最后。
- 搭配使用:始终记住 VS 决定“往哪去”(路由逻辑),DR 决定“怎么连”(连接池、负载均衡策略、熔断等),两者搭配才能发挥 Istio 流量管理的最大威力。
- 可视化排查:配置后如果流量未按预期转发,可以借助 Kiali 等可视化工具查看实时的流量走向,排查配置是否生效。
