在Kubernetes上基于Istio实现Service Mesh智能路由
阿里云容器服务支持一键部署Istio,并支持多种扩展功能,本例中介绍如何通过Istio实现智能路由。Istio官方文档请参考intelligent-routing。
前提条件
- 您已成功部署一个Kubernetes集群,参见创建Kubernetes 集群。
- 您已成功部署了Istio,参见部署Istio。
说明 本例中Isito的版本是1.0.2。
- 您需要拥有一个本地Linux环境,并已配置好Kubectl工具连接到集群,参见通过 kubectl 连接 Kubernetes 集群。
- 您已下载对应Istio版本的项目代码,并在Istio文件目录下执行相关命令。参见https://github.com/istio/istio/releases。
安装官方示例
首先快速安装Bookinfo官方示例,具体可以参见: https://istio.io/docs/guides/bookinfo。
请求路由
BookInfo示例部署了三个版本的reviews服务,因此需要设置一个缺省路由。否则当多次访问该应用程序时,会发现有时输出会包含带星级的评价内容,有时又没有。出现该现象的原因是当没有为应用显式指定缺省路由时,Istio会将请求随机路由到该服务的所有可用版本上。
在使用 Istio 控制 Bookinfo 版本路由之前,您需要在目标规则中定义好可用的版本 。
运行以下命令为 Bookinfo 服务创建的默认的目标规则:
- 如果不需要启用双向TLS,请执行以下命令:
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
- 如果需要启用双向 TLS,请执行以下命令:
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
等待几秒钟,等待目标规则生效。您可以使用以下命令查看目标规则:
$ kubectl get destinationrules -o yaml
将所有微服务的缺省版本设置为v1
通过运行如下命令,将所有微服务的缺省版本设置为v1:
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
可以通过下面的命令来显示所有已创建的路由规则:
kubectl get virtualservices -o yaml
由于路由规则是通过异步方式分发到代理的,过一段时间后规则才会同步到所有pod上。因此需要等几秒钟后再尝试访问应用。
在浏览器中打开BookInfo应用程序的URL:http://{EXTERNAL-IP}/productpage
。

将来自特定用户的请求路由到reviews:v2
通过运行如下命令,把来自测试用户”jason”的请求路由到reviews:v2,以启用ratings服务。
$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
可以通过如下命令确认规则是否创建:
$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
...
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
确认规则已创建之后,在浏览器中打开BookInfo应用程序的URL: http://{EXTERNAL-IP}/productpage
。
jason
。

故障注入
为了测试BookInfo微服务应用的弹性,我们计划针对”jason”用户在reviews:v2
和ratings
服务之间注入7秒的延迟 。由于 reviews:v2 服务针对调用ratings服务设置了10秒的超时,因此期望端到端的流程能无错持续。
HTTP Delay
使用HTTP Delay创建一个故障注入规则,延迟来自用户jason的流量:
$ kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
确认规则已创建之后,在浏览器中打开BookInfo应用程序的URL: http://{EXTERNAL-IP}/productpage
。

HTTP Abort
类似地,使用HTTP Abort创建一个故障注入规则:
$ kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
确认规则已创建之后,在浏览器中打开BookInfo应用程序的URL: http://{EXTERNAL-IP}/productpage
。
以”jason”用户登录productpage页面,应该可以看到如下画面:

流量转移
除了基于内容的路由,Istio还支持基于权重的路由规则。
首先,将所有微服务的缺省版本设置为v1:
$ kubectl replace -f samples/bookinfo/networking/virtual-service-all-v1.yaml
其次,使用下面的命令把50%的流量从reviews:v1转移到reviews:v3:
$ kubectl replace -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
在浏览器中多次刷新productpage页面,大约有50%的几率会看到页面中出现带红星的评价内容。
reviews:v3
微服务已经稳定,你可以通过以下命令, 将virtual service 100%的流量路由到 reviews:v3
,从而实现一个灰度发布的功能。
$ kubectl replace -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml
总结
我们可以利用阿里云Kubernetes容器服务,快速搭建一套用于连接、管理以及安全化微服务的开放平台Istio,为应用引入和配置多个相关服务。本文通过一个官方示例来尝试了Istio
的流量路由、故障注入、流量转移等功能。欢迎大家使用阿里云上的容器服务,快速搭建微服务的开放治理平台Istio,比较简单地集成到自己项目的微服务开发中。
发布者:佚, 佚名,转转请注明出处:https://www.cms2.cn/aliyun/csk/5163.html