目的
我们通过灰度发布的流量控制实现以下三个目标:
- 用户访问的流量全部发送到Reviews V1的版本(不带五角星)
- 将90%的用户流量发送到Reviews V1版本,另外10%的流量发送到Reviews V2版本的应用程序(五个黑色五角星)。
- 将50%的流量发送到Reviews V2版本的应用程序,另外50%的流量发送到Reviews V3版本的应用程序(五个红色五角星)。
运行Bookinfo实例
[root@master istio-1.14.3]# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
[root@master istio-1.14.3]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
v1版本不带五角星
v2版本五个黑色五角星
v3版本五个红色五角星
实践一: 用户访问的流量全部发送到Reviews V1的版本(不带五角星)
1.1 定义DestinationRule规则资源编排文件(流量控制前配置)
[root@master istio-1.14.3]# vim samples/bookinfo/networking/destination-rule-all.yaml
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule #定义控制器的类型为DestinationRule
metadata:
name: reviews #控制器的名称
spec:
host: reviews #针对哪一个Service资源设置路由规则,要与VirtualService中的Service资源保持一致
subsets: #定义子集也就是路由规则,可以定义多个
- name: v1 #规则的名称
labels: #路由规则一般都是根据Pod中的Label标签来做的,samples/bookinfo/platform/kube/bookinfo.yaml 中deploy内指定的保持一致
version: v1 #v1的路由规则转发到带有version: v1标签的一组Pod资源
- name: v2
labels:
version: v2 #v2的路由规则转发到带有version: v2标签的一组Pod资源
- name: v3
labels:
version: v3 #v3的路由规则转发到带有version: v3标签的一组Pod资源
1.2 定义VirtualService规则编排文件
[root@master istio-1.14.3]# cat samples/bookinfo/networking/virtual-service-all-v1.yaml
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService #控制器类型为VirtualService
metadata:
name: reviews #指定需要流量控制的控制器名称为reviews
spec:
hosts: #定义流量访问的目标主机
- reviews
http: #定义HTTP流量转发的规则路由表
- route:
- destination: #定义流量的转发规则
host: reviews #转发至Service资源
subset: v1 #将流量转发到哪一个路由规则子集,这里将流量转发到在DestinationRule中定义的v1路由规则上,就可以实现所有的流量转发到v1版本的Pod资源
1.3 创建VirtualService和DestinationRule
[root@master istio-1.14.3]# kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml -n bookinfo
destinationrule.networking.istio.io/productpage created
destinationrule.networking.istio.io/reviews created
destinationrule.networking.istio.io/ratings created
destinationrule.networking.istio.io/details created
[root@master istio-1.14.3]# kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml -n bookinfo
virtualservice.networking.istio.io/productpage created
virtualservice.networking.istio.io/reviews created
virtualservice.networking.istio.io/ratings created
virtualservice.networking.istio.io/details created
1.4 访问测试
无论如何刷新都是不带五角星页面
实践二: 依靠修改权重(weight)将90%的用户流量发送到Reviews V1版本,另外10%的流量发送到Reviews V2版本的应用程序(五个黑色五角星)。
2.1 修改VirtualService规则编排文件(不需要修改DestinationRule编排文件)
# 删除上个规则
[root@master istio-1.14.3]# kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml -n bookinfo
virtualservice.networking.istio.io "productpage" deleted
virtualservice.networking.istio.io "reviews" deleted
virtualservice.networking.istio.io "ratings" deleted
virtualservice.networking.istio.io "details" deleted
[root@master istio-1.14.3]# vim samples/bookinfo/networking/destination-rule-all.yaml
[root@master istio-1.14.3]# kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-90-10.yaml
virtualservice.networking.istio.io/reviews created
[root@master istio-1.14.3]# cat samples/bookinfo/networking/virtual-service-reviews-90-10.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 90 #通过weight参数设置流量访问的权重,90%的流量转发至V1版本
- destination:
host: reviews
subset: v2
weight: 10 #10%的流量转发至V2版本
[root@master istio-1.14.3]# kubectl get VirtualService
NAME GATEWAYS HOSTS AGE
bookinfo ["bookinfo-gateway"] ["*"] 144m
reviews ["reviews"] 2m24s
2.2 访问测试
9:1的比例显示无星和黑五星
实践三: 将50%的流量发送到Reviews V2版本的应用程序,另外50%的流量发送到Reviews V3版本的应用程序(五个红色五角星)。
3.1 修改VirtualService规则编排文件(不需要修改DestinationRule编排文件)
# 删除上个规则
[root@master istio-1.14.3]# kubectl delete -f samples/bookinfo/networking/virtual-service-reviews-90-10.yaml
virtualservice.networking.istio.io "reviews" deleted
[root@master istio-1.14.3]# vim samples/bookinfo/networking/destination-rule-all.yaml
[root@master istio-1.14.3]# kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
virtualservice.networking.istio.io/reviews created
[root@master istio-1.14.3]# cat samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
weight: 50 #50%的流量转发到V2版本
- destination:
host: reviews
subset: v3
weight: 50 #50%的流量转发到V3版本
[root@master istio-1.14.3]# kubectl get VirtualService
NAME GATEWAYS HOSTS AGE
bookinfo ["bookinfo-gateway"] ["*"] 149m
reviews ["reviews"] 47s
3.2 访问测试
1:1的比例显示无星和黑五星
实践四: 将用户xunaxuan的请求转发至V3版本,其余的用户转发到V2版本(匹配HTTP头部信息的流量控制)
4.1 准备工作
Istio的灰度发布还支持基于HTTP的头部信息字段做一些流量转发控制,比如根据请求中用户使用的浏览器版本做一些流量空开,谷歌浏览器使用V2版本的程序,其他浏览器使用V3版本的程序等等,只要请求头中包含的字段都可以进行匹配然后做出流量控制。
4.2 修改VirtualService规则编排文件(不需要修改DestinationRule编排文件)
[root@master istio-1.14.3]# vim samples/bookinfo/networking/destination-rule-all.yaml
[root@master istio-1.14.3]# kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-jason-v2-v3.yaml
virtualservice.networking.istio.io/reviews created
[root@master istio-1.14.3]# more samples/bookinfo/networking/virtual-service-reviews-jason-v2-v3.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match: # 定义匹配规则
- headers: # 匹配请求头
end-user:
exact: xuanxuan # 定义用户
route: # 满足上面的要求流量转发到v2版本上
- destination:
host: reviews
subset: v2
- route: # 这边没有设定match要求,其它用户访问v3
- destination:
host: reviews
subset: v3
4.3 访问测试
xuanxuan用户访问是黑色五星
未登入以及非xuanxuan用户访问是红色五星
实践五: 实现URL的流量控制(匹配HTTP头部信息的流量控制)
5.1 修改VirtualService规则编排文件(不需要修改DestinationRule编排文件)
[root@master istio-1.14.3]# vim samples/bookinfo/networking/destination-rule-all.yaml
[root@master networking]# vim virtual-service-url.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- bookinfo.com
http:
- match:
- uri:
prefix: /reviews
route:
- destination:
host: reviews
- match:
- uri:
prefix: /ratings
route:
- destination:
host: ratings
[root@master networking]# kubectl get virtualservices.networking.istio.io
NAME GATEWAYS HOSTS AGE
bookinfo ["bookinfo.com"] 3h14m
reviews ["reviews"] 24m