一、实验场景说明¶
下面部署了一个用于演示多种 Istio 特性的应用,该应用由四个单独的微服务构成:
productpage. 这个微服务会调用details和reviews两个微服务,用来生成页面。details. 这个微服务中包含了书籍的信息。reviews. 这个微服务中包含了书籍相关的评论。它还会调用ratings微服务。ratings. 这个微服务中包含了由书籍评价组成的评级信息。
其中reviews 微服务有 3 个版本:
- v1 版本不会调用
ratings服务。 - v2 版本会调用
ratings服务,并使用 1 到 5 个黑色星形图标来显示评分信息。 - v3 版本会调用
ratings服务,并使用 1 到 5 个红色星形图标来显示评分信息。
其中应用的端到端架构如下:

Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。
以下示例默认已经完成 Bookinfo 应用部署,并通过 bookinfo-gateway 暴露访问入口。
二、Istio 实现 AB 测试¶
2.1 什么是 AB 测试¶
在 Istio 中,AB 测试是一种基于服务网格架构的测试方法,用于比较两个或多个不同版本的微服务在生产环境中的性能、稳定性和用户体验。Istio 是一个用于管理、保护和监控微服务应用程序的开源平台,它通过引入代理来实现对服务之间通信的控制和可观察性。
所谓AB测试,就是限制指定的用户访问新版本,待新版本无问题且反馈较好时,才会让所有用户使用新版本。
2.2 实现 AB 测试¶
下面进行AB测试,将将jason用户指向v3,其他用户依旧使用v2版本

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,观察到页面只显示黑色五角星

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


当然,你也可以通过查看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 地址重写和重定向¶
3.1 Istio 地址重定向¶
下面演示将 bookinfo.kubeasy.com/gx,跳转到 https://www.zhihu.com/people/xun-zhao-you-yuan-ren-42/posts
1.提前访问bookinfo.kubeasy.com:30080/gx,报404(后面对比)

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 # 跳转的路径

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

3.2 Istio 地址重写¶
下面演示将"/"重写为/productpage
1.打开浏览器输入bookinfo.kubeasy.com:30080/,发现会报404

2.在线修改vs,在末尾处添加以下内容
[root@k8s-master01 ~]# kubectl edit vs bookinfo -n bookinfo
- match:
- uri:
exact: /
rewrite:
uri: /productpage
route:
- destination:
host: productpage
port:
number: 9080

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

四、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后,多次刷新

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

下面进行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,而是随机产生的
