有时可能需要模拟服务时延和服务出错故障同时出现的场景,比如当服务出现过载情况时,可能会出现所有请求响应变慢,大部分请求失败,只有部分请求成功的情况。Istio的时延和错误注入功能是相互独立工作的,可以同时设置,分别起作用,互不干扰,能够模拟服务过载出现的异常情况。
时延与错误配合使用示例如下:
1 apiVersion: networking.istio.io/v1alpha3 2 kind: DestinationRule 3 metadata: 4 name: service-go 5 spec: 6 host: service-go 7 subsets: 8 - name: v1 9 labels: 10 version: v1 11 - name: v2 12 labels: 13 version: v2 14 --- 15 apiVersion: networking.istio.io/v1alpha3 16 kind: VirtualService 17 metadata: 18 name: service-go 19 spec: 20 hosts: 21 - service-go 22 http: 23 - route: 24 - destination: 25 host: service-go 26 subset: v1 27 fault: 28 delay: 29 percent: 100 30 fixedDelay: 5s 31 abort: 32 percent: 50 33 httpStatus: 500
第27~33行定义了服务故障注入规则,同时设置了时延和错误注入规则。代码中定义的规则表明要给调用service-go服务v1版本的所有请求增加5秒的时延,并且抽取50%的请求得到错误响应码为500。
【实验】
1)创建基础路由规则,创建Gateway应用访问入口,service-js服务路由规则:
$ kubectl apply -f istio/route/gateway-js-v1.yaml
2)创建service-go服务的时延和错误故障注入规则:
$ kubectl apply -f istio/fault/virtual-service-go-delay-abort.yaml
3)浏览器访问。
浏览器访问地址为http://11.11.11.111:31380/ ,多次点击“发射”按钮,查看服务调用情况,可以看到,有部分请求出现5秒左右的调用时延但调用成功,如图9-3所示。
有部分请求出现5秒左右的调用时延,且调用失败,如图9-4所示。
图9-3 时延与错误配合使用
图9-4 部分请求出现5秒左右的调用时延,且调用失败
4)清理:
$ kubectl delete -f istio/route/gateway-js-v1.yaml $ kubectl delete -f istio/fault/virtual-service-go-delay-abort.yaml