熔断,是创建弹性微服务应用程序的重要模式。熔断能够使您的应用程序具备应对来自故障、潜在峰值和其他未知网络因素影响的能力。
这个任务中,你将配置熔断规则,然后通过模拟压力使熔断器“跳闸”来测试配置。
配置熔断
# 创建示例服务 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
可以看到调用后端服务的请求已经成功!接下来,可以测试熔断。
开始测试-触发熔断
在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
#流量过高或错误过多,导致istio直接把流量拒绝掉,最终返回给用户是一个503的错误。
#测试只请求一次返回503,说明刚才配置的熔断策略,不仅在限流上生效了,在错误上也生效了。
#刚才的配置有个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的错误配置导致的。正常了,确实生效了。
#查询 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