istio 熔断器 trafficPolicy 学习

之前虽然学习了 trafficPolicy 中 connectionPool 相关字段属性,但是在实践的过程中还是不懂这些概念。因此记录下学习过程,帮助有需要的人,也防止忘了

根据官网提供的熔断器 demo:https://istio.io/latest/zh/docs/tasks/traffic-management/circuit-breaking/,部署完成后查看并测试功能正常
在这里插入图片描述
istio 熔断器 trafficPolicy 学习_第1张图片

按照官网提供的熔断器配置,主要设计的字段有如下几个:maxConnectionshttp1MaxPendingRequestsmaxRequestsPerConnection 这三个参数一起配合控制流量的熔断

如果 http1MaxPendingRequests 不设置或设置为 0,都会设为默认值(默认值很大,有可能导致熔断器不生效)

官网 demo 测试
修改 dr 的部分配置如下:

    connectionPool:
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
      tcp:
        maxConnections: 1

解释:tcp 最大连接数为1,http 最大等待请求数为1,每个连接只能发送一个请求

  • 设置并发连接数为1,请求数500个,返回全部正常
kubectl -n mm-rongduan exec fortio-deploy-7dcd84c469-ghkkk -c fortio -- /usr/bin/fortio load -c 1 -qps 0 -n 500 -loglevel Warning http://httpbin:8000/get

istio 熔断器 trafficPolicy 学习_第2张图片

  • 设置并发连接数为2,请求数500个,少数不能访问
kubectl -n mm-rongduan exec fortio-deploy-7dcd84c469-ghkkk -c fortio -- /usr/bin/fortio load -c 2 -qps 0 -n 500 -loglevel Warning http://httpbin:8000/get

istio 熔断器 trafficPolicy 学习_第3张图片

  • 设置并发连接数为 3,请求数 500 个,大多数不能访问
kubectl -n mm-rongduan exec fortio-deploy-7dcd84c469-ghkkk -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 500 -loglevel Warning http://httpbin:8000/get

在这里插入图片描述

解释: 当并发数设置为2时,熔断器设置了最大连接数为1,htttp1 请求的最大等待为1。当并发的连接和请求数超过一个,在 istio-proxy 进行进一步的请求和连接时,后续请求或连接将被阻止

自己测试

  • 设置最大连接数,修改 dr 的部分配置如下:
        connectionPool:
          http:
            http1MaxPendingRequests: 1
            maxRequestsPerConnection: 1
          tcp:
            maxConnections: 10
    
    执行测试
    kubectl -n mm-rongduan exec fortio-deploy-7dcd84c469-ghkkk -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 500 -loglevel Warning http://httpbin:8000/get
    
    istio 熔断器 trafficPolicy 学习_第4张图片
    可以看到请求成功率提高了,为什么没有成功是因为 http1MaxPendingRequests 设置为1
  • 设置 http1 最大挂起请求数,修改 dr 的部分配置如下:
        connectionPool:
          http:
            http1MaxPendingRequests: 10
            maxRequestsPerConnection: 1
          tcp:
            maxConnections: 1
    
    执行测试
    kubectl -n mm-rongduan exec fortio-deploy-7dcd84c469-ghkkk -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 500 -loglevel Warning http://httpbin:8000/get
    
    在这里插入图片描述
    可以看到请求全部成功,设置了 http1 最大挂起请求可以增加并发情况下被阻塞的请求不返回错误
  • 设置每个连接的请求数,修改 dr 的部分配置如下:
        connectionPool:
          http:
            http1MaxPendingRequests: 1
            maxRequestsPerConnection: 10
          tcp:
            maxConnections: 1
    
    执行测试
    kubectl -n mm-rongduan exec fortio-deploy-7dcd84c469-ghkkk -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 500 -loglevel Warning http://httpbin:8000/get
    
    istio 熔断器 trafficPolicy 学习_第5张图片
    可以看到请求成功率提高了

总结

  • http1MaxPendingRequests 设置的是请求不返回错误即最大并发量,即目标服务最多可以同时处理多少个 HTTP 请求
  • maxConnections 设置的是请求反应的速度

举个例子:用户并发量为10,若让所有用户都能访问不报错,http1MaxPendingRequests 设置需要大于等于10,如果 maxConnections 设置为5,表示同时处理5个人的请求,另外5个人需要等待前5个人处理完后再处理,maxConnections 越大,高并发情况下用户请求返回越快。

通过调整这三个参数,都可以提高并发情况下请求的成功率。因为 istio-proxy 设定是存在一定误差,所以每次执行的结果并不一致,但多次执行的整体情况是差不多的

Tip:多次触发熔断会导致服务不可用,通过以下命令测试服务是否可用:kubectl -n mm-rongduan exec fortio-deploy-7dcd84c469-ghkkk -c fortio – /usr/bin/fortio curl -quiet http://httpbin:8000/get
或者设置 outlierDetection 中的 baseEjectionTime 字段,减少这个时间例如为 10s,可以尽快让服务恢复

你可能感兴趣的:(istio,istio,学习,云原生)