Istio 熔断限流
Istio使用目标规则中的 TrafficPolicy 属性来配置熔断和限流,其中 connectionPool 属性配置限流方式,outlierDetection 配置异常检测的熔断方式。下面,来分别看一下这二者是如何配置的。
1.ConnectionPool 下有 TCP 和 HTTP 两个类别的配置,二者相互协作,为服务提供有关限流的配置。
TCP 相关的基础配置有maxConnections 和 connectTimeout。
maxConnections 表示到目标服务最大的 HTTP1/TCP 连接数量。它只会限制基于HTTP1.1协议的连接,不会影响基于HTTP2的连接,因为 HTTP2 协议只建立一次连接。
connectTimeout 表示建立 TCP 连接时的超时时间,默认单位是秒。超出该时间,则连接会被自动断开。
HTTP下的配置包括http1MaxPendingRequests、http2MaxRequests 和 maxRequestsPerConnection 三种。
http1MaxPendingRequests 表示HTTP 请求处于pending状态下的最大请求数,也就是目标服务最多可以同时处理多少个 HTTP 请求,默认是1024 个。
http2MaxRequests 表示目标服务最大的 HTTP2 请求数量,默认是1024。
maxRequestsPerConnection 表示每个 TCP 连接可以被多少个请求复用,如果将这一参数设置为 1,则会禁止 keepalive 特性。
2.OutlierDetection 下相关的配置项涉及服务的熔断机制,具体有如下几个基础配置。
consecutiveErrors 表示如果目标服务连续返回多少次错误码后,会将目标服务从可用服务实例列表中剔除,也就是说进行熔断,不再请求目标服务。当通过HTTP请求访问服务,返回码为502、503或504时,Istio 会将本次网络请求判断为发生错误。该属性配置的默认值是5,也就是说如果目标实例连续5个 http请求都返回了 5xx 的错误码,则该服务实例会被剔除,不再接受客户端的网络请求。
Interval 表示服务剔除的时间间隔,即在interval 时间周期内发生1个consecutiveErrors错误,则触发服务熔断。其单位包括小时、分钟、秒和毫秒,默认值是10秒。
baseEjectionTime 表示目标服务被剔除后,至少要维持剔除状态多长时间。这段时间内,目标服务将保持拒绝访问状态。该时间会随着被剔除次数的增加而自动增加,时间为baseEjectionTime 和驱逐次数的乘积。其单位包括小时、分钟、秒和毫秒,默认是30秒。
maxEjectionPercent 表示可用服务实例列表中实例被移除的最大百分比,默认是10%。当超出这个比率时,即使再次发生熔断,也不会将服务剔除,这样就避免了因为瞬时错误导致大多数服务实例都被剔除的问题。
minHealthPercent 表示健康模式的最小百分比,也就是所有服务实例中健康(未被剔除)的比率。当低于这一比率时,整个集群被认为处于非健康状态,outlierDetection配置相关的服务剔除熔断机制将被关闭,不再进行服务健康检查,所有服务实例都可以被请求访问,包含健康和不健康的主机。该属性的默认值是50%,并且minHealthPercent 和 maxEjectionPercent 的和一般都不超过100%。