一、实验场景说明

下面部署了一个用于演示多种 Istio 特性的应用,该应用由四个单独的微服务构成:

  • productpage. 这个微服务会调用 detailsreviews 两个微服务,用来生成页面。
  • details. 这个微服务中包含了书籍的信息。
  • reviews. 这个微服务中包含了书籍相关的评论。它还会调用 ratings 微服务。
  • ratings. 这个微服务中包含了由书籍评价组成的评级信息。

其中reviews 微服务有 3 个版本:

  • v1 版本不会调用 ratings 服务。
  • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
  • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

其中应用的端到端架构如下:

部署测试用例-1

Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。

以下示例默认已经完成 Bookinfo 应用部署,并通过 bookinfo-gateway 暴露访问入口。

二、Istio 实现 AB 测试

Istio / Virtual Service官网说明

2.1 什么是 AB 测试

在 Istio 中,AB 测试是一种基于服务网格架构的测试方法,用于比较两个或多个不同版本的微服务在生产环境中的性能、稳定性和用户体验。Istio 是一个用于管理、保护和监控微服务应用程序的开源平台,它通过引入代理来实现对服务之间通信的控制和可观察性。

所谓AB测试,就是限制指定的用户访问新版本,待新版本无问题且反馈较好时,才会让所有用户使用新版本。

2.2 实现 AB 测试

下面进行AB测试,将将jason用户指向v3,其他用户依旧使用v2版本

Istio 实现 AB 测试

1.修改 reviews 的 VirtualService,将 jason 用户指向 v3,其他用户依旧使用 v2 版本。其中匹配请求头的 key 为 end-user,value 为 jason,这都是官网测试用例自带的,如果自己研发的,需要单独添加请求头

[root@k8s-master01 ~]# vim reviews-jasonv3.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:  # 匹配请求头
       end-user: # 匹配请求头的 key  end-user
         exact: jason # value  jason
    route:
    - destination:
       host: reviews
       subset: v3
  - route:
    - destination:
       host: reviews
       subset: v2

注意:匹配请求头需要在HTTP请求的headers里面添加对应的key=value形式的请求头才能够匹配,除了exact外,还可以使用regex进行正则匹配。

2.更新该 VirtualService

[root@k8s-master01 ~]# kubectl replace -f reviews-jasonv3.yaml -n bookinfo

3.使用未登录用户的方式访问 bookinfo,观察到页面只显示黑色五角星

Istio 实现 AB 测试-1

4.使用jason用户登录的方式访问 bookinfo,密码随意即可,观察到页面只显示红色五角星

Istio 实现 AB 测试-2

Istio 实现 AB 测试-3

当然,你也可以通过查看productpage日志找到请求头为jason

[root@k8s-master01 ~]# kubectl get po -n  bookinfo | grep productpage
NAME                             READY   STATUS    RESTARTS       AGE
productpage-v1-bf4b489d8-xrbs9   2/2     Running   2 (3h1m ago)   4d20h

[root@k8s-master01 ~]# kubectl logs -f  po productpage-v1-bf4b489d8-xrbs9  -n  bookinfo | grep jason

Istio 实现 AB 测试-4

三、Istio 地址重写和重定向

3.1 Istio 地址重定向

Istio官网地址重定向说明

下面演示将 bookinfo.kubeasy.com/gx,跳转到 https://www.zhihu.com/people/xun-zhao-you-yuan-ren-42/posts

1.提前访问bookinfo.kubeasy.com:30080/gx,报404(后面对比)

Istio 地址重定向-1

2.在线修改vs,在末尾处添加以下内容

[root@k8s-master01 ~]# kubectl edit vs bookinfo -n bookinfo
  - match:
    - uri:
        prefix: /gx # 匹配/gx
    redirect:
      authority: zhihu.com  # 跳转的域名
      uri: /people/xun-zhao-you-yuan-ren-42/posts  # 跳转的路径

Istio 地址重定向-2

3.再次访问bookinfo.kubeasy.com:30080/gx,会直接跳转到我的知乎。

Istio 地址重定向-3

3.2 Istio 地址重写

下面演示将"/"重写为/productpage

1.打开浏览器输入bookinfo.kubeasy.com:30080/,发现会报404

Istio 地址重写-1

2.在线修改vs,在末尾处添加以下内容

[root@k8s-master01 ~]# kubectl edit vs bookinfo -n bookinfo
  - match:
    - uri:
        exact: /
    rewrite:
      uri: /productpage
    route:
    - destination:
        host: productpage
        port:
          number: 9080

Istio 地址重写-2

3.打开浏览器输入bookinfo.kubeasy.com:30080/,发现可以正常打开界面

Istio 地址重写-3

四、Istio 负载均衡算法

Istio原生支持多种负载均衡算法,比如ROUND_ROBIN、LEAST_CONN、RANDOM等。假如一个应用存在多个副本(Pod),可以使用上述算法对多个Pod进行定制化的负载均衡配置。

每种负载均衡的策略如下:

  • ROUND_ROBIN:默认,轮询算法,将请求依次分配给每一个实例
  • LEAST_CONN:最小连接数,随机选择两个健康实例,将请求分配给两个健康实例中连接数少的那个
  • RANDOM:随机算法,将请求随机分配给其中一个实例
  • PASSTHROUGH:将连接转发到调用者请求的原始IP地址,而不进行任何形式的负载均衡,目前不推荐使用

在开始演示之前需要删除之前的vs配置,防止之前的配置对接下来的演示存在影响:

[root@k8s-master01 ~]# kubectl delete vs reviews   -n bookinfo

下面进行ROUND_ROBIN默认策略演示:

1.打开浏览器,输入bookinfo.kubeasy.com:30080/productpage后,多次刷新

Istio 负载均衡算法-1

2.打开kiali界面,观看 Kiali 中 reviews 的流量分配,观察到此时的流量大概是 1:1:1

Istio 负载均衡算法-2

下面进行RANDOM默认策略演示:

1.修改dr

[root@k8s-master01 ~]# vim  reviews-dr.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  trafficPolicy: # 添加路由策略,在spec下对所有的subset生效,也可以在subset中配置
    loadBalancer: # 配置负载均衡
      simple: RANDOM # 策略为 RANDOM
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1 # subsetv1指向具有version=v1的Pod
  - name: v2
    labels:
      version: v2 # subsetv2 指向具有version=v2的Pod
  - name: v3
    labels:
      version: v3 # subsetv3 指向具有version=v3的Pod

2.更新dr

[root@k8s-master01 ~]# kubectl replace -f reviews-dr.yaml -n  bookinfo

3.打开浏览器,输入bookinfo.kubeasy.com:30080/productpage后,多次刷新

4.打开kiali界面,观看 Kiali 中 reviews 的流量分配,观察到此时的流量不再是 1:1:1,而是随机产生的

Istio 负载均衡算法-3