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的弹性,我们将为用户jasonreviews:v2ratings服务之间注入一个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登录

image-20200212213537683

Sorry, product reviews are currently unavailable for this book.

2.4 原理

你发现了一个bug。微服务中有硬编码超时,导致reviews服务失败。

按照预期,我们引入的7秒延迟不会影响到reviews服务,因为reviewsratings服务间的超时被硬编码为10秒。但是,在productpagereviews服务之间也有一个3秒的硬编码的超时,再加1次重试,一共6秒。结果,productpagereviews的调用在6秒后提前超时并抛出错误了。

这种类型的错误可能发生在典型的由不同的团队独立开发不同的微服务的企业应用程序中。Istio的故障注入规则可以帮助您识别此类异常,而不会影响最终用户。

请注意,此次故障注入限制为仅影响用户 jason。如果您以任何其他用户身份登录,则不会遇到任何延迟。

2.5 错误修复

这种问题通常会这么解决:

  1. 增加productpagereviews服务之间的超时或降低reviewsratings的超时
  2. 终止并重启修复后的微服务
  3. 确认/productpage页面正常响应且没有任何错误

但是,reviews服务的v3版本已经修复了这个问题。reviews:v3服务已将reviewsratings的超时时间从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登录

image-20200212214534271

Ratings service is currently unavailable

注销后页面正常

Copyright © huangzhongde.cn 2021 all right reserved,powered by Gitbook该文件修订时间: 2022-01-28 00:02:24

results matching ""

    No results matching ""