Fault Injection

这个课题展示如果为你地应用注入延迟并进行弹性测试。

Before you begin

注意: 这假设你还没设置任何路由规则。如果你为示例创建了冲突地路由规则,你需要在接下来地一两个命令中使用 replace 去代替create

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

注意: 这个课题假设你在k8s环境部署应用。所有示例命令都使用的是k8s版规则的yaml文件 (e.g., samples/bookinfo/kube/route-rule-all-v1.yaml)。如果你在一个不同环境进行这个课题,将 kube 更换为对应你运行环境的目录 (e.g., samples/bookinfo/consul/route-rule-all-v1.yaml for the Consul-based runtime).

Fault injection

Fault injection using HTTP delay

为了测试我们的Bookinfo微服务应用的弹性,我们将针对用户ratings 在reviews:v2和ratings 微服务之间注入7s延迟。因为 reviews:v2 服务有10s的超时时间去调用ratings服务,我们期望这种端对端的流能够没有任何错误的继续下去。

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

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

确认创建的规则:

istioctl get routerule ratings-test-delay -o yaml
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
  name: ratings-test-delay
  namespace: default
  ...
spec:
  destination:
    name: ratings
  httpFault:
    delay:
      fixedDelay: 7.000s
      percent: 100
  match:
    request:
      headers:
        cookie:
          regex: ^(.*?;)?(user=jason)(;.*)?$
  precedence: 2
  route:
  - labels:
      version: v1

为账户的规则延迟传播到所有pods而等待几秒。

2.观察应用行为
以用户 “jason” 登陆,如果应用的前端页面正确的处理延时,我们期望大约加载7s。为了观察页面响应时间,开放开发者工具菜单的IE、Chrome或Firefox(通常,命令组合 Ctrl+Shift+I or Alt+Cmd+I )、tag Network,和重新加载 productpage 的网页。
你可能会观察到网页加载了大约6s。评论部分将展示: Sorry, product reviews are currently unavailable for this book.

Understanding what happened

整个reviews服务失败的原因是我们的Bookinfo应用有一个bug。在productpage 和reviews 服务间的超时时间(3s + 1 retry = 6s total)低于reviews 和ratings 服务之间的超时时间 (10s)。这种bug发生在典型由不同队伍分别开发不同微服务的企业应用。Istio的故障注入规则在不影响终端用户的情况下,帮助你确认这种反常现象。

注意: 我们限制失败仅影响用户“jason”,如果你用其他用户登陆,将不会体验任何延迟。

Fixing the bug: 这种情况下,我们通常通过增加productpage 的超时时间或减少reviews 到ratings 服务的超时时间,中止并重启修复后的微服务,然后确认productpage 返回中没有返回带任何错误的响应来修复这个问题。
然而,我们已经在reviews服务的v3版本中修复了,因此我们可以按照 traffic shifting 中的描述简单的通过迁移所有流量到 reviews:v3 来解决这个问题。
(留给读者练习-将延迟规则更改为使用2.8s延迟,然后针对v3的评论运行延迟规则。)

Fault injection using HTTP Abort

如其他弹性测试,我们继续使用用户“jason”访问ratings 这个服务来介绍HTTP 中断。我们希望页面立刻加载,不像延迟示例,并展示“product ratings not available” 信息。
1.采用故障终端规则前清楚故障延迟注入规则

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

2.为用户“jason”创建故障注入规则去发送一个HTTP中断。

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

确认规则被创建

istioctl get routerules ratings-test-abort -o yaml
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
  name: ratings-test-abort
  namespace: default
  ...
spec:
  destination:
    name: ratings
  httpFault:
    abort:
      httpStatus: 500
      percent: 100
  match:
    request:
      headers:
        cookie:
          regex: ^(.*?;)?(user=jason)(;.*)?$
  precedence: 2
  route:
  - labels:
      version: v1

3.观察应用行为
以用户 “jason”登陆。如果规则成功传播到所有pods,你将会看看到页面立刻加载,并带有“product ratings not available” 信息。登出 “jason”用户,你应该会看到productpage 网页中成功展示ratings 的v2版本。

Cleanup

  • 清除应用路由规则
istioctl delete -f samples/bookinfo/kube/route-rule-all-v1.yaml
istioctl delete -f samples/bookinfo/kube/route-rule-reviews-test-v2.yaml
istioctl delete -f samples/bookinfo/kube/route-rule-ratings-test-delay.yaml
istioctl delete -f samples/bookinfo/kube/route-rule-ratings-test-abort.yaml
  • 如果你不打算探索接下来地任何课题,参考 Bookinfo cleanup 指南来关闭应用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值