5.3.2 故障注入
1. 前置条件
- 安装好
Istio
- 部署
bookinfo
示例,并应用默认目标规则 - 初始化应用程序路由
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
2. 注入HTTP延迟故障
为了测试微服务应用程序Bookinfo
的弹性,我们将为用户jason
在reviews:v2
和ratings
服务之间注入一个7秒的延迟。这个测试将会发现一个故意引入Bookinfo
应用程序中的bug。
注意reviews:v2
服务对ratings
服务的调用具有10秒的硬编码连接超时。因此,尽管引入了7秒的延迟,我们仍然期望端到端的流程是没有任何错误的。
2.1 创建故障注入规则以延迟测试用户jason
的流量
kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
virtualservice.networking.istio.io/ratings configured
2.2 确认规则已经创建
kubectl get virtualservice ratings -o yaml
2.4 测试延迟配置
打开浏览器,访问bookinfo应用:http://${GATEWAY_URL}/productpage
,并使用jason登录
Sorry, product reviews are currently unavailable for this book.
2.4 原理
你发现了一个bug。微服务中有硬编码超时,导致reviews
服务失败。
按照预期,我们引入的7秒延迟不会影响到reviews
服务,因为reviews
和ratings
服务间的超时被硬编码为10秒。但是,在productpage
和reviews
服务之间也有一个3秒的硬编码的超时,再加1次重试,一共6秒。结果,productpage
对reviews
的调用在6秒后提前超时并抛出错误了。
这种类型的错误可能发生在典型的由不同的团队独立开发不同的微服务的企业应用程序中。Istio
的故障注入规则可以帮助您识别此类异常,而不会影响最终用户。
请注意,此次故障注入限制为仅影响用户 jason。如果您以任何其他用户身份登录,则不会遇到任何延迟。
2.5 错误修复
这种问题通常会这么解决:
- 增加
productpage
与reviews
服务之间的超时或降低reviews
与ratings
的超时 - 终止并重启修复后的微服务
- 确认
/productpage
页面正常响应且没有任何错误
但是,reviews
服务的v3版本已经修复了这个问题。reviews:v3
服务已将reviews
与ratings
的超时时间从10秒降低为 2.5 秒,因此它可以兼容(小于)下游的productpage
的请求。
3.注入HTTP abort故障
给ratings
微服务为测试用户jason
引入一个 HTTP abort。我们希望页面能够立即加载,同时显示Ratings service is currently unavailable
这样的消息。
3.1 为用户jason
创建一个发送HTTP abort的故障注入规则
kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
virtualservice.networking.istio.io/ratings configured
3.2 确认规则已经创建
kubectl get virtualservice ratings -o yaml
3.3 测试HTTP abort
用浏览器,打开bookinfo应用,使用jason登录
Ratings service is currently unavailable
注销后页面正常