故障注入
此任务向您展示如何注入故障以测试应用程序的弹性。
开始之前
按照 安装指南 中的说明设置 Istio。
查看 流量管理 概念文档中关于故障注入的讨论。
通过执行 请求路由 任务或运行以下命令来应用应用程序版本路由
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@ $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
使用上述配置,请求流如下
productpage
→reviews:v2
→ratings
(仅适用于用户jason
)productpage
→reviews:v1
(适用于其他所有人)
注入 HTTP 延迟故障
为了测试 Bookinfo 应用程序微服务的弹性,在用户 jason
的 reviews:v2
和 ratings
微服务之间注入 7 秒延迟。此测试将发现 Bookinfo 应用程序中故意引入的错误。
请注意,reviews:v2
服务对 ratings
服务的调用具有硬编码的 10 秒连接超时。即使你引入了 7 秒的延迟,你仍然期望端到端流程在没有任何错误的情况下继续进行。
创建一个故障注入规则,以延迟来自测试用户
jason
的流量。$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@
确认规则已创建
$ kubectl get virtualservice ratings -o yaml apiVersion: networking.istio.io/v1 kind: VirtualService ... spec: hosts: - ratings http: - fault: delay: fixedDelay: 7s percentage: value: 100 match: - headers: end-user: exact: jason route: - destination: host: ratings subset: v1 - route: - destination: host: ratings subset: v1
允许几秒钟让新规则传播到所有 pod。
测试延迟配置
在你的浏览器中打开 Bookinfo Web 应用程序。
在
/productpage
网页上,以用户jason
的身份登录。你期望 Bookinfo 主页在约 7 秒内加载,没有任何错误。但是,存在问题:评论部分显示错误消息。
Sorry, product reviews are currently unavailable for this book.
查看网页响应时间
- 打开你网页浏览器的“开发者工具”菜单。
- 打开网络选项卡。
- 重新加载
/productpage
网页。你将看到该页面实际上在约 6 秒内加载。
了解发生了什么
你发现了一个错误。微服务中存在硬编码的超时,导致 reviews
服务失败。
如预期的那样,你引入的 7 秒延迟不会影响 reviews
服务,因为 reviews
和 ratings
服务之间的超时被硬编码为 10 秒。但是,productpage
和 reviews
服务之间也存在硬编码的超时,编码为 3 秒 + 1 次重试,总计 6 秒。因此,productpage
对 reviews
的调用在 6 秒后过早超时并抛出错误。
在不同的团队独立开发不同微服务的典型企业应用程序中,可能会发生此类错误。Istio 的故障注入规则可以帮助你在不影响最终用户的情况下识别这些异常。
修复错误
你通常会通过以下方法修复问题:
- 要么增加
productpage
到reviews
服务的超时,要么减少reviews
到ratings
服务的超时。 - 停止并重新启动修复的微服务。
- 确认
/productpage
网页返回其响应,没有任何错误。
但是,你已经在 reviews
服务的 v3 版本中运行了一个修复程序。reviews:v3
服务将 reviews
到 ratings
的超时从 10 秒减少到 2.5 秒,使其与(小于)下游 productpage
请求的超时兼容。
如果你按照 流量切换 任务中所述将所有流量迁移到 reviews:v3
,你就可以尝试将延迟规则更改为小于 2.5 秒的任何值(例如 2 秒),并确认端到端流程在没有任何错误的情况下继续进行。
注入 HTTP 中断故障
测试微服务弹性的另一种方法是引入 HTTP 中断故障。在本任务中,你将为测试用户 jason
向 ratings
微服务引入 HTTP 中断。
在这种情况下,你期望页面立即加载并显示 评分服务当前不可用
消息。
创建一个故障注入规则,为用户
jason
发送 HTTP 中断。$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@
确认规则已创建
$ kubectl get virtualservice ratings -o yaml apiVersion: networking.istio.io/v1 kind: VirtualService ... spec: hosts: - ratings http: - fault: abort: httpStatus: 500 percentage: value: 100 match: - headers: end-user: exact: jason route: - destination: host: ratings subset: v1 - route: - destination: host: ratings subset: v1
测试中断配置
在你的浏览器中打开 Bookinfo Web 应用程序。
在
/productpage
上,以用户jason
的身份登录。如果规则已成功传播到所有 pod,则页面会立即加载,并且会显示
评分服务当前不可用
消息。如果你从用户
jason
退出登录,或者在匿名窗口(或其他浏览器)中打开 Bookinfo 应用程序,你将看到/productpage
仍然会调用reviews:v1
(根本不会调用ratings
) 对于除jason
之外的所有人。因此,你将不会看到任何错误消息。
清理
删除应用程序路由规则。
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
如果你不打算探索任何后续任务,请参阅 Bookinfo 清理 指令以关闭应用程序。