Istio 1.0学习笔记(四):使用Istio对服务进行流量管理 - 故障注入
2018-08-28
故障注入是指将故障注入系统,便于检查系统在存在故障时的行为,以检查系统的可用性方面是否按我们期望的方式运行。 本篇将参考Istio的Tasks文档Fault Injection体验Istio在流量管理方面的故障注入功能。
继续使用前面已经部署好的bookinfo应用,执行下面的命令初始化bookinfo应用的路由:
1kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
2kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
当前的路由是,默认情况下将请求路由到所有服务的v1版本,同时对于jason用户访问reviews服务时,会被路由到reviews服务的v2版本。
1.HTTP延迟故障注入 #
为了测试Bookinfo应用微服务的弹性能力,下面将只对jason用户从reviews:v2
服务到ratings
服务的请求注入一个7s的延迟。这个测试主要用于发现Bookinfo App的潜在bug。注意reviews:v2
在请求ratings
服务时作为客户端硬编码设置了10s的超时时间,通过注入7s的HTTP延迟故障,目的是为了测试在这种情况下端到端的流程不会出现错误。
下面创建来自用户"jason"的HTTP延迟故障注入规则:
1kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
查看samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml:
1apiVersion: networking.istio.io/v1alpha3
2kind: VirtualService
3metadata:
4 name: ratings
5spec:
6 hosts:
7 - ratings
8 http:
9 - match:
10 - headers:
11 end-user:
12 exact: jason
13 fault:
14 delay:
15 percent: 100
16 fixedDelay: 7s
17 route:
18 - destination:
19 host: ratings
20 subset: v1
21 - route:
22 - destination:
23 host: ratings
24 subset: v1
针对来自jason用户的请求对ratings服务注入了7s的延迟故障,此时如果访问http://192.168.61.12/productpage
,期望的效果是虽然页面大约7秒多能加载出来,但是不会有错误发生,因为reviews:v2
在请求ratings
服务时作为客户端硬编码设置了10s的超时时间。
实际访问时大约6秒页面加载出来了,但是在页面中的Book Reviews内容区出现了错误:Error fetching product reviews!Sorry, product reviews are currently unavailable for this book.
。这和我们期不符合,通过这个HTTP延迟故障注入,发现了reviews:v2
这个版本的服务的潜在bug。
注意我们只是为jason用户注入了延迟故障,而如果以其他用户登录不会遇到任何延迟问题
在通过故障注入发现此类问题后,当然要修复这个问题, 可以通过提高productpage作为客户端到reviews服务的超时时间,或者降低reviews服务和ratings服务之间请求的超时时间。
2.HTTP abort故障注入 #
对微服务进行弹性测试的另外一种方式是引入HTTP abort故障,下面当jason用户访问ratings服务时加入一个HTTP中断,注入一个HTTP 500错误。
1kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
查看samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml:
1apiVersion: networking.istio.io/v1alpha3
2kind: VirtualService
3metadata:
4 name: ratings
5spec:
6 hosts:
7 - ratings
8 http:
9 - match:
10 - headers:
11 end-user:
12 exact: jason
13 fault:
14 abort:
15 percent: 100
16 httpStatus: 500
17 route:
18 - destination:
19 host: ratings
20 subset: v1
21 - route:
22 - destination:
23 host: ratings
24 subset: v1
此时以jason用户登录访问http://192.168.61.12/productpage
,页面上会立即显示而且Book Reviews
区域可以显示内容,但会出现Ratings service is currently unavailable
的信息。而如果以其他用户登录,页面所有区域都将显示正常。
在完成了前面的两个实验后,使用kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml
完成清理工作,便于我们后边进一步的实验。