故障注入

注意:此任务使用新的 v1alpha3 流量管理 API。旧的 API 已被弃用,将在下一个 Istio 版本中删除。如果您需要使用旧版本,请按照此处的文档操作。

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

前提条件

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

  • 部署示例应用程序 Bookinfo

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

    $ istioctl create -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
    $ istioctl replace -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@

使用 HTTP 延迟进行故障注入

为了测试我们的微服务应用程序 Bookinfo 的弹性,我们将在 reviews :v2 和 ratings 服务之间的一个用户 “jason” 注入一个 7 秒 的延迟。 由于 reviews:v2 服务对其 ratings 服务的调用具有 10 秒的硬编码连接超时,因此我们期望端到端流程是正常的(没有任何错误)。

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

    $ istioctl replace -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@

    确认已创建规则:

    $ istioctl get virtualservice ratings -o yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: ratings
      ...
    spec:
      hosts:
      - ratings
        http:
      - fault:
          delay:
            fixedDelay: 7s
            percent: 100
        match:
        - headers:
            end-user:
              exact: jason
        route:
        - destination:
            host: ratings
            subset: v1
      - route:
        - destination:
            host: ratings
            subset: v1

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

  2. 观察应用程序行为

    以 “jason” 用户身份登录。如果应用程序的首页设置为正确处理延迟,我们预计它将在大约 7 秒内加载。 要查看网页响应时间,请在IE,Chrome 或 Firefox 中打开 Developer Tools 菜单(通常,组合键 Ctrl+Shift+IAlt+Cmd+I ), 选项卡 Network,然后重新加载 productpage 网页 。

    您将看到网页加载大约 6 秒钟。评论部分将显示 对不起,此书的产品评论目前不可用

了解发生了什么

整个评论服务失败的原因是我们的 Bookinfo 应用程序有错误。 产品页面和评论服务之间的超时(评分为 3 次+ 1 次重试 = 总共 6 次)比评论和评级服务之间的超时时间(硬编码连接超时为 10 秒)。 这些类型的错误可能发生在典型的企业应用程序中,其中不同的团队独立地开发不同的微服务。 Istio 的故障注入规则可帮助您识别此类异常,而不会影响最终用户。

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

修复错误: 此时我们通常会通过增加产品页面超时或减少评级服务超时的评论来解决问题, 终止并重启固定的微服务,然后确认 productpage 返回其响应, 没有任何错误。

但是,我们已经在评论服务的第 3 版中运行此修复程序, 因此我们可以通过将所有流量迁移到 reviews:v3 来解决问题, 如流量转移中所述任务。

(作为读者的练习 - 将延迟规则更改为使用 2.8 秒延迟,然后针对 v3 版本的评论运行它。)

使用 HTTP Abort 进行故障注入

作为弹性的另一个测试,我们将在 ratings 服务中,给用户 jason 的调用加上一个 HTTP 中断 。 我们希望页面能够立即加载,而不像延迟示例那样显示”产品评级不可用”消息。

  1. 为用户 “jason” 创建故障注入规则发送 HTTP 中止

    $ istioctl replace -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@

    确认已创建规则

    $ istioctl get virtualservice ratings -o yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: ratings
      ...
    spec:
      hosts:
      - ratings
        http:
      - fault:
          abort:
            httpStatus: 500
            percent: 100
        match:
        - headers:
            end-user:
              exact: jason
        route:
        - destination:
            host: ratings
            subset: v1
      - route:
        - destination:
            host: ratings
            subset: v1
  2. 观察应用程序行为

    以 “jason” 用户名登录, 如果规则成功传播到所有的 pod ,您应该能立即看到页面加载”产品评级不可用”消息。 从用户 “jason” 注销,您应该会在产品页面网页上看到评级星标的评论成功显示。

清理

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

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

See also

Istio v1alpha3 路由 API 介绍,动机及其设计原则。

介绍更安全,低风险的部署和发布到生产。

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

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

使用 Istio 创建自动缩放的金丝雀部署。

演示弹性应用所需的熔断能力。