故障注入

    • 按照安装指南中的说明设置 Istio 。

    • 部署示例应用程序 ,并应用 默认目标规则

    • 在概念文档中查看有关故障注入的讨论。

    • 通过执行配置请求路由任务或运行以下命令来初始化应用程序版本路由:

      Zip

    • 经过上面的配置,下面是请求的流程:

      • reviews:v2ratings (针对 jason 用户)
      • productpagereviews:v1 (其他用户)

    注入 HTTP 延迟故障

    为了测试微服务应用程序 Bookinfo 的弹性,我们将为用户 jasonreviews:v2ratings 服务之间注入一个 7 秒的延迟。 这个测试将会发现一个故意引入 Bookinfo 应用程序中的 bug。

    注意 reviews:v2 服务对 ratings 服务的调用具有 10 秒的硬编码连接超时。 因此,尽管引入了 7 秒的延迟,我们仍然期望端到端的流程是没有任何错误的。

    1. 创建故障注入规则以延迟来自测试用户 jason 的流量:

      Zip

      1. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@
    2. 确认规则已经创建:

    1. 通过浏览器打开 应用。

    2. 查看页面的响应时间:

      1. 打开浏览器的 开发工具 菜单
      2. 打开 网络 标签
      3. 重新加载 productpage 页面。你会看到页面加载实际上用了大约 6s。

    理解原理

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

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

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

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

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

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

    但是,reviews 服务的 v3 版本已经修复了这个问题。 reviews:v3 服务已将 reviewsratings 的超时时间从 10 秒降低为 2.5 秒,因此它可以兼容(小于)下游的 productpage 的请求。

    如果您按照任务所述将所有流量转移到 reviews:v3, 您可以尝试修改延迟规则为任何低于 2.5 秒的数值,例如 2 秒,然后确认端到端的流程没有任何错误。

    注入 HTTP abort 故障

    在这种情况下,我们希望页面能够立即加载,同时显示 Ratings service is currently unavailable 这样的消息。

    1. 为用户 jason 创建一个发送 HTTP abort 的故障注入规则:

    2. 确认规则已经创建:

      1. $ kubectl get virtualservice ratings -o yaml
      2. apiVersion: networking.istio.io/v1beta1
      3. kind: VirtualService
      4. spec:
      5. hosts:
      6. - ratings
      7. http:
      8. abort:
      9. percentage:
      10. value: 100
      11. match:
      12. - headers:
      13. end-user:
      14. exact: jason
      15. route:
      16. - destination:
      17. host: ratings
      18. subset: v1
      19. - route:
      20. - destination:
      21. host: ratings
      22. subset: v1
    1. 用浏览器打开 Bookinfo 应用。

    2. 使用用户 jason 登陆到 /productpage 页面。

      如果规则成功传播到所有的 pod,您应该能立即看到页面加载并看到 Ratings service is currently unavailable 消息。

    3. 如果您注销用户 jason 或在匿名窗口(或其他浏览器)中打开 Bookinfo 应用程序, 您将看到 /productpage 为除 jason 以外的其他用户调用了 reviews:v1(完全不调用 )。 因此,您不会看到任何错误消息。

    清理

    1. 删除应用程序路由规则:

      Zip

    2. 如果您不打算探索任何后续任务,请参阅 说明以关闭应用程序。