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
字段 类型 描述 是否必需
tcp TCPSettings HTTP 和 TCP 上游连接的通用设置
http HTTPSettings HTTP 连接池设置

ConnectionPoolSettings.HTTPSettings

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

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

ConnectionPoolSettings.HTTPSettings.H2UpgradePolicy

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

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

ConnectionPoolSettings.TCPSettings

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

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

ConnectionPoolSettings.TCPSettings.TcpKeepalive

TCP keepalive。

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

DestinationRule

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

字段 类型 描述 是否必需
host string 服务注册表中的服务名称。从平台的服务注册表(如 Kubernetes servicesConsul services)以及 ServiceEntry 声明的主机中查找服务名称。为服务注册表中不存在的服务定义的规则将被忽略。注意,host 字段适用于 HTTP 和 TCP 服务
trafficPolicy TrafficPolicy 要应用的流量策略(负载平衡策略,连接池大小,异常检测)
subsets Subset[] 表示服务的各个版本的一个或多个子集。可以在子集级别覆盖流量策略
exportTo string[] 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
字段 类型 描述 是否必需
simple SimpleLB (oneof)
consistentHash ConsistentHashLB (oneof)
localityLbSetting LocalityLoadBalancerSetting 局部负载平衡器设置,将完全覆盖网格范围的设置,这意味着此对象与 MeshConfig 中的对象之间将不执行合并

LoadBalancerSettings.ConsistentHashLB

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

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

LoadBalancerSettings.ConsistentHashLB.HTTPCookie

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

字段 类型 描述 是否必需
name string cookie 名称
path string 设置 cookie 的路径
ttl Duration cookie 的存活时间

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

LocalityLoadBalancerSetting.Distribute

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

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

LocalityLoadBalancerSetting.Failover

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

字段 类型 描述 是否必需
from string 原区域
to string 当原区域的 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
字段 类型 描述 是否必需
consecutiveErrors int32 主机从连接池移除之前的错误数,默认是 5。当通过 HTTP 访问上游主机时,返回 502、503 或 504 将被视为错误。当通过不透明的 TCP 连接访问上游主机时,连接超时或连接失败都被视为错误
interval Duration 移除扫描分析之间的时间间隔。格式:1h1m1s1ms,必须 >= 1ms。默认是 10s
baseEjectionTime Duration 最小移除持续时间。主机将在一段时间内保持被移除的状态,这个时间等于最小弹出持续时间与主机已移除次数的乘积。这样可以使系统自动增加不健康上游服务器的移除时间。格式:1h1m1s1ms,必须 >= 1ms。默认是 30s
maxEjectionPercent int32 负载均衡池中可以移除的上游服务的最大主机百分比。默认是 10%
minHealthPercent int32 只要关联的负载平衡池至少有 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 主机。

字段 类型 描述 是否必需
name string 子集的名称。服务名称和子集名称可用于路由规则中的流量分流
labels map<string, string> 在服务注册表中的 endpoints 上进行标签过滤
trafficPolicy TrafficPolicy 应用于该子集的流量策略。子集继承在 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
字段 类型 描述 是否必需
mode TLSmode 指示是否使用 TLS 保护与该端口的连接。此字段的值决定如何启用 TLS
clientCertificate string 如果模式是 MUTUAL,则是必需字段。包含要使用的客户端 TLS 证书的文件的路径。如果模式是 ISTIO_MUTUAL,则该字段应为空
privateKey string 如果模式是 MUTUAL,则是必需字段。保存客户端私钥的文件的路径。如果模式是 ISTIO_MUTUAL,则该字段应为空
caCertificates string (可选)包含用于验证提供的服务器证书的根证书的文件的路径。如果省略,则代理将不会验证服务器的证书。如果模式是 ISTIO_MUTUAL,则该字段应为空
subjectAltNames string[] 验证证书中主题身份的备用名称列表。如果指定,则代理将验证服务器证书的主题替代名称是否与指定值之一匹配。如果指定,此列表将覆盖ServiceEntry 中的主题替代名称的值
sni string TLS 握手期间要提供给服务器的 SNI 字符串

TLSSettings.TLSmode

TLS 连接模式。

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

TrafficPolicy

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

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

TrafficPolicy.PortTrafficPolicy

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

字段 类型 描述 是否必需
port PortSelector 指定目标服务上要应用此策略的端口号
loadBalancer LoadBalancerSettings 控制负载平衡器算法的设置
connectionPool ConnectionPoolSettings 控制与上游服务的连接量的设置
outlierDetection OutlierDetection 用于控制从负载平衡池中移除不健康主机的设置
tls TLSSettings TLS相关设置,用于连接到上游服务

上一篇:Ubuntu16.04 搜狗输入法异常,提示请删除 ~/.config/SogouPY并重新启动,Terminal打不开无反应


下一篇:[实验]-从汇编代码来看volatile关键字的作用