通过Istio提供的服务路由功能,我们可以根据请求的信息轻松实现A/B测试。本节演示根据用户使用的浏览器来展示不同版本的Web界面。当用户使用Firefox浏览器访问时,会得到Vue版本实现的前端界面;当用户使用其他浏览器访问时,会得到React版本实现的前端界面。配置示例如下:
1 apiVersion: networking.istio.io/v1alpha3
2 kind: Gateway
3 metadata:
4 name: istio-lab-gateway
5 spec:
6 selector:
7 istio: ingressgateway # use Istio default gateway implementation
8 servers:
9 - port:
10 number: 80
11 name: http
12 protocol: HTTP
13 hosts:
14 - "*"
15 ---
16 apiVersion: networking.istio.io/v1alpha3
17 kind: DestinationRule
18 metadata:
19 name: service-js
20 spec:
21 host: service-js
22 subsets:
23 - name: v1
24 labels:
25 version: v1
26 - name: v2
27 labels:
28 version: v2
29 ---
30 apiVersion: networking.istio.io/v1alpha3
31 kind: VirtualService
32 metadata:
33 name: istio-lab
34 spec:
35 hosts:
36 - "*"
37 gateways:
38 - istio-lab-gateway
39 http:
40 - match:
41 - uri:
42 prefix: /env
43 route:
44 - destination:
45 host: service-python
46 - match:
47 - uri:
48 prefix: /
49 headers:
50 user-agent:
51 regex: ".*?(Firefox).*?"
52 route:
53 - destination:
54 host: service-js
55 subset: v2
56 - route:
57 - destination:
58 host: service-js
59 subset: v1
第46~55行定义的路由规则表明,当用户的请求携带的user-agent请求头正则匹配Firefox时,转发请求到sevice-js服务的v2版本。
第56~59行定义了默认的路由规则,当上面的条件都不符合时,把请求转发到sevice-js服务的v1版本。
通过上面的路由规则就会实现,当用户使用Chrome浏览器访问时,会得到React版本实现的前端界面;当用户使用Firefox浏览器访问时,会得到Vue版本实现的前端界面。这样就轻松实现用户界面的A/B版本测试。
【实验】
1)创建A/B测试路由规则:
kubectl apply -f istio/route/gateway-js-user-agent-v1-v2.yaml
2)浏览器访问。
通过浏览器访问地址http://192.168.26.31:32470/,并多次点击“发射”按钮。
发现使用Chrome浏览器与使用Firefox浏览器会得到不同的界面。
3)清理:
kubectl delete -f istio/route/gateway-js-user-agent-v1-v2.yaml