DestinationRule

DestinationRule

DestinationRule 定义在路由发生后应用于服务的流量的策略。这些规则指定负载均衡的配置、sidecar 的连接池大小以及离群值检测设置,以检测并从负载平衡池中清除不正常的主机。

下面的示例中,对 ratings 服务进行了简单的负载均衡。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN

可以通过定义给定名称的 subset 并覆盖在服务级别指定的设置来指定特定于版本的策略。下面的示例中,使用轮询负载均衡策略,将所有流量分配到名为 testversion 的子集,该子集由带有标签 version:v3endpoints(如 pods)组成。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN
  subsets:
  - name: testversion
    labels:
      version: v3
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN

注意:为子集指定的策略直到路由规则明确发送流量到该子集才会生效。

流量策略也可以针对特定端口进行自定义。下面的示例中,对到端口 80 的所有流量使用 最小连接 负载均衡策略,而对到端口 9080 的流量使用 轮询 负载均衡策略。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings-port
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:                # Apply to all ports
    portLevelSettings:
    - port:
        number: 80
      loadBalancer:
        simple: LEAST_CONN
    - port:
        number: 9080
      loadBalancer:
        simple: ROUND_ROBIN

ConnectionPoolSettings

上游主机的连接池设置,这些设置应用于上游服务中的每个主机。连接池设置既可以应用于 TCP 级别,也可以应用于 HTTP 级别。

下面的示例中,将连接到 myredissrv 服务的连接限制为 100 个,连接超时为 30ms。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-redis
spec:
  host: myredissrv.prod.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
        connectTimeout: 30ms
        tcpKeepalive:
          time: 7200s
          interval: 75s
字段类型描述是否必需
tcpTCPSettingsHTTP 和 TCP 上游连接的通用设置
httpHTTPSettingsHTTP 连接池设置

ConnectionPoolSettings.HTTPSettings

适用于 HTTP1.1/HTTP2/GRPC 连接的设置。

字段类型描述是否必需
http1MaxPendingRequestsint32到目标的 pending 状态 HTTP 请求的最大数目。默认是 2^32 - 1
http2MaxRequestsint32对一个后端的最大请求数。默认是 2^32 - 1
maxRequestsPerConnectionint32每个连接对后端的最大请求数。将该参数设置为 1 表示禁用 keep alive。默认是 0,表示不限制,最大是 2^29
maxRetriesint32在给定时间内集群中所有主机可执行的最大重试次数。默认是 2^32 - 1
idleTimeoutDuration上游连接池连接的空闲超时时间。空闲超时被定义为没有活动请求的时间段。如果没有设置,则默认为 1 小时。当达到空闲超时时,连接将被关闭。注意,基于请求的超时意味着 HTTP/2 PINGs 将不能保持连接。适用于 HTTP1.1HTTP2 连接
h2UpgradePolicyH2UpgradePolicy指定 HTTP1.1 连接是否应该为关联的目标升级到 HTTP2

ConnectionPoolSettings.HTTPSettings.H2UpgradePolicy

HTTP1.1 升级到 HTTP2 连接的策略。

名称描述
DEFAULT使用全局默认配置
DO_NOT_UPGRADE不要升级到 HTTP2 连接,该选项会覆盖默认选项
UPGRADE升级到 HTTP2 的连接,该选项会覆盖默认选项

ConnectionPoolSettings.TCPSettings

HTTP 和 TCP 上游连接的通用设置。

字段类型描述是否必需
maxConnectionsint32到一个目标主机的 HTTP1/TCP 连接的最大数目。默认是 2^32 - 1
connectTimeoutDurationTCP 连接的超时时间
tcpKeepaliveTcpKeepalive如果设置该参数,则会在 socket 上设置 SO_KEEPALIVE 以启用 TCP Keepalives

ConnectionPoolSettings.TCPSettings.TcpKeepalive

TCP keepalive。

字段类型描述是否必需
probesint32在确定连接失活之前要发送而没有响应的 keepalive 探测的最大数量。默认为使用操作系统级别的配置(除非被覆盖,Linux 默认为 9)
timeDuration在 keep-alive 探针开始发送之前,连接需要处于空闲状态的时间。默认是使用操作系统级别的配置(除非被覆盖,Linux 默认为 7200s)
intervalDurationkeep-alive 探针发送的时间间隔。默认是使用操作系统级别的配置(除非被覆盖,Linux 默认为 75s)

DestinationRule

DestinationRule 定义了在路由发生后应用于服务的流量的策略。

字段类型描述是否必需
hoststring服务注册表中的服务名称。从平台的服务注册表(如 Kubernetes servicesConsul services)以及 ServiceEntry 声明的主机中查找服务名称。为服务注册表中不存在的服务定义的规则将被忽略。注意,host 字段适用于 HTTP 和 TCP 服务
trafficPolicyTrafficPolicy要应用的流量策略(负载平衡策略,连接池大小,异常检测)
subsetsSubset[]表示服务的各个版本的一个或多个子集。可以在子集级别覆盖流量策略
exportTostring[]DestinationRule 暴露到的命名空间的列表。应用于服务的 DestinationRule 的解析发生在命名空间层次结构的上下文中,暴露 DestinationRule 可将其包含在其他命名空间中的服务的解析层次结构中。此功能可以控制 DestinationRule 跨命名空间边界的可见性。如果未指定命名空间,则默认情况下会将 DestinationRule 暴露到所有命名空间。. 作为保留,表示暴露 DestinationRule 到声明它的同一命名空间。类似的,* 作为保留,表示暴露到所有命名空间。注意:在当前版本中,该 exportTo 值限制为 .*(即当前命名空间或所有命名空间)

LoadBalancerSettings

应用于指定目标的负载均衡策略。下面的示例中,对所有流向 ratings 服务的流量使用 轮询 负载均衡策略。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN

下面的示例中,使用用户 cookie 作为 hash key,为同一 ratings 服务的基于散列的负载均衡器设置保持会话。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      consistentHash:
        httpCookie:
          name: user
          ttl: 0s
字段类型描述是否必需
simpleSimpleLB (oneof)
consistentHashConsistentHashLB (oneof)
localityLbSettingLocalityLoadBalancerSetting局部负载平衡器设置,将完全覆盖网格范围的设置,这意味着此对象与 MeshConfig 中的对象之间将不执行合并

LoadBalancerSettings.ConsistentHashLB

基于一致性 hash 的负载平衡可用于基于 HTTP headercookie 或其他属性提供软会话亲和性。此负载平衡策略仅适用于 HTTP 连接。当从目标服务添加、删除一个或多个主机时,与特定目标主机的亲和性会丢失。

字段类型描述是否必需
httpHeaderNamestring (oneof)基于特定 HTTP header 的 hash
httpCookieHTTPCookie (oneof)基于特定 HTTP cookie 的 hash
useSourceIpbool (oneof)基于源 IP 地址 的 hash
minimumRingSizeuint64用于 hash 环的最小虚拟节点数。默认为 1024,更大的环尺寸会导致更细粒度的负载分布。如果负载平衡池中的主机数大于环数,则为每个主机分配一个虚拟节点

LoadBalancerSettings.ConsistentHashLB.HTTPCookie

描述将用作一致性 hash 负载均衡器的 hash key 的 HTTP cookie。如果 cookie 不存在,则会生成它。

字段类型描述是否必需
namestringcookie 名称
pathstring设置 cookie 的路径
ttlDurationcookie 的存活时间

LoadBalancerSettings.SimpleLB

无需调优的标准负载均衡算法。

名称描述
ROUND_ROBIN轮询 策略。默认
LEAST_CONN最小连接负载均衡算法,该算法选择两个随机的健康主机,并选择活动请求较少的主机
RANDOM随机负载均衡算法,随机选择一个健康主机。如果未配置运行状况检查策略,则随机负载均衡器的性能通常比轮询更好
PASSTHROUGH此选项会将连接转发到调用者请求的原始 IP 地址,而不做任何形式的负载均衡。必须谨慎使用此选项,它适用于高级用例

LocalityLoadBalancerSetting

位置加权的负载均衡可以根据流量的产生地点和终止地点来控制流量到 endpoints 的分配。这些地点是使用任意标签指定的,这些标签以 {region}/{zone}/{sub-zone} 的形式指定地点的层次结构。

给定一个包含工作负载的网格,并将其服务部署到 us-west/zone1/us-west/zone2/。下面的示例中,当访问服务的流量来自 us-west/zone1/ 中的工作负载时,80% 的流量将发送到 us-west/zone1/ 中的 endpoints,即相同的 zone,剩余的 20% 流量将发送到 us-west/zone2/ 中的 endpoints。这种设置旨在将流量路由到同一地点的 endpoints

  distribute:
    - from: us-west/zone1/*
      to:
        "us-west/zone1/*": 80
        "us-west/zone2/*": 20
    - from: us-west/zone2/*
      to:
        "us-west/zone1/*": 20
        "us-west/zone2/*": 80

如果目标不是在跨区域和区域之间分配负载,而是限制故障转移的区域性以满足其他操作需求,则可以设置 failover 策略而不是 distribute 策略。

下面的示例中,为区域设置区域故障转移策略。假设服务驻留在 us-eastus-westeu-west 中的区域中,指定当 us-east 中的 endpoints 变得不健康时,流量应故障转移到 eu-west 中的任何区域或子区域中的 endpoints。同样,us-west 也应故障转移到 us-east

 failover:
   - from: us-east
     to: eu-west
   - from: us-west
     to: us-east
字段类型描述是否必需
distributeDistribute[](可选)只能设置为 distributefailover。指定跨不同区域和地理位置的负载均衡权重,如果为空,则根据区域内的 endpoints 数量设置区域权重
failoverFailover[](可选)只能设置为 distributefailover。指定当本地区域中的 endpoints 变得不健康时,流量将转移到的区域。应与 OutlierDetection 一起使用以检测不健康的端点。注意:如果未指定 OutlierDetection,则此设置将不会生效

LocalityLoadBalancerSetting.Distribute

描述源自 from 区域或子区域的流量如何在一组 to 区域中分配。指定区域的语法是 {region}/{zone}/{sub-zone},规范的任何部分都允许使用通配符。例如:* 匹配所有地区,us-west/* 匹配 us-west 区域内的所有区域和子区域,us-west/zone-1/* 匹配 us-west/zone-1 内的所有子区域。

字段类型描述是否必需
fromstring原始位置,以 / 分隔,如 region/zone/sub_zone
tomap<string, uint32>上游流量分配权重的映射。所有权重之和是 100,任何未分配权重的地区都不会收到任何流量

LocalityLoadBalancerSetting.Failover

指定跨区域的流量故障转移策略。由于默认情况下支持区域和子区域故障转移,因此仅在操作员需要限制流量故障转移时才需要为区域指定此选项,以使全局故障转移到任何端点的默认行为不适用。当跨区域故障转移无法改善服务健康或由于其他原因(例如监管控制)而需要限制时,此功能很有用。

字段类型描述是否必需
fromstring原区域
tostring当原区域的 endpoints 变得不健康时,流量将故障转移到目标区域

OutlierDetection

一种断路器实现,用于跟踪上游服务中每个独立主机的状态,适用于 HTTP 和 TCP 服务。对于 HTTP 服务,持续为 API 调用返回 5xx 错误的主机将从连接池中移除一段预先定义好的时间。对于 TCP 服务,在测量连续错误指标时,到给定主机的连接超时或连接失败将被视为错误。

下面的示例中,将连接池大小设置为 100 个 HTTP1 连接,并且 reviews 服务的请求或连接不得超过 10 个。此外,它设置了 1000 个并发 HTTP2 请求的限制,并配置每 5 分钟扫描一次上游主机,以便任何连续出现 7 次 502、503 或 504 错误码的主机被移除 15 分钟。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews-cb-policy
spec:
  host: reviews.prod.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        http2MaxRequests: 1000
        maxRequestsPerConnection: 10
    outlierDetection:
      consecutiveErrors: 7
      interval: 5m
      baseEjectionTime: 15m
字段类型描述是否必需
consecutiveErrorsint32主机从连接池移除之前的错误数,默认是 5。当通过 HTTP 访问上游主机时,返回 502、503 或 504 将被视为错误。当通过不透明的 TCP 连接访问上游主机时,连接超时或连接失败都被视为错误
intervalDuration移除扫描分析之间的时间间隔。格式:1h1m1s1ms,必须 >= 1ms。默认是 10s
baseEjectionTimeDuration最小移除持续时间。主机将在一段时间内保持被移除的状态,这个时间等于最小弹出持续时间与主机已移除次数的乘积。这样可以使系统自动增加不健康上游服务器的移除时间。格式:1h1m1s1ms,必须 >= 1ms。默认是 30s
maxEjectionPercentint32负载均衡池中可以移除的上游服务的最大主机百分比。默认是 10%
minHealthPercentint32只要关联的负载平衡池至少有 minHealthPercent 的主机处于健康模式,就将启用异常检测。当负载平衡池中的健康主机百分比降至此阈值以下时,异常检测将被禁用,代理将在池中所有主机(正常和不正常)之间进行负载平衡。可以通过将此阈值设置为 0% 来禁用它。默认是 0%,因为它通常不适用于每个服务只有少量 Pod 的 Kubernetes 环境

Subset

服务的 endpoints 的子集,子集可用于 A/B 测试或路由到特定服务版本的场景。此外,在服务级别定义的流量策略可以在子集级别被覆盖。

下面的示例中,对进入名为 testversion 的子集的所有流量使用 轮询 负载均衡策略,该子集由带有标签 version: v3endpoints(如 Pod)组成。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN
  subsets:
  - name: testversion
    labels:
      version: v3
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN

注意:为子集指定的策略只有在路由规则明确发送流量到该子集时才会生效。

通常需要一个或多个标签来标识子集目的地,但是,当相应的 DestinationRule 表示支持多个 SNI 主机(如 Egress Gateway)的主机时,没有标签的子集可能是有意义的。在这种情况下,可以使用带有 TLSSettings 的流量策略来识别与指定子集相对应的特定 SNI 主机。

字段类型描述是否必需
namestring子集的名称。服务名称和子集名称可用于路由规则中的流量分流
labelsmap<string, string>在服务注册表中的 endpoints 上进行标签过滤
trafficPolicyTrafficPolicy应用于该子集的流量策略。子集继承在 DestinationRule 级别指定的流量策略,在子集级别指定的设置将覆盖在 DestinationRule 级别指定的相应设置

TLSSettings

上游连接的 SSL/TLS 相关设置。下面的示例中,将客户端配置为使用双向 TLS 来连接到上游数据库集群。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: db-mtls
spec:
  host: mydbserver.prod.svc.cluster.local
  trafficPolicy:
    tls:
      mode: MUTUAL
      clientCertificate: /etc/certs/myclientcert.pem
      privateKey: /etc/certs/client_private_key.pem
      caCertificates: /etc/certs/rootcacerts.pem

下面的示例中,将客户端配置为在与域名匹配 *.foo.com 的外部服务进行连接时使用 TLS。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: tls-foo
spec:
  host: "*.foo.com"
  trafficPolicy:
    tls:
      mode: SIMPLE

下面的示例中,将客户端配置为在与 ratings 服务连接时使用 Istio 双向 TLS。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings-istio-mtls
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
字段类型描述是否必需
modeTLSmode指示是否使用 TLS 保护与该端口的连接。此字段的值决定如何启用 TLS
clientCertificatestring如果模式是 MUTUAL,则是必需字段。包含要使用的客户端 TLS 证书的文件的路径。如果模式是 ISTIO_MUTUAL,则该字段应为空
privateKeystring如果模式是 MUTUAL,则是必需字段。保存客户端私钥的文件的路径。如果模式是 ISTIO_MUTUAL,则该字段应为空
caCertificatesstring(可选)包含用于验证提供的服务器证书的根证书的文件的路径。如果省略,则代理将不会验证服务器的证书。如果模式是 ISTIO_MUTUAL,则该字段应为空
subjectAltNamesstring[]验证证书中主题身份的备用名称列表。如果指定,则代理将验证服务器证书的主题替代名称是否与指定值之一匹配。如果指定,此列表将覆盖ServiceEntry 中的主题替代名称的值
snistringTLS 握手期间要提供给服务器的 SNI 字符串

TLSSettings.TLSmode

TLS 连接模式。

名称描述
DISABLE不建立到上游 endpoints 的 TLS 连接
SIMPLE发起到上游 endpoints 的 TLS 连接
MUTUAL通过提供用于身份验证的客户端证书,使用双向 TLS 来保护与上游的连接
ISTIO_MUTUAL通过提供用于身份验证的客户端证书,使用双向 TLS 来保护与上游的连接。与 MUTUAL 模式相比,该模式使用 Istio 自动生成的证书进行 mTLS 身份验证。使用该模式时,TLSSettings 中的所有其他字段均应为空

TrafficPolicy

应用于指定目标的流量策略,适用于所有目的端口。

字段类型描述是否必需
loadBalancerLoadBalancerSettings控制负载平衡器算法的设置
connectionPoolConnectionPoolSettings控制与上游服务的连接量的设置
outlierDetectionOutlierDetection用于控制从负载平衡池中移除不健康主机的设置
tlsTLSSettingsTLS相关设置,用于连接到上游服务
portLevelSettingsPortTrafficPolicy[]针对单个端口的流量策略。注意,端口级别设置将覆盖目标级别设置。当被端口级别设置覆盖时,在目标级别指定的流量设置将不会被继承,即端口级 别策略中省略的字段将应用缺省值

TrafficPolicy.PortTrafficPolicy

应用于服务指定端口的流量策略。

字段类型描述是否必需
portPortSelector指定目标服务上要应用此策略的端口号
loadBalancerLoadBalancerSettings控制负载平衡器算法的设置
connectionPoolConnectionPoolSettings控制与上游服务的连接量的设置
outlierDetectionOutlierDetection用于控制从负载平衡池中移除不健康主机的设置
tlsTLSSettingsTLS相关设置,用于连接到上游服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值