故障注入测试
故障注入测试顾名思义就是当被测试应用部分组件或功能出现潜在故障时其本身的容错机制是否正常工作,以达到规避故障保证正常组件或功能的使用。Istio提供了HTTP故障注入功能,在http请求转发的过程中,用户可以设定一个或多个故障。故障注入的修改作用于Virtual Service,共有两种不同的故障模式abort和delay。
类型 | 所属 | 描述 |
abort | HTTPFaultInjection.Abort | 中断Http请求并且返回既定的错误状态码给请求方 |
delay | HTTPFaultInjection.Delay | 按预设的时延返回Http请求响应 |
为了方便大家理解本文内容,我们预先部署了bookinfo示例。
图中是原来完整的 virtualservice,设置了当cookie满足user=vip时,reviews的请求会流入v4版本,其余都会流入v1版本。
中断故障
当用户对某个负载注入了中断故障时,对于访问该负载的http请求,都会收到预先设定的错误状态码而不会收到正确内容的响应。图中的yaml截取于reviews的virtualservice文件。
我们可以看到对于版本v1的路由规则里多了一条fault对象。这个fault对象中,则包含了设定的故障属性。可以解读为,v1版本添加abort故障并且设定返回的http状态码为501,percent设定为100这意味着所有访问v1的请求都会收到501的http响应,显而易见如果这里设成50则只有一半的请求会收到501响应,另一半则会收到正常的响应。
如果我们访问productpage只能看到基本的报错信息,并不能确定,这到底是我们预设的中断故障起作用了,还是某种原因导致服务“崩了”。
为了确定是我们人工导致的服务中断,而不是其他,我们必须直接访问reviews。给Reviews组件配置外部ip,打开浏览器,并且按下F12,选择network,在地址栏中输入“地址/reviews/0”,network中会有一项红色报错信息,点开则可以看到我们预设的501报错状态码。至此中断故障已经成功注入。删除则只需将fault对象直接清除掉即可。
如果这时候我们去访问v4,将cookie设为user=vip
可以看到这时的reviews可以正常的显示。
延时故障注入
除了刚才延时的中断服务故障,延时故障也可以手动注入组件中。刚才使用的bookinfo示例中有两个版本v1和v4。我们已经给v1版本注入了中断故障,现在我们给v4版本注入延时故障,设定时间延迟为2秒,并且所有访问v4的请求都会有2秒的延迟。
如上,我们打开product page 以及 reviews page 来验证一下:
从这里我们可以看到product page 响应2.39秒
Reviews page的响应2.27s
我们用例子介绍了两种基本故障注入的方式
接下来我们看一些其他的故障注入例子
Virtual Service 例子1:
在这个例子中,当cookie满足user=vip时会触发延时故障,2秒延时后访问v4版本,当user=svip的时候则会触发中断故障,当cookie不满足以上两个条件时,则可以正常访问v1版本。
Virtual Service 例子2:
在这个例子中不论cookie符合vip还是svip,亦或是都不符合两个条件,都可以正常的访问到v1版本。这是由于route对象放在了第一个,没有任何匹配条件,不管cookie值是什么都“满足条件”,所以所有的流量不加任何处理直接会流向版本v1,这里要特殊提醒下,如若自己手动添加故障注入一定要注意相对顺序,否则可能不会出现你想设定的结果。
Virtual Service 例子3:
这个virtual service中我们对同一个版本注入了两个不同的故障,满足任何一个条件都可以触发相应的故障,如果所有条件都不满足则会默认的正常访问v1版本。那么问题来了,如果我没有配置最后一条route,出现了一条既不符合中断故障匹配条件,也不符合延时故障匹配条件,请求会走向哪里呢?对于这种yaml设置,结果异常的简单直白,如果请求不符合任何条件,则会直接获得404的响应,不会自动流入任何其他的版本。
故障注入测试为应用在上线前提供了完备的可靠性测试,istio为使用者进行故障注入提供了极大地便捷,在正确的地方添加3-4行配置而不用修改应用代码即可进行故障注入测试。希望有更多的人可以利用istio故障注入功能提供的便捷来提高自己的研发和测试效率。