暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Istio熔断机制

IT运维大爆炸 2024-07-13
201

1、简介

熔断(Circuit Breaker),原是指当电流超过规定值时断开电路,进行短路保护或严重过载保护的机制 。对于微服务系统而言,熔断尤为重要,它可以使系统在遭遇某些模块故障时,通过服务降级等方式来提高系统核心功能的可用性,得以应对来自故障、潜在峰值或其他未知网络因素的影响。它通过限制对某个服务的请求量,从而避免在下游服务不可用或过载时,导致整个系统的崩溃。

2、特点

  • 限制并发请求数量:Istio 可以设置一个服务实例同时处理的最大请求数。当请求数超过这个限制时,新的请求将被立即拒绝。这有助于防止下游服务在高并发场景下过载。

  • 超时设置:Istio 支持对每个请求设置超时时间。如果请求在规定时间内没有得到响应,将自动中断。这有助于避免长时间等待一个可能已经失败的请求,提升系统的响应速度。

  • 错误率监控:Istio 可以监控一段时间内的错误率。当错误率超过设定阈值时,熔断器将会打开,暂时拒绝所有请求,直到错误率恢复到正常水平。这有助于在服务出现故障时,快速隔离问题,防止影响扩大。

  • 故障恢复:在熔断器打开期间,Istio 会定期尝试发送少量请求,以检测下游服务是否恢复正常。如果检测到服务恢复,熔断器将会关闭,恢复正常的请求处理。这有助于在故障解除后,迅速恢复服务。

3、部署示例应用

Istio 是通过 Envoy Proxy 来实现熔断机制的,Envoy 强制在网络层面配置熔断策略,这样就不必为每个应用程序单独配置或重新编程。下面就通过一个示例来演示如何为 Istio 网格中的服务配置熔断的连接数、请求数和异常检测。

我们已经为 httpbin
服务设置了熔断策略,接下来创建一个 Java 客户端,用来向后端服务发送请求,观察是否会触发熔断策略。这个客户端可以控制连接数量、并发数、待处理请求队列,使用这一客户端,能够有效的触发前面在目标规则中设置的熔断策略。该客户端的 deployment yaml 内容如下:

[root@mast01 istio]# vim httpbin-client-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin-client-v1
namespace: bookinfo
spec:
replicas: 1
selector:
  matchLabels:
    app: httpbin-client-v1
    version: v1
template:
  metadata:
    labels:
      app: httpbin-client-v1
      version: v1
  spec:
    containers:
     - image: ceposta/http-envoy-client-standalone:latest
      imagePullPolicy: IfNotPresent
      name: httpbin-client
      command: ["/bin/sleep","infinity"]
       
[root@mast01 istio]# kubectl apply -f httpbin-client-deploy.yaml
deployment.apps/httpbin-client-v1 created

注入 Istio

[root@mast01 istio]# kubectl apply -f <(istioctl kube-inject -f httpbin-client-deploy.yaml)
deployment.apps/httpbin-client-v1 configured

4、验证

尝试通过单线程(NUM_THREADS=1
)创建一个连接,并进行 5 次调用(默认值:NUM_CALLS_PER_CLIENT=5

[root@mast01 istio]# CLIENT_POD=$(kubectl get pod -n bookinfo | grep httpbin-client | awk '{ print $1 }')

[root@mast01 istio]# kubectl -n bookinfo exec -it $CLIENT_POD -c httpbin-client -- sh -c 'export URL_UNDER_TEST=http://httpbin:8000/get export NUM_THREADS=1 && java -jar http-client.jar'
using num threads: 1
Starting pool-1-thread-1 with numCalls=5 parallelSends=false delayBetweenCalls=0 url=http://httpbin:8000/get mixedRespTimes=false
pool-1-thread-1: successes=[5], failures=[0], duration=[216ms] #表示线程1进行了5次请求,其中5次成功,0次失败,总耗时216毫秒。

尝试把线程数提高到 2

[root@mast01 istio]# kubectl -n bookinfo exec -it $CLIENT_POD -c httpbin-client -- sh -c 'export URL_UNDER_TEST=http://httpbin:8000/get export NUM_THREADS=2 && java -jar http-client.jar'
using num threads: 2
Starting pool-1-thread-1 with numCalls=5 parallelSends=false delayBetweenCalls=0 url=http://httpbin:8000/get mixedRespTimes=false
Starting pool-1-thread-2 with numCalls=5 parallelSends=false delayBetweenCalls=0 url=http://httpbin:8000/get mixedRespTimes=false
pool-1-thread-2: successes=[5], failures=[0], duration=[114ms]  #表示线程2进行了5次请求,其中5次成功,0次失败,总耗时114毫秒。
pool-1-thread-1: successes=[5], failures=[0], duration=[158ms]  #表示线程1进行了5次请求,其中5次成功,0次失败,总耗时158毫秒。

5、创建DestinationRule, 设置熔断策略

  • maxConnections : 限制对后端服务发起的 HTTP/1.1
    连接数,如果超过了这个限制,就会开启熔断。

  • maxPendingRequests : 限制待处理请求列表的长度, 如果超过了这个限制,就会开启熔断。

  • maxRequestsPerConnection : 在任何给定时间内限制对后端服务发起的 HTTP/2
    请求数,如果超过了这个限制,就会开启熔断。

[root@mast01 istio]# vim DestinationRule.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
 name: httpbin
 namespace: bookinfo
spec:
 host: httpbin
 trafficPolicy:
   connectionPool:
     tcp:
       maxConnections: 1
     http:
       http1MaxPendingRequests: 1
       maxRequestsPerConnection: 1

[root@mast01 istio]# kubectl apply -f DestinationRule.yaml
destinationrule.networking.istio.io/httpbin configured

查看熔断策略在envoy的配置

[root@mast01 istio]# istioctl pc cluster httpbin-client-v1-6b6cfb9bfc-bvmc7.bookinfo --fqdn httpbin.bookinfo.svc.cluster.local -ojson
...
       "connectTimeout": "10s",
       "maxRequestsPerConnection": 1,
       "circuitBreakers": {
           "thresholds": [
              {
                   "maxConnections": 1,
                   "maxPendingRequests": 1,
                   "maxRequests": 4294967295,
                   "maxRetries": 4294967295
              }
          ]
      },
...

6、再次验证熔断

[root@mast01 istio]# kubectl -n bookinfo exec -it $CLIENT_POD -c httpbin-client -- sh -c 'export URL_UNDER_TEST=http://httpbin:8000/get export NUM_THREADS=2 && java -jar http-client.jar'
using num threads: 2
Starting pool-1-thread-2 with numCalls=5 parallelSends=false delayBetweenCalls=0 url=http://httpbin:8000/get mixedRespTimes=false
Starting pool-1-thread-1 with numCalls=5 parallelSends=false delayBetweenCalls=0 url=http://httpbin:8000/get mixedRespTimes=false
pool-1-thread-1: successes=[2], failures=[3], duration=[95ms]  #表示线程1进行了5次请求,其中2次成功,3次失败,总耗时95毫秒。
pool-1-thread-2: successes=[4], failures=[1], duration=[144ms] #表示线程2进行了5次请求,其中4次成功,1次失败,总耗时144毫秒。

欢迎大家扫码关注:

本公众号只写原创,不接广告、不接广告、不接广告。下期小伙伴想学习什么技术,可以私信发我吆。

文章转载自IT运维大爆炸,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论