1. 概念
| 字段名称 | 说明 |
|---|---|
| spec.host | 关联 DestinationRule 配置的服务名称,可以是自动发现的服务(例如Kubernetes service name),或通过 ServiceEntry 声明的 hosts。如填写的服务名无法在上述源中找到。则该 DestinationRule 中定义的规则无效 |
| spec.subsets | 定义服务的版本(subsets),版本可通过标签键值对匹配服务中的endpoints。可以在 subsets 级覆盖流量策略配置 |
| spec.trafficPolicy | 定义流量策略,包括负载均衡、连接池、健康检查、TLS 策略等 |
| spec.spec.trafficPolicy.loadBalancer | 配置负载均衡算法,可配置:简单负载均衡算法(round robin,least conn,random...) ,一致性哈希(会话保持,支持按 header name,cookie,IP,query parameter 哈希),地域感知负载均衡算法 |
| spec.trafficPolicy.connectionPool | 配置与上游服务的连接量,可设置 TCP/HTTP 连接池 |
| spec.trafficPolicy.outlierDetection | 配置从负载均衡池中驱逐不健康的 hosts |
| spec.trafficPolicy.tls | 连接上游服务的 client 端 TLS 相关配置,与 PeerAuthentication 策略(server 端 TLS 模式配置)配合使用 |
| spec.trafficPolicy.portLevelSettings | 配置端口级的流量策略,该策略会覆盖服务 / subsets 级别的流量策略配置 |
DestinationRule 在路由发生后应用于流量,支持如下配置:
- 负载均衡
- 连接池
- 局部异常点检测
- 客户端 TLS 配置
- 端口流量策略
2. 负载均衡设置
通过负载均衡设置,可以控制目的地使用的负载均衡算法
apiVersion: netweorking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: nginx-destination
spec:
host: nginx.test.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN # 轮询
subsets:
- name: v1
labels:
version: vl
- name: v2
labels:
version: v2simple字段:
- ROUND_ROBIN:轮询算法,如果未指定则默认采用这种算法
- LEAST_CONN:最少连接算法,从两个随机选择的服务选择一个活动请求数较少的后端实例
- RANDOM:从可用的健康实例中随机选择一个
- PASSTHROUGH:直接转发连接到客户端连接的目标地址,即不做做负载均衡
consistentHash 字段:
- httpHeaderName:基于 Header
- httpCookie:基于 Cookie
- useSourcelp:基于源 IP 计算哈希值
- minimumRingSize:哈希环上虚拟节点数的最小值,节点数越多则负载均衡越精细
trafficPolicy:
loadBalancer:
consistentHash:
httpCokkie:
name: location
ttl: 2s3. 连接池配置
可以在 TCP 和 HTTP 层面应用于上游服务的每个主机,可以用它们来控制连接量
tcp 连接池配置:
- maxConnections:上游服务的所有实例建立的最大连接数,默认值1024,属于 TCP 层的配置,对于HTTP,只作用于 HTTP/1.1,因为 HTTP/2 对每个主机都使用单个连接
- connectTimeout:TCP 连接超时,表示主机网络连接超时,可以改善因调用服务变慢而导致整个链路变慢的情况
- tcpKeepalive:lstio1.1 版本开始新支持的配置,定期给对端发送一个 keepalive 探测包,判断连接是否可用
spec:
host: nginx.test.svc.cluster.local
trafficPolicy:
connectionPool:
tcp:
maxConnections: 50
connectTimeout: 25ms
tcpKeepalive:
probes: 5
time: 3600
interval: 60shttp 连接池配置:
- 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:空闲超时,即:在多长时间内没有活动请求则关闭连接
# 配置最大80个连接,最多100个并发请求,每个请求的连接数不超过10个,超时时间为30ms
spec:
host: nginx.test.cluster.local
trafficPolicy:
connectionPool:
tcp:
maxConnections: 80
connectTimeout: 30ms
http:
http2MaxRequests: 100
maxRequestsPerConnection: 104. 异常点检测
异常点检测是一个断路器的实现,它跟踪上游服务中每个主机(Pod)的状态,如果其中一个主机开始返回 5xx HTTP 错误,它就会在预定的时间内被从负载均衡池中弹出,对于 TCP 服务,Envoy 将连接超时或失败计算为错误。
两种健康检查:
- 主动检查:定期探测目标服务实例,根据应答来判断服务实例的健康状态,如负载均衡器中的健康检查
- 被动检查:通过实际的访问情况来找出不健康的实例,如 Istio 中的异常点检查
异常实例检查相关的配置:
- consecutiveErrors:实例被驱逐前的连续错误次数,默认值5。对于 HTTP 服务,返回502、503 和 504 的请求会被认为异常;对于 TCP 服务,连接超时或者连接错误事件会被认为异常
- interval:驱逐的时间间隔,默认值10秒,要求大于1毫秒,单位可以是时、分、毫秒
- baseEjectionTime:最小驱逐时间,一个实例被驱逐的时间等于这个最小驱逐时间乘以驱逐的次数,这样一个因多次异常被驱逐的实例,被驱逐的时间会越来越长,默认值30秒,要求大于1毫秒,单位可以是时、分、毫秒
- maxEjectionPercent:指负载均衡池中可以被驱逐的故障实例的最大比例,默认值10%,该设置是为了避免太多的服务实例被驱逐导致服务整体能力下降
- minHealthPercent:最小健康实例比例,是 lstio 1.1 新增的配置,当负载均衡池中的健康实例数的比例大于这个比例时,异常点检查机制可用,反之该功能将被禁用;所有服务实例不管被认定为健康还是不健康,都可以接收请求,参数的默认值为50%
# 最大500个http2请求,每个连接不超过10个请求,每5分钟扫描一次上游主机(Pod),如果其中任何一个主机连续失败10次,Envoy 会将其弹出10分钟
trafficPolicy:
coninectionPool:
http:
http2MaxRequests: 500
maxRequestsPerConnection: 10
outlierDetection:
consecutiveErrors: 10
interval: 5m
baseEjectionTime: 1om5. TLS 设置
其包含任何与上游服务连接的 TLS 相关设置
trafficPolicy:
tls:
mode: MUTUAL
clientCertificate: ./certs/cert.pem
privatekey: ./certs/key - pem
caCertificates: ./certs/ca.pemmTLS:双向认证,客户端和服务端都通过证书颁发机构验证彼此的身份,即:由同一个 root ca 生成两套证书,客户端、服务端各一个,客户端通过 https 访问服务时,双方会交换证书,并进行认证,认证通过后即可进行通信
TLS 模式:
- DISABLE:无 TLS 连接
- SIMPLE:在上游端点发起 TLS 连接
- ISTIO_MUTUAL:与 MUTUAL 类似,使用 Istio 的 mTLS 证书
6. 端口流量策略
在端口上配置流量策略,配置后其会覆盖全局的流量策略
trafficPolicy:
connectionPool:
tcp:
maxConnections: 80
portLevelSettings:
- port:
number: 80
loadBalancer:
simple: LEAST_CONN
connectionPool:
tcp:
maxConnections: 100
- port:
number: 80
loadBalancer:
simple: ROUND_ROBIN7. 服务子集
subset:定义服务的子集
- name:服务子集的名称,必填字段,VirtualService 通过该属性引用
- label:标签,通过一组标签定义属于这个服务子集的实例,如:version(版本)
- trafficPolicy:应用到该子集上的流量策略
# 给名称为 nginx-v1 的服务子集配置最大连接数
spec:
hosts: nginx
subsets:
- name: nginx-v1
labels:
version: v2
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
评论 (0)