Istio流量管理之服务熔断
文章目录
1.Istio服务治理之服务熔断
服务熔断是创建弹性微服务应用程序的重要模式,服务熔断可以使应用程序适应网络故障和延迟等网络不良影响。
服务熔断概念的理解:
所谓的服务熔断就相当于电路的断路器,当我们在生活中使用电器时,如果电路板产生了问题,升高电流,就会损害电器从而引发火灾,而电器中是有保险丝的,当保险丝无法承受电流的热度时,就会自动断电。
应用程序调用之间也是有类似保险丝的概念的,被称为服务熔断,当A服务请求B服务时,如果B服务故障无法提供请求时,A服务还是会一直请求B服务,从而占用很多的资源,请求积压过多就会影响服务器的整体性能,当应用程序设置了服务熔断,当B服务无法处理请求时,就不会让A服务再去请求B服务了,根据设置的时间,一段时间后再让A服务去尝试请求B服务。
Istio服务网格自带服务熔断功能,会根据流量请求做一定的处理,如果请求的目标端无法提供服务时,会通过网格中的Sidecar代理程序将请求进行拦截,无需修改程序的代码通过Istio就可以实现服务的熔断。
服务熔断阻止A服务去调用异常的B服务主要是通过服务降级来实现的。
服务降级的概念:在微服务架构高并发的情况下,如果请求的数量达到了一定极限,服务熔断就会开启服务保护功能,然后通过服务降级的方式,给用户展示一个友好的界面提示客户端,而不会给用户返回一个HTTP错误请求代码。
开启了服务降级模式,A服务就不会去调度异常的B服务,此时会给用户返回一个友好的提示页面,比如"请求繁忙,请稍后重试"。
当请求程序的请求有一次处理失败时,服务熔断就会开启服务降级模式,不会再让A服务去请求有问题的B服务,直接返回一个调用失败的内容给用户,当经过一段时间后,服务熔断重新触发检测条件,如果请求无异常会关闭服务降级默认,继续让A服务区调用B服务。
Istio无需修改程序代码就可以为应用程序增加熔断和限流的功能,通过定义DestinationRule目标规则资源中的TrafficPolicy流量策略配置,就可以对程序的流量实现服务熔断机制。
服务熔断策略配置依据:超出设置的最大TCP/HTTP请求数时,自动触发服务熔断机制,驱逐流量请求,不再下发至应用程序。
VirtualService资源中服务熔断的配置清单:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: httpbin
spec:host: httpbin
trafficPolicy:#定义流量策略connectionPool:#定义连接池,在连接池中分别针对tcp、http配置了流量策略tcp:#定义tcp协议连接池的流量策略maxConnections:1#最大连接请求数,当超过指定的值,就会返回503错误代码,如果同时有两个请求进入,那么就会产生一个503错误请求。http:#定义http协议连接池的流量策略http1MaxPendingRequests:1#连接到目标主机的最大挂起请求数,也就是处于等待状态的最大请求数,这个目标主机指的就是virtualservice资源中destination下的host指的主机地址,也就是Service资源maxRequestsPerConnection:1#连接池中对每个连接的最大处理数,每个连接最多处理1个请求就进行关闭,如果还需要处理请求就要重新创建连接池中的连接outlierDetection:#异常检测配置,也就是具体的熔断策略配置字段consecutive5xxErrors:1#连续请求的错误数大于等于1次,那么久触发熔断机制interval: 1s #异常的错误请求扫描间隔,这里是在1秒内连续发生1次以上的错误请求,就触发服务熔断机制baseEjectionTime: 3m #定义驱逐时间,这个驱逐时间指的是当触发服务熔断后,多长时间内不让请求达到后端servicemaxEjectionPercent:100#驱逐比例为100%,即所有异常的请求都会被驱逐,不再下发到后端应用程序
2.Istio服务网格流量管理之配置服务熔断
2.1.案例描述
案例:部署一个httpbin程序,设置服务熔断参数,观察服务熔断的效果
大致实现思路:
- 在Istio中部署一个应用程序httpbin。
- 创建DestinationRule资源,配置流量管理策略、服务熔断触发策略
- 运行一个客户端程序模拟高并发,访问后端程序,观察熔断效果。
2.1.在Istio中部署Httpbin程序
Httpbin程序充当后端服务,对进入后端程序的流量实现服务熔断机制。
1.创建httpbin程序所在的namespace
[root@k8s-master ~]# kubectl create ns httpbin
namespace/httpbin created
[root@k8s-master ~]# kubectl label ns httpbin istio-injection=enabled
namespace/httpbin labeled
2.在istio中部署httpbin程序
[root@k8s-master ~]# cd /root/tools/istio-1.13.1/samples/httpbin/
[root@k8s-master httpbin]# kubectl apply -f httpbin.yaml -n httpbin
serviceaccount/httpbin created
service/httpbin created
deployment.apps/httpbin created
#资源编排文件内容大致相同,进入httpbin项目所在的路径,直接创建即可
3.查看资源的状态
[root@k8s-master httpbin]# kubectl get all -n httpbin
NAME READY STATUS RESTARTS AGE
pod/httpbin-74fb669cc6-lxzwk 0/2 PodInitializing 0 11m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/httpbin ClusterIP 10.111.119.44 <none> 8000/TCP 11m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/httpbin 0/1 1 0 11m
NAME DESIRED CURRENT READY AGE
replicaset.apps/httpbin-74fb669cc6 1 1 0 11m
2.2.创建VirtualService资源实现服务熔断
Istio是通过DestinationRule资源中的
trafficPolicy
流量策略配置字段实现服务熔断机制。
1)编写资源编排文件
[root@k8s-master httpbin]# vim httpbin-fuse.yamlapiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: httpbin
spec:host: httpbin
trafficPolicy:#定义流量策略connectionPool:#定义连接池,在连接池中分别针对tcp、http配置了流量策略tcp:#定义tcp协议连接池的流量策略maxConnections:1#最大连接请求数,当超过指定的值,就会返回503错误代码,如果同时有两个请求进入,那么就会产生一个503错误请求。http:#定义http协议连接池的流量策略http1MaxPendingRequests:1#连接到目标主机的最大挂起请求数,也就是处于等待状态的最大请求数,这个目标主机指的就是virtualservice资源中destination下的host指的主机地址,也就是Service资源maxRequestsPerConnection:1#连接池中对每个连接的最大处理数,每个连接最多处理1个请求就进行关闭,如果还需要处理请求就要重新创建连接池中的连接outlierDetection:#异常检测配置,也就是具体的熔断策略配置字段consecutive5xxErrors:1#连续请求的错误数大于等于1次,触发熔断机制interval: 1s #异常的错误请求扫描间隔,这里是在1秒内连续发生1次以上的错误请求,就触发服务熔断机制baseEjectionTime: 3m #定义驱逐时间,这个驱逐时间指的是当触发服务熔断后,多长时间内不让请求达到后端servicemaxEjectionPercent:100#驱逐比例为100%,即所有异常的请求都会被驱逐,不再下发到后端应用程序
2)创建资源并查看资源的状态
[root@k8s-master httpbin]# kubectl apply -f httpbin-fuse.yaml -n httpbin
destinationrule.networking.istio.io/httpbin created
[root@k8s-master httpbin]# kubectl get dr -n httpbin
NAME HOST AGE
httpbin httpbin 7s
2.3.验证服务熔断策略是否生效
部署Fortio工具,模拟流量请求发送到httpbin服务,Fortio可以控制请求的连接数、并发数和HTTP调用延迟,通过客户端模拟出高于触发服务熔断的请求数,来验证服务熔断的效果。
1)部署Fortio工具
[root@k8s-master httpbin]# kubectl apply -f sample-client/fortio-deploy.yaml -n httpbin
service/fortio created
deployment.apps/fortio-deploy created
[root@k8s-master httpbin]# kubectl get pod -n httpbin
NAME READY STATUS RESTARTS AGE
fortio-deploy-687945c6dc-zqd4p 2/2 Running 0 2m34s
httpbin-74fb669cc6-lxzwk 2/2 Running 0 38m
2)模拟正常请求流量查看熔断效果
当请求数没有超过服务熔断设置的阈值就可以正常访问程序。
[root@k8s-master httpbin]# kubectl -n httpbin exec fortio-deploy-687945c6dc-zqd4p -c fortio -- /usr/bin/fortio curl http://httpbin:8000/get
HTTP/1.1 200 OK
server: envoy
date: Thu, 03 Mar 2022 09:00:25 GMT
content-type: application/json
content-length: 594
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 95
{
"args": {},
"headers": {
"Host": "httpbin:8000",
"User-Agent": "fortio.org/fortio-1.17.1",
"X-B3-Parentspanid": "83a7ffb4f1c9468e",
"X-B3-Sampled": "1",
"X-B3-Spanid": "08e1b55ee4aff244",
"X-B3-Traceid": "2265b702eda824cc83a7ffb4f1c9468e",
"X-Envoy-Attempt-Count": "1",
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin/sa/httpbin;Hash=f156945bdd6320d95be50ecd93915d0a09e86821ec6b0c1b9fcf2a13bf4e44a2;Subject=\"\";URI=spiffe://cluster.local/ns/httpbin/sa/default"
},
"origin": "127.0.0.6",
"url": "http://httpbin:8000/get"
}
3)模拟高并发请求数观察服务熔断机制
模拟应用程序高并发请求,在DestinationRule资源中,指定了maxConnections最大连接数为1和http1MaxPendingRequests最大等待连接数为1这两个字段,当我们模拟的请求数大于最大连接数并且也大于最大连接等待数时,就会产生503错误流量从而触发服务熔断机制。
我们来模拟并发连接数为2,发送20个流量请求,观察服务熔断的效果。
[root@k8s-master httpbin]# kubectl -n httpbin exec fortio-deploy-687945c6dc-zqd4p -c fortio -- /usr/bin/fortio load -c 2 -qps 0 -n 20 -loglevel Warning http://httpbin:8000/get
-c:并发数
-n:请求数
可以看到20次请求中,有13次是成功访问的、7次是访问异常的,当高于设定的服务熔断阈值时就会触发熔断机制,不再接收流量请求,因此就会出现7次不可访问的现象,真正生产环境中,用户请求20次触发服务熔断机制了,会提示7次"连接繁忙请稍后再试"的字样,在生产环境中,触发服务熔断的连接数阈值需要严格把控。
版权归原作者 Jiangxl~ 所有, 如有侵权,请联系我们删除。