在真实的生产环境中,可能需要根据用户信息、应用版本等信息进行灰度发布,比如我们可能只想在安卓手机用户中挑选部分用户进行灰度测试,这时候我们就需要把灰度发布和A/B测试进行结合,来达到目的。路由配置示例如下:
1 apiVersion: networking.istio.io/v1alpha3
2 kind: Gateway
3 metadata:
4 name: istio-lab-gateway
5 spec:
6 selector:
7 istio: ingressgateway
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: DestinationRule
32 metadata:
33 name: service-python
34 spec:
35 host: service-python
36 subsets:
37 - name: v1
38 labels:
39 version: v1
40 - name: v2
41 labels:
42 version: v2
43 ---
44 apiVersion: networking.istio.io/v1alpha3
45 kind: VirtualService
46 metadata:
47 name: istio-lab
48 spec:
49 hosts:
50 - "*"
51 gateways:
52 - istio-lab-gateway
53 http:
54 - match:
55 - uri:
56 prefix: /env
57 headers:
58 user-agent:
59 regex: ".*?(Firefox).*?"
60 route:
61 - destination:
62 host: service-python
63 subset: v1
64 weight: 70
65 - destination:
66 host: service-python
67 subset: v2
68 weight: 30
69 - match:
70 - uri:
71 prefix: /env
72 route:
73 - destination:
74 host: service-python
75 subset: v1
76 - route:
77 - destination:
78 host: service-js
79 subset: v1
第54~68行的路由规则定义表示,对于使用Firefox浏览器访问/env的用户请求,会有30%概率的请求转发到service-python的v2版本,70%的请求转发到v1版本。
第69~75行的路由规则定义表示,对于使用其他浏览器访问/env的用户请求只会转发到service-python的v1版本。
第76~79行定义了默认了路由规则,当没有规则匹配时,使用此默认路由。当访问除了/env的链接时,请求转发到service-js的v1版本。
通过如上的路由规则配置,就可以实现对于使用Firefox浏览器的用户进行灰度上线service-python服务v2版本的需求。
【实验】
1)创建路由规则:
kubectl apply -f istio/route/virtual-service-python-ab-canary.yaml
2)浏览器访问。
此时打开浏览器访问http://192.168.26.31:32470/ ,并多次点击“发射”按钮,如果你使用的是Firefox浏览器,就会看到大部请求都会落到service-python服务的v1版本,只有部分请求落到service-python服务的v2版本。如果使用其他浏览器访问,就会看到所有请求只会落到service-python服务的v1版本。
3)清理:
kubectl delete -f istio/route/virtual-service-python-ab-canary.yaml