故障注入

此任务说明如何注入延迟并测试应用程序的弹性。

前提条件

ZipZip

  1. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  2. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
  • 通过上面的配置,下面是请求的流程:

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

使用 HTTP 延迟进行故障注入

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

由于 reviews:v2 服务对其 ratings 服务的调用具有 10 秒的硬编码连接超时,比我们设置的 7s 延迟要大,因此我们期望端到端流程是正常的(没有任何错误)。

  • 创建故障注入规则以延迟来自用户 jason(我们的测试用户)的流量

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@
  • 确认已创建规则:
  1. $ kubectl get virtualservice ratings -o yaml
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: VirtualService
  4. metadata:
  5. name: ratings
  6. ...
  7. spec:
  8. hosts:
  9. - ratings
  10. http:
  11. - fault:
  12. delay:
  13. fixedDelay: 7s
  14. percent: 100
  15. match:
  16. - headers:
  17. end-user:
  18. exact: jason
  19. route:
  20. - destination:
  21. host: ratings
  22. subset: v1
  23. - route:
  24. - destination:
  25. host: ratings
  26. subset: v1

规则可能需要几秒钟才能传播到所有的 pod 。

延时配置测试

  • 通过浏览器打开 Bookinfo 应用。

  • 使用用户 jason 登陆到 /productpage 界面。

你期望 Bookinfo 主页在大约 7 秒钟加载完成并且没有错误。但是,出现了一个问题,Reviews 部分显示了错误消息:

  1. Error fetching product reviews!
  2. Sorry, product reviews are currently unavailable for this book.
  • 查看页面的返回时间:

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

理解原理

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

productpagereviews 服务之间超时时间是 6s - 编码 3s + 1 次重试总共 6s ,reviewsratings 服务之间的硬编码连接超时为 10s 。由于我们引入的延时,/productpage 提前超时并引发错误。

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

请注意,我们仅限制用户 jason 的失败影响。如果您以任何其他用户身份登录,则不会遇到任何延迟。

错误修复

你通常会解决这样的问题:

  • 要么增加 /productpage 的超时或者减少 reviewsratings 服务的超时
  • 终止并重启微服务
  • 确认 productpage 正常响应并且没有任何错误。但是,我们已经在 reviews 服务的 v3 版中运行此修复程序,因此我们可以通过将所有流量迁移到 reviews:v3 来解决问题,如流量转移中所述任务。

练习

将延迟规则更改为使用 2.8 秒延迟,然后针对 v3 版本的 reviews 运行它。

使用 HTTP abort 进行故障注入

测试微服务弹性的另一种方法是引入 HTTP abort 故障。在这个任务中,在 ratings 微服务中引入 HTTP abort ,测试用户为 jason

在这个案例中,我们希望页面能够立即加载,同时显示 Ratings service is currently unavailable 这样的消息。

  • 为用户 jason 创建故障注入规则发送 HTTP abort

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@
  • 确认已创建规则
  1. $ kubectl get virtualservice ratings -o yaml
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: VirtualService
  4. metadata:
  5. name: ratings
  6. ...
  7. spec:
  8. hosts:
  9. - ratings
  10. http:
  11. - fault:
  12. abort:
  13. httpStatus: 500
  14. percent: 100
  15. match:
  16. - headers:
  17. end-user:
  18. exact: jason
  19. route:
  20. - destination:
  21. host: ratings
  22. subset: v1
  23. - route:
  24. - destination:
  25. host: ratings
  26. subset: v1

测试中止配置

  • 通过浏览器打开 Bookinfo 应用。

  • 使用用户 jason 登陆到 /productpage 界面。

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

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

清理

  • 删除应用程序路由规则:

Zip

  1. $ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  • 如果您不打算探索任何后续任务,请参阅 Bookinfo 清理说明以关闭应用程序。

相关内容

多集群服务网格中的分版本路由

在多集群服务网格环境中配置 Istio 的路由规则。

Egress gateway 性能测试

评估加入 Egress gateway 对性能造成的影响。

Istio Sidecar 注入过程解密

Istio 将数据面组件注入到现存部署之中的过程。

使用 Cert-Manager 部署一个自定义 Ingress 网关

如何使用 cert-manager 手工部署一个自定义 Ingress 网关。

增量式应用 Istio 第一部分,流量管理

如何在不部署 Sidecar 代理的情况下使用 Istio 进行流量管理。

使用外部 MongoDB 服务

描述了一个基于 Istio 的 Bookinfo 示例的简单场景。