【kubernetes】Minikube-Istio故障注入Fault Injection

Minikube-Istio故障注入Fault Injection

Before you begin

参考【kubernetes】Minikube-Istio初探 搭建基础环境,并部署好官方示例Bookinfo

网站包括四个微服务:

productpage :本服务会调用 details 和 reviews 两个微服务,用来生成页面。
details :这个微服务包含了书籍的信息。
reviews :这个微服务包含了书籍相关的评论。它还会调用 ratings 微服务。
ratings :ratings 微服务中包含了由书籍评价组成的评级信息。

reviews 微服务有 3 个版本:

v1 版本不会调用 ratings 服务。
v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

这里的v1、v2、v3是通过label version: v1标注

需要参考Request routing执行以下命令

  • kubectl apply -f https://gitee.com/melodyfff/istio/raw/master/samples/bookinfo/networking/virtual-service-all-v1.yaml
  • kubectl apply -f https://gitee.com/melodyfff/istio/raw/master/samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

当上述指令执行完毕后效果如下:

  • productpage → reviews:v2 → ratings (only for user jason)
  • productpage → reviews:v1 (for everyone else)

Injecting an HTTP delay fault(延迟错误)

要测试 Bookinfo 应用程序微服务的resiliency,请在用户 jason 的reviews:v2 和ratings microservices之间注入 7 秒的延迟。 此测试将发现一个有意引入 Bookinfo 应用程序的错误。

Note that the reviews:v2 service has a 10s hard-coded connection timeout for calls to the ratings service. Even with the 7s delay that you introduced, you still expect the end-to-end flow to continue without any errors.

1 Create a fault injection rule to delay traffic coming from the test user jason.

1
$ kubectl apply -f https://gitee.com/melodyfff/istio/raw/master/samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml

2 Confirm the rule was created:

1
$ kubectl get virtualservice ratings -o yaml

这里主要是针对 ratings调用设置延迟

Testing the delay configuration

  • 访问应用/productpage,登录jason用户
  • 出现错误信息: Sorry, product reviews are currently unavailable for this book.
  • F12观察网络,发现这个页面打开时间为6S

What Happen?

这个应用中存在着硬编码,我们这里当用户为jason调用reviews时注入延迟7S

reviewsratings服务调用之间硬编码超时时间为10S

productpagereviews之间的调用也有一个硬编码为 3S+1次retry = 6S,所以我们观察网络加载时间为6S就抛出的错误

这个故障注入规则主要可以针对到指定用户,或者特定条件。换其他用户登录请求是正常的

Fixing the bug

假设你尝试调整超时时间修复了这个BUG,并且发布部署到了reviews:v3,调整硬编码中的超时时间从10S->2.5S

此时按照Traffic Shifting进行服务流量转移,我们这个时候需要讲我们的延迟规则修改为小于2.5s的任何量,例如2s,并确认端到端流继续没有 任何错误。

Injecting an HTTP abort fault(终止服务调用)

1
2
3
$ kubectl apply -f https://gitee.com/melodyfff/istio/raw/master/samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml

$ kubectl get virtualservice ratings -o yaml

访问/productpage页面登录jason发现很快刷新,只是不再去调用Ratings服务

Ratings service is currently unavailable

CleanUp

1
$ kubectl delete -f https://gitee.com/melodyfff/istio/raw/master/samples/bookinfo/networking/virtual-service-all-v1.yaml

参考

Istio - Fault Injection

Istio - Bookinfo Application