Fault Injection

在微服务之间调用的过程中,某个微服务出错是常见的。Istio的Fault Injection功能能够帮我们测试延迟(delay)中止(abort)场景,帮我们识别此类异常,而不会影响最终用户。

istio可以注入两种类型的错误,一种是delay,另一种是abort:

image-20220813225220548

delay用于模拟网络延迟的情况;abort用于模拟HTTP错误(404, 5xx)或TCP连接失败的情况

测试:

Bookinfo页面是由多个微服务组成的,我们将对details服务进行故障注入,模拟超时的场景:

image-20220813231738696

正常的页面,左下角是book details, 我们将观察故障注入后它的状态:

image-20220814092154916

上一节已经创建好details的DestinationRule,直接创建VirtualService:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - fault:
      delay:
        percentage:
          value: 70.0
        fixedDelay: 7s
    route:
    - destination:
        host: details
        subset: v1

将上面内容保存为details-fault-injection.yaml并执行kubectl apply -f details-fault-injection.yaml

当用户访问details页面时,有70%的机率遇到延迟7秒情况。


查看Kiali的graph,此时已上报productPage与details之前调用的错误:

image-20220814092650995

刷新页面,大部分场景下都会超时,所以details部分会显示Error:

image-20220814092722101


上面的测试会影响到所有用户,如果我们只针对某个用户做测试,可以用到上一节介绍的http header:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - headers:
        end-user:
          exact: test
    fault:
      delay:
        percentage:
          value: 100.0
        fixedDelay: 7s
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1