istio DestinationRule
vs也是一个虚拟service,描述的是满足什么条件的流量被哪个后端处理。dr描述的是这个请求到某个后端怎么去处理。dr定义了满足路由规则的流量到达后端后的访问策略。
1、主要属性
-
host:表示规则的使用对象,取值是在服务注册中心中注册的服务名,可以是网格内的服务,也可以是serviceEnrty方式注册的网格外的服务。
-
trafficPolicy:规则内容的定义,包括负载均衡、连接池策略、异常点检查等。
-
subsets:服务的子集。
-
exportTo:用于控制dr跨命名空间的可见性,在一个命名空间下定义的资源对象是否可以被其他命名空间下的sidecar执行。
2、流量策略(trafficPolicy)
-
loadBalancer: 描述服务的负载均衡算法。
-
connectionPool: 描述服务的连接池配置。
-
outlierDetection: 描述服务的异常点检查。
-
tls:描述服务的tls连接设置。
3、负载均衡设置
3.1、simple
round_robin: 轮询算法,默认算法。 least_conn: 最少连接算法,选择活动请求数较少的后端实例。 random:从可用的健康实例中随机选择一个。 passtherough: 直接转发连接到客户端连接的目标地址,即没有做负载均衡。
3.2、一致性哈希
只对http有效,因为实现上基于http header、cookie的取值。
-
httpHeaderName:计算哈希的header
-
httpCookie:计算哈希的cookie
-
useSourceIp:基于源ip计算哈希值
-
minimumRingSize: 哈希环上虚拟节点数的最小值,节点数越多则负载均衡越精细。
4、连接池设置
通过连接池管理可以配置阈值来防止一个服务的失败级联影响到整个应用。
考虑到http/1.1和http/2在语义上的差别,在控制最大请求数时,对http/1.1使用maxConnections参数配置,对http/2则使用http2MaxRequests参数配置。
4.1、tcp连接池配置
-
maxConnections:为上游服务的所有实例建立的最大连接数,默认1024.对于http,只用于http/1.1,因为http/2对每个主机都使用单个连接。
-
connectTimeout:tcp连接超时。
-
tcpKeepalive: 定期给对端发送一个keepalive的探测包,判断连接是否可用。这种0长度的数据包对用户的程序没有影响。包括三个字段:probes,表示有多少次探测没有应答就可以断定连接断开。time,表示在发送探测前连接空闲时间。interval,探测间隔。
4.2、http连接池配置
http连接池配置一般和对应的tcp设置配合使用。
-
http1MaxPendingRequest:最大等待http请求数,默认值1024。只适用于http/1.1的服务,因为http/2协议的请求在到来时会立即复用连接,不会在连接池等待。
-
http2MaxRequests:最大请求数,默认1024。只适用于http/2服务,因为http/1.1使用最大连接数maxConnection即可,表示上游服务的所有实例处理的最大请求数。
-
maxRequestsPerConnection:每个连接的最大请求数。没有设置则没有限制。设置为1表示每个连接只处理一个请求,也就是禁用了keep——alive。
-
maxRetries:最大重试次数,默认3.
-
idleTimeout:空闲超时。
5、异常实例检测设置
异常点检查就是定期考察被访问的服务实例的工作情况,如果连续出现异常访问,则将服务实例标记为异常并进行隔离,在一段时间内不为其分配流量。过一段时间后,被隔离的服务实例会再次被解除隔离,尝试处理请求,若还不正常,则被隔离更长的时间。在模型上,istio的异常点检查符合一般意义的熔断模型。
在isito中,可以将异常点检查理解成健康检查,但是与传统的健康检查不同,这里是通过对实际的访问情况进行统计来找出不健康的实例,所以是被动型的健康检查。
-
consecutiveErrors: 实例被驱逐前的连续错误次数,默认5。对于http服务,返回5xx的请求还会被认为异常。对于tcp服务,连接超时或者连接错误事件会被认为异常。
-
interval:驱逐的时间间隔,默认10秒。
-
baseEjectionTime:最小驱逐时间。一个实例被驱逐的时间等于这个最小驱逐时间乘以驱逐的次数,默认3。
-
maxEjectionPercent:只负载均衡池中可以被驱逐的故障实例的最大比例,默认10%。
-
minHealthPercent:最小健康实例比例,当负载均衡池中的健康实例数的比例大于这个比例时,异常点检查机制可用。当可用实例数的比例小于这个比例时,异常点检查功能将被禁用,所有服务实例不管被认定为健康还是不健康,都可以接受请求,默认50%。
6、端口流量策略设置
端口流量策略是将前面的流量策略应用到每个服务端口上。
7、服务子集
subset的一个重要用法是定义服务的子集,包含若干后端服务实例。
8、典型应用
8.1、定义subset
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: forecast
namespace: weather
spec:
host: forecast
subsets:
- name: v2
labels:
version: v2
- name: v1
labels:
version: v1
8.2、服务熔断
假设forecast服务有10个实例,则以上配置的效果是:为forecast服务配置最大80个连接,最大请求数800,每个连接的请求数都不超过10个,连接超时是25毫秒;在4分钟内若有个forecast服务实例连续出现5次异常访问,比如5xx错误,则该forecast服务实例将被隔离10分钟,被隔离的实例总数不超过3个。在第一次隔离期满后,异常的实例将重新接收流量,如果实例工作仍不正常,则被重新隔离,第2次将被隔离20分钟,一次类推。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: forecast
namespace: weather
spec:
host: forecast
trafficPolicy:
connectionPool:
tcp:
maxConnections: 80
connectTimeout: 25ms
http:
http2MaxRequests: 800
maxRequestsPerConnection: 10
outlierDetection:
consecutiveErrors: 5
interval: 4m
baseEjectionTime: 10m
maxEjectionPercent: 30
8.3、负载均衡配置
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: forecast
namespace: weather
spec:
host: forecast
subsets:
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- name: v1
labels:
version: v1
trafficPolicy:
loadBalancer:
simple: RANDOM
8.4、tls认证
为一个服务的调用启用双向认证,前提是服务本身已经开启了对应的认证方式。对于forecast服务的访问使用双向tls,只需要将模式配置为istio_mutual,istio便可以自动进行秘钥证书的管理。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: forecast
namespace: weather
spec:
host: forecast
trafficPolicy:
tls:
mode: ISTIO_MUTUAL