概述

在本文中,我们将会学习在 Istio 中如何实现流量转移。

实战

场景描述

具体来说,我们会在本文中将请求按比例路由到对应版本的服务中去。
希望通过本文的学习,你可以掌握:

  • 学会设置路由的权重;
  • 理解灰度发布、蓝绿部署、A/B 测试的概念;
  • 理解与 Kubernetes 基于部署的版本迁移的区别。

蓝绿部署

image.png
蓝绿部署是指在生产环境中有两套完全一致的应用
其中一套用于服务线上环境;而当应用需要更新时,则在更一套环境中进行版本升级;然后将入口流量切换到新版本的环境中。

灰度发布/金丝雀发布

image.png
灰度发布是指在上线过程中,从小范围开始,进行小范围的测试、发布并逐步推全。
灰度发布最大的优点是可以利用真实的线上数据进行测试和验证,且回滚成本很低。

A/B测试

image.png
A/B测试从技术上来看,和灰度发布是非常类似的,只不过二者的目标不同。
灰度发布的目标是保证上线过程的成功,最终目标是将流量全部打向新版本;
而A/B测试则是希望线上同时保留A/B两个版本的服务,比较A和B两个版本的优劣

StepByStep

Step1:配置 reviews 流量的按比例分发

  1. kubectl apply -f ./samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml -n istio-demo
  2. # virtualservice.networking.istio.io/reviews configured

Step2:测试一下吧

多次访问 Ingress 的 /productpage 地址,看看效果吧?
是不是一半的场景看不到评分,一半的场景能够看到红色的星标呢?
image.png
image.png
棒!效果已经出来啦!下面我们来看看我们究竟是如何做到这一点的吧!

原理说明

配置分析

我们来看一下 virtual-service-reviews-50-v3.yaml 这个配置文件里面究竟有哪些内容吧:

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: VirtualService
  3. metadata:
  4. name: reviews
  5. spec:
  6. hosts:
  7. - reviews
  8. http:
  9. - route:
  10. - destination:
  11. host: reviews
  12. subset: v1
  13. weight: 50
  14. - destination:
  15. host: reviews
  16. subset: v3
  17. weight: 50

可以看到我们其实就是在 route 块中增加了一个 weight 字段,通过该字段设置为流量路由的权重。

思考与实战

将 Chrome 浏览器的请求路由到 reviews 的 V2 版本

下面,我们来在之前的基础上,增加一个逻辑:如果用户是用的是 Chrome 浏览器,那么则路由到 reviews 的 v2 版本。
具体应该怎么做呢?我们先来分析一下。
我们还是借助 httpbin.org 的网站,来查询一下不同浏览器访问服务时,有哪些标志性的区别。
首先,我们使用 Chrome 浏览器打开 http://httpbin.org/headers 地址:
image.png
然后,我们用 Safari 浏览器打开 http://httpbin.org/headers 地址:
image.png
可以看到不同的浏览器中,发送的 HTTP 请求头中的 User-Agent 字段并不一样。
因此,我们可以以 User-Agent 字段来进行区分,将 Chrome 浏览器的请求转发到 reviews 的 v2 版本。

创建一个 virtual-service-reviews-chrome.yaml 文件:

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: VirtualService
  3. metadata:
  4. name: reviews
  5. spec:
  6. hosts:
  7. - reviews
  8. http:
  9. - match:
  10. - headers:
  11. user-agent:
  12. regex: ^.*Chrome.*$
  13. route:
  14. - destination:
  15. host: reviews
  16. subset: v2
  17. - route:
  18. - destination:
  19. host: reviews
  20. subset: v1
  21. weight: 50
  22. - destination:
  23. host: reviews
  24. subset: v3
  25. weight: 50

然后使其生效一下:

  1. kubectl apply -f ./samples/bookinfo/networking/virtual-service-reviews-chrome.yaml -n istio-demo
  2. # virtualservice.networking.istio.io/reviews configured

再看测试一下吧,我们首先使用 Chrome 浏览器访问 homepage 页面看看:
image.png
的确如我们所想,每次访问看到的都是黑色星标的评分。
在看看 Safari 浏览器访问的效果呢?
依然是在没有评分和红色星标评分之间变化,完全满足我们的预期,太棒了!