故障注入

本任务将演示如何注入延迟并测试应用弹性。

开始之前

  • 参考文档安装指南中的步骤安装Istio。

  • 部署BookInfo示例应用。

  • 首先通过请求路由任务,或通过执行下列命令,来初始化应用的版本路由信息:

    注意:这里假设尚未设置任何路由。如果已经为示例创建了存在冲突的路由规则,则需要在下列两条命令或其中之一使用replace代替create

    1. istioctl create -f samples/bookinfo/kube/route-rule-all-v1.yaml
    2. istioctl create -f samples/bookinfo/kube/route-rule-reviews-test-v2.yaml

注意:本任务假设将通过Kubernetes来部署应用。所有的示例命令都采用规则yaml文件(如samples/bookinfo/kube/route-rule-all-v1.yaml)指定的Kubernetes版本。如果在不同的环境下运行此任务,请将kube修改为运行环境中(比如基于Consul运行环境就是samples/bookinfo/consul/route-rule-all-v1.yaml)相应的目录。

故障注入

为了测试BookInfo微服务应用的弹性,我们计划针对”jason”用户在reviews:v2和ratings服务之间 注入7秒的延迟 。由于 reviews:v2 服务针对调用ratings服务设置了10秒的超时,因此期望端到端的流程能无错持续。

  1. 创建一个故障注入规则,来延迟来自用户”jason”(本次的测试用户)的流量:

    1. istioctl create -f samples/bookinfo/kube/route-rule-ratings-test-delay.yaml

    确认规则已创建:

    1. istioctl get routerule ratings-test-delay -o yaml
    1. apiVersion: config.istio.io/v1alpha2
    2. kind: RouteRule
    3. metadata:
    4. name: ratings-test-delay
    5. namespace: default
    6. ...
    7. spec:
    8. destination:
    9. name: ratings
    10. httpFault:
    11. delay:
    12. fixedDelay: 7.000s
    13. percent: 100
    14. match:
    15. request:
    16. headers:
    17. cookie:
    18. regex: ^(.*?;)?(user=jason)(;.*)?$
    19. precedence: 2
    20. route:
    21. - labels:
    22. version: v1

    规则分发延迟到所有的pod需要数秒钟的时间。

  2. 观察应用行为

    使用用户”jason”登录。如果应用的首页已设置正确地处理延迟,那首页将会在约7秒钟内加载完。为了解网页的响应时间,请打开IE、Chrome或Firefox(一般快捷键是Ctrl+Shift+IAlt+Cmd+I)的Developer Tools菜单,切换到Network标签,并reload productpage页面。

    将会看到网页在约6秒钟内加载完成。review部分将会显示 Sorry, product reviews are currently unavailable for this book

理解原理

整个review服务失败的原因是,BookInfo应用有一个bug。productpage和review服务之间的超时小于(3秒加上一次重试,总共6秒)review服务和rating服务之间的超时(10秒)。在由不同开发团队负责独立开发不同微服务的典型企业应用中,这类bug就会发生。Istio的故障注入规则有助于识别这些异常,而无需影响到最终用户。

需要注意的是,这里只针对用户”jason”设置了故障影响。如果使用其他用户登录,则不会有任何延迟。

解决bug: 至此,按理来说已经能解决这个问题了,通过增加productpage的超时,或者减少review服务到rating服务的超时,终止并重启相关的微服务,然后确认productpage不报错并正常返回结果即可。

不过,在review服务的v3版本中已经解决了此问题,所以只要按照traffic shifting 任务所述,转移所有流量到 reviews:v3 就能简单地修复问题。

(这里为读者留一个练习——修改延迟规则,改为2.8秒的延迟,然后运行v3版本的review服务。)

清除

  • 清除应用的路由规则:

    1. istioctl delete -f samples/bookinfo/kube/route-rule-all-v1.yaml
    2. istioctl delete -f samples/bookinfo/kube/route-rule-reviews-test-v2.yaml
    3. istioctl delete -f samples/bookinfo/kube/route-rule-ratings-test-delay.yaml
  • 如果并不计划了解更多后续任务,参考BookInfo cleanup的说明来关闭应用。

进阶阅读