一、destinationRule 和 VirtualService的联系和区别
1)两者之间的关系
在讲解virtualService中,路由目标对象destination中会包含Service子集的subset字段,这个服务子集就是通过DestinationRule定义的。
- 两者都是用于流量治理,那应用场景有什么区别?
virtualService是一个虚拟的service,描述的是满足什么条件的流量被那个后端处理。类似于根据路径去匹配方法,是更开放的match条件。
DestinationRule描述的是这个请求到达某个后端后怎么去处理,是方法内的处理逻辑。
所以负载均衡和熔断策略是定义在DestinationRule中的,还可以配置连接池大小、异常实例驱逐规则等功能。
二、destinationRule配置示例
如图
定义了forecast服务的两个版本子集V1和V2,并对两个版本分别配置了随机和轮询负载均衡策略。
三、DestinationRule规则定义
重要属性如下:
1)host
必选字段,标识规则的适用对象,取值是服务注册中心中注册的服务名,可以是网格内或以serviceEntry方式注册的网格外的服务。
2)subsets
定义的服务子集,经常用来定义一个服务版本。
3)trafficPolicy
定义规则内容,包括负载均衡、连接池策略、异常点检查扥。
4)exportTo
控制在一个命名空间下定义的资源对象是否可以被其他命名空间下的sidecar执行。
未赋值,则默认全局可见。“.”表示仅应用到当前命名空间,“*”表示应用到所有命名空间。
1、trafficPolicy:流量策略
主要包括四个配置:
◎ loadBalancer:LoadBalancerSettings类型,描述服务的负载均衡算法。
◎ connectionPool:ConnectionPoolSettings类型,描述服务的连接池配置。
◎ outlierDetection:OutlierDetection,描述服务的异常点检查。
◎ tls:TLSSettings类型,描述服务的TLS连接设置。
此外,还包含一个PortTrafficPolicy类型的portLevelSettings,表示对每个端口的流量策略。
2、负载均衡设置(LoadBalancerSettings)
1)simple字段,提供的负载均衡算法如下:
◎ ROUND_ROBIN:轮询算法,如果未指定,则默认采用这种算法。
◎ LEAST_CONN:最少连接算法,算法实现是从两个随机选择的服务后端选择一个活动请求数较少 的后端实例。
◎ RANDOM:从可用的健康实例中随机选择一个。
◎ PASSTHROUGH:直接转发连接到客户端连接的目标地址,即没有做负载均衡。
配置示例如图:
2)consistentHash字段
高级的负载均衡策略,仅对http有效,原因是实现上基于HTTP Header、Cookie的值取hash。如:
◎ httpHeaderName:计算哈希的Header。
◎ httpCookie:计算哈希的Cookie。
◎ useSourceIp:基于源IP计算哈希值。
◎ minimumRingSize:哈希环上虚拟节点数的最小值,节点数越多则负载均衡越精细。
实例如下:
3 连接池设置 - ConnectionPoolSettings
Istio连接池管理在协议上分为TCP流量和HTTP流量治理
1)TCP连接池配置
◎ maxConnections:上游服务的所有实例建立的最大连接数,默认是 1024,属于 TCP层的配
置,对于 HTTP,只用于 HTTP/1.1,因为 HTTP/2对每个主机都使用单个连接。
◎ connectTimeout:TCP连接超时,表示主机网络连接超时,可以改善因调用服务变慢导致整个链路
变慢的情况。
◎ tcpKeepalive:设置TCP keepalives,是Istio1.1新支持的配置,定期给对端发送一个keepalive的探测包,判断连接是否可用。
实例如图:
最大连接数是80,连接超时是25毫秒,并且配置了TCP的 Keepalive探测策略。
2)http连接池配置
◎ http1MaxPendingRequests:最大等待 HTTP 请求数,默认值是 1024,只适用于HTTP/1.1 的服务,因为 HTTP/2 协议的请求在到来时会立即复用连接,不会在连接池等待。
◎http2MaxRequests:最大请求数,默认是1024。只适用于HTTP/2服务,因为HTTP/1.1使用最大连
接数maxConnections即可,表示上游服务的所有实例处理的最大请求数。
◎ maxRequestsPerConnection:每个连接的最大请求数。HTTP/1.1和HTTP/2连接池都遵循此参数。如果没有设置,则没有限制。设置为1时表示每个连接只处理一个请求,也就是禁用了Keep-alive。
◎ maxRetries:最大重试次数,默认是3,表示服务可以执行的最大重试次数。如果调用端因为偶尔
抖动导致请求直接失败,则可能会带来业务损失,一般建议配置重试,若重试成功则可正常返回数据, 只不过比原来响应得慢一点,但重试次数太多会影响性能,要谨慎使用。
不要重试那些重试了也总还是失败的请求;不要对那些消耗大的服务进行重试,特别是那些不会被取消的服务。
◎ idleTimeout:空闲超时,定义在多长时间内没有活动请求则关闭连接。
http一般和tcp设置配合使用,配置如下:
为forecast服务配置最大80个连接,只允许最多有800个并发请求,每个连接 的请求数不超过10个,连接超时是25毫秒
4 异常实例检测设置(OutlierDetection)
符合一般意义的熔断模型。
两种健康检查:
主动型的健康检查:定期探测目标服务实例,根据应答来判断服务实例的健康状态。如负载均衡器中的健康检查
被动型的健康检查:通过实践的访问情况来找出不健康的实例,如isito中的异常点检查。
异常实例检查相关的配置:
◎ consecutiveErrors:实例被驱逐前的连续错误次数,默认是 5。对于 HTTP 服务,返回 502、503 和 504 的请求会被认为异常;对于 TCP 服务,连接超时或者连接错误事件会被认为异常。
◎ interval:驱逐的时间间隔,默认值为10秒,要求大于1毫秒,单位可以是时、分、毫秒。
◎ baseEjectionTime:最小驱逐时间。一个实例被驱逐的时间等于这个最小驱逐时间乘以驱逐的次 数。这样一个因多次异常被驱逐的实例,被驱逐的时间会越来越长。默认值为30秒,要求大于1毫秒,单 位可以是时、分、毫秒。
◎ maxEjectionPercent:指负载均衡池中可以被驱逐的故障实例的最大比例,默认是10%,设置这个 值是为了避免太多的服务实例被驱逐导致服务整体能力下降。
◎ minHealthPercent:最小健康实例比例,是Istio 1.1新增的配置。当负载均衡池中的健康实例数的比 例大于这个比例时,异常点检查机制可用;当可用实例数的比例小于这个比例时,异常点检查功能将被 禁用,所有服务实例不管被认定为健康还是不健康,都可以接收请求。参数的默认值为50%。
实例如图:
5 端口流量策略设置
在端口上配置流量策略,且端口上流量策略会覆盖全局的流量策略。
关于配置方法与TrafficPolicy没有大差别,一个关键的差别字段就是 port
实例如图:
为forecast 服务配置了最大连接数 80,但是为端口 3002 单独配置了最大连接数100。
6 服务子集(Subset)
定义服务的子集。可以在VirtualService中使用。
重要属性:
◎ name:Subset的名字,为必选字段。通过VirtualService引用的就是这个名字。
◎ labels:Subset上的标签,通过一组标签定义了属于这个Subset的服务实例。比如最常用的标识服
务版本的Version标签。
◎ trafficPolicy:应用到这个Subset上的流量策略。
实例,给一个特定的Subset配置最大连接数: