在微服务之间调用的过程中,某个微服务出错是常见的。Istio的Fault Injection
功能能够帮我们测试延迟(delay)
和中止(abort)
场景,帮我们识别此类异常,而不会影响最终用户。
istio可以注入两种类型的错误,一种是delay,另一种是abort:
delay用于模拟网络延迟的情况;abort用于模拟HTTP错误(404, 5xx)或TCP连接失败的情况
Bookinfo页面是由多个微服务组成的,我们将对details
服务进行故障注入,模拟超时的场景:
正常的页面,左下角是book details, 我们将观察故障注入后它的状态:
上一节已经创建好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之前调用的错误:
刷新页面,大部分场景下都会超时,所以details部分会显示Error:
上面的测试会影响到所有用户,如果我们只针对某个用户做测试,可以用到上一节介绍的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