在日常的持续部署中,我们一般使用滚动升级的方式来进行微服务升级。若使用 Kubernetes 容器编排平台进行微服务滚动升级,其一般通过控制实例数的方式来实现。将旧版本下线,将新版本启动,新实例健康检查通过后,统一将流量打到新版本。
而使用 Istio,不用控制实例数,且可以更细粒度的控制流量打到各个版本的百分比,从而实现按比例将流量逐渐迁移到新版本来实现升级。
下面使用 Bookinfo 样例看一下 Istio 的流量转移如何使用。我们知道 reviews 有三个版本,假定我们想从 v1 版本升级到 v3 版本。(关于 Istio 的安装及 Bookinfo 样例的部署,请参看上文“Istio 安装使用”)
首先,配置默认的 Destination Rule。
$ cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/bookinfo/networking/destination-rule-all.yaml
为 reviews 配置 Virtual Service,指定访问 reviews 的所有流量打到 v1 版本。
$ cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/bookinfo/networking/virtual-service-all-v1.yaml
查看配置:
$ kubectl get virtualservice/reviews -n istio-demo -o yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews
---
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
访问 productpage,刷新多次发现 Review 部分均无五星等级评价,说明配置已生效。
下面,为 reviews 配置 Virtual Service,先将 50%的流量打到 v3。
$ cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
查看配置:
$ kubectl get virtualservice/reviews -n istio-demo -o yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews
---
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 50
- destination:
host: reviews
subset: v3
weight: 50
这时,多次刷新 productpage,发现 Review 部分红色五星评价会时而出现。
下面,提升比例,将 100%的流量都打到 v3。
$ cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml
查看配置:
$ kubectl get virtualservice/reviews -n istio-demo -o yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews
---
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v3
这时,无论刷新多少次,productpage 的 Review 部分均显示红色的五星评价,说明流量已 100%切了过来。
测试结束,执行如下命令将测试路由配置清除。
$ cd /usr/local/istio-1.8.1
$ kubectl delete -n istio-demo -f samples/bookinfo/networking/virtual-service-all-v1.yaml
综上,我们首先介绍了 Istio 流量转移的应用场景,然后使用 Bookinfo 样例对 reviews 作了测试。
参考资料