YAZONG 我的开源

Kubernetes(十三)istio(13.6)故障注入(对比13-8)

  , , ,
0 评论0 浏览

故障注入

== 故障注入

==== 1. 注入故障

为了测试微服务应用程序Bookinfo 的弹性,我们将为用户 jason 在 reviews:v2 和 ratings 服务之间注入一个 7 秒的延迟。 这个测试将会发现一个故意引入 Bookinfo 应用程序中的 bug。

注意reviews:v2 服务对 ratings 服务的调用具有 10 秒的硬编码连接超时。 因此,尽管引入了 7 秒的延迟,我们仍然期望端到端的流程是没有任何错误的。

Istio可以完全控制网络,一样可以在网络中模拟一些异常,TCP等。

[root@node-2 istio-1.9.5]# less samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - headers:
        end-user:
#除了jason用户,都会路由到v1服务。
          exact: jason
    fault:
      delay:
        percentage:
#所有请求的百分比
          value: 100.0
#固定延迟
        fixedDelay: 7s
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1
# 创建故障注入规则以延迟来自测试用户 jason 的流量
[root@node-2 istio-1.9.5]# kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
virtualservice.networking.istio.io/ratings configured

# 确认规则已经创建:
[root@node-2 istio-1.9.5]# kubectl get virtualservice ratings -o yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
......
  name: ratings
  namespace: default
......
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        fixedDelay: 7s
        percentage:
          value: 100
    match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1

延迟测试

==== 2. 延迟测试

使用用户jason 登陆到 /productpage 页面。

你期望Bookinfo 主页在大约 7 秒钟加载完成并且没有错误。 但是,出现了一个问题:Reviews 部分显示了错误消息:

Error fetching product reviews!

Sorry, product reviews are currently unavailable for this book.

image.png

查看页面的响应时间:

打开浏览器的开发工具菜单,打开网络标签,重新加载productpage 页面。你会看到页面加载实际上用了大约 6s。

你发现了一个bug。微服务中有硬编码超时,导致 reviews 服务失败。

按照预期,我们引入的7 秒延迟不会影响到 reviews 服务,因为 reviewsratings 服务间的超时被硬编码为 10 秒。 但是,在 productpagereviews 服务之间也有一个 3 秒的硬编码的超时,再加 1 次重试,一共 6 秒。 结果,productpagereviews 的调用在 6 秒后提前超时并抛出错误了。

这种类型的错误可能发生在典型的由不同的团队独立开发不同的微服务的应用中。Istio 的故障注入规则可以帮助您识别此类异常,而不会影响最终用户。

image.png

请注意,此次故障注入限制为仅影响用户jason。如果您以任何其他用户身份登录,则不会遇到任何延迟。

image.png

#这是微服务上下游不兼容问题。登出刷新页面,很快返回。换一个用户,页面也正常返回。

错误修复

==== 3. 错误修复

这种问题通常会这么解决:

  • 增加 productpage 与 reviews 服务之间的超时或降低 reviews 与 ratings 的超时
  • 终止并重启修复后的微服务
  • 确认 /productpage 页面正常响应且没有任何错误

但是,reviews 服务的 v3 版本已经修复了这个问题。 reviews:v3 服务已将 reviews 与 ratings 的超时时间从 10 秒降低为 2.5 秒,因此它可以兼容(小于)下游的 productpage 的请求。

如果您按照流量转移任务所述将所有流量转移到reviews:v3, 您可以尝试修改延迟规则为任何低于 2.5 秒的数值,例如 2 秒,然后确认端到端的流程没有任何错误。

注入HTTP abort 故障

====4. 注入 HTTP abort 故障

测试微服务弹性的另一种方法是引入HTTP abort 故障。 这个任务将给 ratings 微服务为测试用户 jason 引入一个 HTTP abort。

(测试微服务弹性的另一种方式是引入HTTP层面的故障。)

在这种情况下,我们希望页面能够立即加载,同时显示Ratings service is currently unavailable 这样的消息。

# 为用户 jason 创建一个发送 HTTP abort 的故障注入规则:
[root@node-2 istio-1.9.5]# less samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    fault:
      abort:
        percentage:
          value: 100.0
        httpStatus: 500
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1
[root@node-2 istio-1.9.5]# kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
virtualservice.networking.istio.io/ratings configured


#确认规则已经创建

[root@node-2 istio-1.9.5]# kubectl get virtualservice ratings -o yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
......
  name: ratings
  namespace: default
......
spec:
  hosts:
  - ratings
  http:
  - fault:
      abort:
        httpStatus: 500
        percentage:
          value: 100
    match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1

测试中止配置

====5. 测试中止配置

使用用户jason 登陆到 /productpage 页面。

您应该能立即看到页面加载并看到Ratings service is currently unavailable 消息。

image.png

如果您注销用户jason, 您将看到 /productpage 为除 jason 以外的其他用户调用了 reviews:v1(完全不调用 ratings)。 因此,您不会看到任何错误消息。

退出后,页面正常。对于未登录的用户来说,V1版本未调用ratings服务。

image.png

清理环境

#### 6. 清理环境

[root@node-2 istio-1.9.5]# kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml
virtualservice.networking.istio.io "productpage" deleted
virtualservice.networking.istio.io "reviews" deleted
virtualservice.networking.istio.io "ratings" deleted
virtualservice.networking.istio.io "details" deleted

标题:Kubernetes(十三)istio(13.6)故障注入(对比13-8)
作者:yazong
地址:https://blog.llyweb.com/articles/2022/12/24/1671815499895.html