【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
reviews
和ratings
服务调用之间硬编码超时时间为10S
productpage
和reviews
之间的调用也有一个硬编码为 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 | $ kubectl apply -f https://gitee.com/melodyfff/istio/raw/master/samples/bookinfo/networking/virtual-service-ratings-test-abort.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 |