上节介绍了简单的灰度发布实验,在真实的生产环境中,可能需要根据用户信息、应用版本等信息进行灰度发布,比如我们可能只想在安卓手机用户中挑选部分用户进行灰度测试,这时候我们就需要把灰度发布和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 # 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: 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://11.11.11.112:31380/ ,并多次点击“发射”按钮,如果你使用的是Firefox浏览器,就会看到大部请求都会落到service-python服务的v1版本,只有部分请求落到service-python服务的v2版本。如果使用其他浏览器访问,就会看到所有请求只会落到service-python服务的v1版本。
3)清理:
$ kubectl delete -f istio/route/virtual-service-python-ab-canary.yaml
实验中可能会遇到一些问题,如路由创建不生效、应用路由规则时出现超时错误、自动注入失败等,这些问题都可以通过重启电脑即可解决。另外,实验时有可能第一次访问服务时响应时间过长,也有可能出现中间部分请求响应时间过长,这些都是由于实验时的机器性能不足导致的,直接忽略,进行多次访问即可。