概述
注意:在使用阿里云Kubernetes容器服务Istio 1.0的过程中,如果遇到类似CRD版本问题,请参考我们提供的问题分析。 我们会持续更新遇到的问题及其解决方法。
上一篇文章通过一个官方示例演示了如何部署应用到上述Istio环境中,本文使用此示例来尝试 Istio 的流量路由、故障注入、流量转移等功能。
阿里云Kubernetes Service Mesh实践进行时(1): Istio初体验
阿里云Kubernetes Service Mesh实践进行时(2): 通过示例深入Istio
阿里云Kubernetes Service Mesh实践进行时(3): 智能路由
阿里云Kubernetes Service Mesh实践进行时(4): 分布式追踪
阿里云Kubernetes Service Mesh实践进行时(5): 遥测数据收集、查询及可视化
阿里云Kubernetes Service Mesh实践进行时(6): 故障诊断与检测工具Weave Scope
阿里云Kubernetes Service Mesh实践进行时(7): 可观测性分析服务Kiali
如下所示,包括了四个独立的微服务,由不同语言编写,这些服务与 Istio 本身没有任何依赖关系。
请求路由
BookInfo示例部署了三个版本的reviews服务,因此需要设置一个缺省路由。否则当多次访问该应用程序时,会发现有时输出会包含带星级的评价内容,有时又没有。出现该现象的原因是当没有为应用显式指定缺省路由时,Istio会将请求随机路由到该服务的所有可用版本上。
将所有微服务的缺省版本设置为v1
通过运行如下命令,将所有微服务的缺省版本设置为v1:
istioctl create -f samples/bookinfo/routing/route-rule-all-v1.yaml
可以通过下面的命令来显示所有以创建的路由规则:
istioctl get virtualservices -o yaml
由于路由规则是通过异步方式分发到代理的,过一段时间后规则才会同步到所有pod上。因此需要等几秒钟后再尝试访问应用。
在浏览器中打开BookInfo应用程序的URL: http://{EXTERNAL-IP}/productpage
如何获取EXTERNAL-IP,请参照上一篇文章的介绍。
可以看到BookInfo应用程序的productpage页面,显示的内容中不包含带星的评价信息,这是因为reviews:v1服务不会访问ratings服务。
将来自特定用户的请求路由到reviews:v2
通过运行如下命令,把来自测试用户"jason"的请求路由到reviews:v2,以启用ratings服务。
kubectl replace -f samples/bookinfo/routing/route-rule-reviews-test-v2.yaml
可以通过如下命令确认规则是否创建:
kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
clusterName: ""
creationTimestamp: 2018-06-04T10:49:53Z
generation: 0
name: reviews
namespace: default
resourceVersion: "2596548"
selfLink: /apis/networking.istio.io/v1alpha3/namespaces/default/virtualservices/reviews
uid: 03528fd9-67e5-11e8-af82-00163e0c19c2
spec:
hosts:
- reviews
http:
- match:
- headers:
cookie:
regex: ^(.*?;)?(user=jason)(;.*)?$
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
确认规则已创建之后,在浏览器中打开BookInfo应用程序的URL: http://{EXTERNAL-IP}/productpage
以"jason"用户登录productpage页面,应该可以在每条评价后面看到星级信息。
理解背后的机制: 首先使用Istio将100%的请求流量都路由到了BookInfo服务的v1版本,然后再设置了一条路由规则;该路由规则基于请求的header(例如一个用户cookie)选择性地将特定的流量路由到了reviews服务的v2版本。
故障注入
为了测试BookInfo微服务应用的弹性,我们计划针对"jason"用户在reviews:v2和ratings服务之间 注入7秒的延迟 。由于 reviews:v2 服务针对调用ratings服务设置了10秒的超时,因此期望端到端的流程能无错持续。
HTTP Delay
使用HTTP Delay创建一个故障注入规则,延迟来自用户jason的流量:
kubectl replace -f samples/bookinfo/routing/route-rule-ratings-test-delay.yaml
确认规则已创建之后,在浏览器中打开BookInfo应用程序的URL: http://{EXTERNAL-IP}/productpage
以"jason"用户登录productpage页面,应该可以看到如下画面:
整个review服务失败的原因:productpage和review服务之间的超时小于(3秒加上一次重试,总共6秒)review服务和rating服务之间的超时(10秒)。在由不同开发团队负责独立开发不同微服务的典型企业应用中,这类bug就会发生。Istio的故障注入规则有助于识别这些异常,而无需影响到最终用户。
HTTP Abort
类似地,使用HTTP Abort创建一个故障注入规则:
kubectl replace -f samples/bookinfo/routing/route-rule-ratings-test-abort.yaml
确认规则已创建之后,在浏览器中打开BookInfo应用程序的URL: http://{EXTERNAL-IP}/productpage
以"jason"用户登录productpage页面,应该可以看到如下画面:
流量转移
除了基于内容的路由,Istio还支持基于权重的路由规则。
首先,将所有微服务的缺省版本设置为v1:
kubectl replace -f samples/bookinfo/routing/route-rule-all-v1.yaml
其次,使用下面的命令把50%的流量从reviews:v1转移到reviews:v3:
kubectl replace -f samples/bookinfo/routing/route-rule-reviews-50-v3.yaml
在浏览器中多次刷新productpage页面,大约有50%的几率会看到页面中出现带红星的评价内容。
注意该方式和使用容器编排平台的部署特性来进行版本迁移是完全不同的。容器编排平台使用了实例scaling来对流量进行管理。而通过Istio,两个版本的reviews服务可以独立地进行scale up和scale down,并不会影响这两个版本服务之间的流量分发。
总结
我们可以利用阿里云Kubernetes容器服务,快速搭建一套用于连接、管理以及安全化微服务的开放平台Istio,为应用引入和配置多个相关服务。本文通过一个官方示例来尝试了Istio 的流量路由、故障注入、流量转移等功能。欢迎大家使用阿里云上的容器服务,快速搭建微服务的开放治理平台Istio,比较简单地集成到自己项目的微服务开发中。