五、DestinationRule

suaxi
2026-01-04 / 0 评论 / 6 阅读 / 正在检测是否收录...

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: v2
  • simple字段:

    • ROUND_ROBIN:轮询算法,如果未指定则默认采用这种算法
    • LEAST_CONN:最少连接算法,从两个随机选择的服务选择一个活动请求数较少的后端实例
    • RANDOM:从可用的健康实例中随机选择一个
    • PASSTHROUGH:直接转发连接到客户端连接的目标地址,即不做做负载均衡
  • consistentHash 字段:

    • httpHeaderName:基于 Header
    • httpCookie:基于 Cookie
    • useSourcelp:基于源 IP 计算哈希值
    • minimumRingSize:哈希环上虚拟节点数的最小值,节点数越多则负载均衡越精细
trafficPolicy:
  loadBalancer:
    consistentHash:
      httpCokkie:
        name: location
        ttl: 2s


3. 连接池配置

可以在 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: 60s

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:空闲超时,即:在多长时间内没有活动请求则关闭连接
# 配置最大80个连接,最多100个并发请求,每个请求的连接数不超过10个,超时时间为30ms
spec:
  host: nginx.test.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 80
        connectTimeout: 30ms
      http:
        http2MaxRequests: 100
        maxRequestsPerConnection: 10


4. 异常点检测

异常点检测是一个断路器的实现,它跟踪上游服务中每个主机(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: 1om


5. TLS 设置

其包含任何与上游服务连接的 TLS 相关设置

trafficPolicy:
  tls:
    mode: MUTUAL
    clientCertificate: ./certs/cert.pem
    privatekey: ./certs/key - pem
    caCertificates: ./certs/ca.pem

mTLS:双向认证,客户端和服务端都通过证书颁发机构验证彼此的身份,即:由同一个 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_ROBIN


7. 服务子集

subset:定义服务的子集

  • name:服务子集的名称,必填字段,VirtualService 通过该属性引用
  • label:标签,通过一组标签定义属于这个服务子集的实例,如:version(版本)
  • trafficPolicy:应用到该子集上的流量策略
# 给名称为 nginx-v1 的服务子集配置最大连接数
spec:
  hosts: nginx
  subsets:
    - name: nginx-v1
      labels:
        version: v2
      trafficPolicy:
        connectionPool:
          tcp:
            maxConnections: 100
0

评论 (0)

取消