上一节讲到如何创建Gateway,这个网关配置让 HTTP 流量从 bookinfo.app
域名通过 80 端口流入网格,但没有为请求指定任何路由规则。例如/productpage
的流量不能流到后端的service:
这些路由规则与后端服务的映射,是通过VirtualService
来实现的:
创建一个yaml定义:
里面声明如下:
bookinfo.app
域名bookinfo-gateway
上面提到了VirtualService可以把网关(Gateway)的流量解析到具体后端服务,但它的功能不仅限于此。它还可以进行流量的控制
有时候测试新版本的应用上线,需要做A/B测试,例如原来的版本是v1
,现在需要将一部分流量导入到新版本v2
进行测试:
在K8s原生实现中,我们是这样做的,定义一个service,然后它的selector是app=reviews
:
创建新版本的deployment,它的label依然是app=reviews
:
v2
版本的replica数量是1,v1
版本的replica数量是3,所以reviews
service会将25%的流量导入到v2
版本。
如果v2
版本测试没问题,我们可以将v1版本下掉,这样100%的流量会进入v2
版本:
kubectl scale deployment reviews-v2 --replicas=3
kubectl scale deployment reviews-v1 --replicas=0
这样做AB测试很简单且易实现,但唯一的问题是不好做细粒度的流量控制,例如想导入1%流量到v2
版本,我们需要创建99个v1
版本的pod和1个v2
版本的pod。
VirtualService可以帮我们解决上面的精准流量控制问题,这在 A/B 测试中可能有用——您可能希望在其中配置基于不同服务版本的流量百分比路由: