故障注入是指将故障注入系统,便于检查系统在存在故障时的行为,以检查系统的可用性方面是否按我们期望的方式运行。 本篇将参考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。

bookinfo-fault-inject-find-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的信息。而如果以其他用户登录,页面所有区域都将显示正常。

bookinfo-abort-fault-inject

在完成了前面的两个实验后,使用kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml完成清理工作,便于我们后边进一步的实验。

参考