YAZONG 我的开源

Kubernetes(十三)istio(13.9)熔断

  , , ,
0 评论0 浏览

熔断,是创建弹性微服务应用程序的重要模式。熔断能够使您的应用程序具备应对来自故障、潜在峰值和其他未知网络因素影响的能力。

这个任务中,你将配置熔断规则,然后通过模拟压力使熔断器“跳闸”来测试配置。

配置熔断

# 创建示例服务 httpbin
[root@node-2 istio-1.9.5]# less samples/httpbin/httpbin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: httpbin
---
apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
    service: httpbin
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 80
  selector:
    app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
      version: v1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
    spec:
      serviceAccountName: httpbin
      containers:
      - image: docker.io/kennethreitz/httpbin
        imagePullPolicy: IfNotPresent
        name: httpbin
        ports:
        - containerPort: 80

[root@node-2 istio-1.9.5]# kubectl apply -f samples/httpbin/httpbin.yaml
serviceaccount/httpbin created
service/httpbin created
deployment.apps/httpbin created
# 创建一个目标规则,在调用 httpbin 服务时应用熔断设置。
#这里只针对httpbin这个服务,其他服务没影响。
[root@node-2 istio-1.9.5]# kubectl apply -f - <<EOF
> apiVersion: networking.istio.io/v1alpha3
> kind: DestinationRule
> metadata:
>   name: httpbin
> spec:
>   host: httpbin
#流量策略trafficPolicy
>   trafficPolicy:
#连接池connectionPool,本质上是限流,当流量不满足预制条件,就熔断拒绝掉。
>     connectionPool:
>       tcp:
#最大连接数大于1触发熔断拒绝连接
>         maxConnections: 1
>       http:
#请求排队超过1触发熔断拒绝连接,每个连接处理的最大请求数超过1触发熔断拒绝连接。
>         http1MaxPendingRequests: 1
>         maxRequestsPerConnection: 1
#异常(下述具有上下文关系)
>     outlierDetection:
#连续的gateway异常、超时、失败等,都被认为是错误,错误数超过1就可能启动熔断拒绝掉。
>       consecutiveGatewayErrors: 1
#拒绝访问的扫描时间间隔,在1S之内连续发生多少次,1次错误则可能启动熔断拒绝掉。
>       interval: 1s
#最短的拒绝访问时长,一旦拒绝访问之后,就有一个静默的时间,再来请求就先不接入了,最少休息多久,3分钟,3分钟之后再来看看行不行,不行再休息3分钟。
>       baseEjectionTime: 3m
#后端的负载均衡池?被拒绝访问/被移除的最大百分比,这里是100%,表示所有的后端都可以被干掉,也就是全部拒绝。
>       maxEjectionPercent: 100
> EOF
destinationrule.networking.istio.io/httpbin created

配置测试工具

这里使用一个名为Fortio 的负载测试客户的,其可以控制连接数、并发数及发送 HTTP 请求的延迟。通过 Fortio 能够有效的触发前面 在 DestinationRule 中设置的熔断策略。

#熔断需要一个相对有点压力的工具,手工无法模拟。
[root@node-2 istio-1.9.5]# kubectl apply -f samples/httpbin/sample-client/fortio-deploy.yaml
service/fortio created
deployment.apps/fortio-deploy created


#登入客户端 Pod 并使用 Fortio 工具调用 httpbin 服务。-curl 参数表明发送一次调用。
[root@node-2 istio-1.9.5]# kubectl get pod | grep fortio | awk '{ print $1 }'
fortio-deploy-576dbdfbc4-2k2cm
[root@node-2 istio-1.9.5]# FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
[root@node-2 istio-1.9.5]# kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -curl  http://httpbin:8000/get

image.png

可以看到调用后端服务的请求已经成功!接下来,可以测试熔断。

开始测试-触发熔断

在DestinationRule 配置中,您定义了 maxConnections: 1 和 http1MaxPendingRequests: 1。 这些规则意味着,如果并发的连接和请求数超过一个,后续请求或 连接将被阻止。

#发送并发数为 2 的连接(-c 2),请求 20 次(-n 20):
[root@node-2 istio-1.9.5]# kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -c 2 -qps 0 -n 20 -loglevel Warning http://httpbin:8000/get

image.png

image.png

#流量过高或错误过多,导致istio直接把流量拒绝掉,最终返回给用户是一个503的错误。

#测试只请求一次返回503,说明刚才配置的熔断策略,不仅在限流上生效了,在错误上也生效了。

image.png

#刚才的配置有个3分钟的静默期,一旦出现这个错误超过预期之后就拒绝掉,并且有3分钟静默期,3分钟之后才会恢复到正常状态。
[root@node-2 istio-1.9.5]# kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -curl http://httpbin:8000/get
#等3分钟,确认一下是否由istio的错误配置导致的。正常了,确实生效了。

image.png

#查询 istio-proxy 状态以了解更多熔断详情
[root@node-2 istio-1.9.5]# kubectl exec $FORTIO_POD -c istio-proxy -- pilot-agent request GET stats | grep httpbin | grep pending
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.default.rq_pending_open: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.high.rq_pending_open: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_active: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_failure_eject: 0
#重要的是这个6,触发overflow请求的次数。可能不太一样。
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_overflow: 6
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_total: 41

#这个istio完全不用去改造原有的业务服务情况下,完成了对服务的限流、熔断的示例。

清理环境

# 清理规则
[root@node-2 istio-1.9.5]# kubectl delete destinationrule httpbin
destinationrule.networking.istio.io "httpbin" deleted
# 下线 httpbin 服务和客户端
[root@node-2 istio-1.9.5]# kubectl delete deploy httpbin fortio-deploy
deployment.apps "httpbin" deleted
deployment.apps "fortio-deploy" deleted
[root@node-2 istio-1.9.5]# kubectl delete svc httpbin
service "httpbin" deleted

标题:Kubernetes(十三)istio(13.9)熔断
作者:yazong
地址:https://blog.llyweb.com/articles/2022/12/24/1671815979778.html