目的地规则
DestinationRule
定义了适用于路由发生后针对服务的流量的策略。这些规则指定了用于负载均衡、来自 Sidecar 的连接池大小以及异常值检测设置的配置,以检测并从负载均衡池中驱逐不健康的主机。例如,对 ratings 服务的简单负载均衡策略如下所示
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
可以通过定义名为subset
并覆盖服务级别指定的设置来指定特定版本的策略。以下规则对名为testversion的子集使用轮询负载均衡策略,该子集由带有标签(version:v3)的端点(例如,pod)组成。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
subsets:
- name: testversion
labels:
version: v3
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
注意: 为子集指定的策略只有在路由规则明确将流量发送到该子集时才会生效。
流量策略也可以针对特定端口进行定制。以下规则对所有到端口 80 的流量使用最少连接负载均衡策略,而对所有到端口 9080 的流量使用轮询负载均衡设置。
apiVersion: networking.istio.io/v1
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_REQUEST
- port:
number: 9080
loadBalancer:
simple: ROUND_ROBIN
目标规则也可以针对特定工作负载进行定制。以下示例展示了如何使用 workloadSelector 配置将目标规则应用于特定工作负载。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: configure-client-mtls-dr-with-workloadselector
spec:
host: example.com
workloadSelector:
matchLabels:
app: ratings
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
portLevelSettings:
- port:
number: 31443
tls:
credentialName: client-credential
mode: MUTUAL
DestinationRule
DestinationRule 定义了在路由发生后应用于目标服务的流量的策略。
TrafficPolicy
对特定目标应用的流量策略,跨所有目标端口。有关示例,请参见 DestinationRule。
Subset
服务的端点子集。子集可用于 A/B 测试等场景,或路由到服务的特定版本。有关在这些场景中使用子集的示例,请参阅 VirtualService 文档。此外,在服务级别定义的流量策略可以在子集级别被覆盖。以下规则对所有到名为 testversion 的子集的流量使用轮询负载均衡策略,该子集由带有标签(version:v3)的端点(例如,pod)组成。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
subsets:
- name: testversion
labels:
version: v3
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
注意: 为子集指定的策略只有在路由规则明确将流量发送到该子集时才会生效。
通常需要一个或多个标签来标识子集目标,但是,当相应的 DestinationRule 表示支持多个 SNI 主机(例如,出站网关)的主机时,没有标签的子集可能是有意义的。在这种情况下,可以使用带有 ClientTLSSettings 的流量策略来标识对应于命名子集的特定 SNI 主机。
LoadBalancerSettings
对特定目标应用的负载均衡策略。有关详细信息,请参见 Envoy 的负载均衡 文档。
例如,以下规则对所有到 ratings 服务的流量使用轮询负载均衡策略。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
以下示例使用 User cookie 作为哈希键,为 ratings 服务设置基于哈希的负载均衡器的粘性会话。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
consistentHash:
httpCookie:
name: user
ttl: 0s
ConnectionPoolSettings
上游主机的连接池设置。设置适用于上游服务中的每个主机。有关详细信息,请参见 Envoy 的 断路器。连接池设置可以应用于 TCP 级别,也可以应用于 HTTP 级别。
例如,以下规则对名为 myredissrv 的 redis 服务设置了 100 个连接的限制,连接超时时间为 30 毫秒。
apiVersion: networking.istio.io/v1
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
OutlierDetection
断路器实现,跟踪上游服务中每个主机的状态。适用于 HTTP 和 TCP 服务。对于 HTTP 服务,持续返回 5xx 错误的 API 调用的主机将从池中剔除,持续一段时间。对于 TCP 服务,连接超时或到给定主机的连接失败在衡量连续错误指标时算作错误。有关详细信息,请参见 Envoy 的 异常值检测。
以下规则为“reviews”服务设置 100 个 HTTP1 连接的连接池大小,每个连接不超过 10 个 req/连接。此外,它还设置了 1000 个并发 HTTP2 请求的限制,并配置了每 5 分钟扫描一次上游主机,以便任何连续 7 次返回 502、503 或 504 错误代码的主机将被剔除 15 分钟。
apiVersion: networking.istio.io/v1
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:
consecutive5xxErrors: 7
interval: 5m
baseEjectionTime: 15m
ClientTLSSettings
上游连接的 SSL/TLS 相关设置。有关更多详细信息,请参阅 Envoy 的 TLS 上下文。这些设置对于 HTTP 和 TCP 上游都通用。
例如,以下规则配置客户端以对上游数据库集群使用双向 TLS。
apiVersion: networking.istio.io/v1
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/v1
kind: DestinationRule
metadata:
name: tls-foo
spec:
host: "*.foo.com"
trafficPolicy:
tls:
mode: SIMPLE
以下规则配置客户端在与评级服务通信时使用 Istio 双向 TLS。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: ratings-istio-mtls
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
LocalityLoadBalancerSetting
基于位置的加权负载均衡允许管理员根据流量来源和终止位置的位置来控制流量到端点的分配。这些位置使用任意标签指定,这些标签指定位置的层次结构,形式为 {region}/{zone}/{sub-zone}。有关更多详细信息,请参阅 位置加权 以下示例演示了如何在网格级别设置位置加权。
假设网格中存在工作负载及其服务部署到“us-west/zone1/”和“us-west/zone2/”。此示例指定,当访问服务的流量来自“us-west/zone1/”中的工作负载时,80% 的流量将发送到“us-west/zone1/”中的端点,即同一区域,其余 20% 将发送到“us-west/zone2/”中的端点。此设置旨在优先将流量路由到同一位置的端点。对于来自“us-west/zone2/”的流量,也指定了类似的设置。
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
如果操作员的目标不是在区域和区域之间分配负载,而是限制故障转移的区域性以满足其他操作要求,则操作员可以设置“故障转移”策略而不是“分配”策略。
以下示例为区域设置了位置故障转移策略。假设服务驻留在 us-east、us-west 和 eu-west 内的区域中,此示例指定当 us-east 内的端点变得不健康时,流量应故障转移到 eu-west 内的任何区域或子区域的端点,并且类似地 us-west 应故障转移到 us-east。
failover:
- from: us-east
to: eu-west
- from: us-west
to: us-east
位置负载均衡设置。
TrafficPolicy.PortTrafficPolicy
应用于服务特定端口的流量策略
TrafficPolicy.TunnelSettings
TrafficPolicy.ProxyProtocol
LoadBalancerSettings.ConsistentHashLB
基于一致性哈希的负载均衡可用于基于 HTTP 头、Cookie 或其他属性提供软会话亲和性。当一个或多个主机从目标服务中添加/删除时,对特定目标主机的亲和性可能会丢失。
注意:与常见的“粘性会话”实现相比,一致性哈希在维护亲和性方面可靠性较低,后者通常将特定目标编码到 cookie 中,确保只要后端保持不变,亲和性就能得到维护。使用一致性哈希,保证较弱;任何主机添加或删除都会破坏 1/backends
请求的亲和性。
警告:一致性哈希依赖于每个代理对端点的一致视图。当启用区域负载均衡时,情况并非如此。区域负载均衡和一致性哈希只有在所有代理位于同一区域或高级负载均衡器处理区域亲和性时才能协同工作。
LoadBalancerSettings.ConsistentHashLB.RingHash
LoadBalancerSettings.ConsistentHashLB.MagLev
LoadBalancerSettings.ConsistentHashLB.HTTPCookie
描述将用作一致性哈希负载均衡器哈希键的 HTTP cookie。
ConnectionPoolSettings.TCPSettings
HTTP 和 TCP 上游连接共有的设置。
ConnectionPoolSettings.HTTPSettings
适用于 HTTP1.1/HTTP2/GRPC 连接的设置。
ConnectionPoolSettings.TCPSettings.TcpKeepalive
TCP 保持活动状态。
LocalityLoadBalancerSetting.Distribute
描述来自“from”区域或子区域的流量如何分布在“to”区域集中。指定区域的语法为 {region}/{zone}/{sub-zone},并且可以在规范的任何部分使用终端通配符。示例
*
- 匹配所有区域
us-west/*
- us-west 区域中的所有区域和子区域
us-west/zone-1/*
- us-west/zone-1 中的所有子区域
LocalityLoadBalancerSetting.Failover
指定跨区域的流量故障转移策略。由于默认情况下支持区域和子区域故障转移,因此只需要在操作员需要限制流量故障转移以使跨区域故障转移到任何全球端点的默认行为不适用时指定区域。当跨区域故障转移流量不会改善服务健康状况或需要出于其他原因(例如监管控制)而进行限制时,这很有用。
google.protobuf.UInt32Value
uint32
的包装消息。
UInt32Value
的 JSON 表示形式是 JSON 数字。
TrafficPolicy.ProxyProtocol.VERSION
Name | 描述 |
---|---|
V1 | PROXY 协议版本 1。人类可读格式。 |
V2 | PROXY 协议版本 2。二进制格式。 |
LoadBalancerSettings.SimpleLB
不需要调优的标准负载均衡算法。
Name | 描述 |
---|---|
UNSPECIFIED | 用户没有指定任何负载均衡算法。Istio 将选择合适的默认值。 |
RANDOM | 随机负载均衡器选择一个随机的健康主机。如果未配置健康检查策略,则随机负载均衡器通常比轮询效果更好。 |
PASSTHROUGH | 此选项将连接转发到调用者请求的原始 IP 地址,而不会执行任何形式的负载均衡。此选项必须谨慎使用。它适用于高级用例。有关更多详细信息,请参阅 Envoy 中的原始目的地负载均衡器。 |
ROUND_ROBIN | 基本的轮询负载均衡策略。这通常不适用于许多场景(例如,当使用端点加权时),因为它可能会使端点不堪重负。通常,建议使用 LEAST_REQUEST 作为 ROUND_ROBIN 的替代方案。 |
LEAST_REQUEST | 最少请求负载均衡器将负载分散到端点,优先选择未完成请求最少的端点。这通常更安全,并且在几乎所有情况下都优于 ROUND_ROBIN。建议使用 LEAST_REQUEST 作为 ROUND_ROBIN 的替代方案。 |
LEAST_CONN | 已弃用。请改用 LEAST_REQUEST。 |
ConnectionPoolSettings.HTTPSettings.H2UpgradePolicy
将 http1.1 连接升级到 http2 的策略。
Name | 描述 |
---|---|
DEFAULT | 使用全局默认值。 |
DO_NOT_UPGRADE | 不要将连接升级到 http2。此选择退出选项会覆盖默认值。 |
UPGRADE | 将连接升级到 http2。此选择加入选项会覆盖默认值。 |
ClientTLSSettings.TLSmode
TLS 连接模式
Name | 描述 |
---|---|
DISABLE | 不要到上游端点建立 TLS 连接。 |
SIMPLE | 到上游端点发起 TLS 连接。 |
MUTUAL | 通过提供客户端证书进行身份验证,使用双向 TLS 来保护到上游的连接。 |
ISTIO_MUTUAL | 通过提供客户端证书进行身份验证,使用双向 TLS 来保护到上游的连接。与 Mutua 模式相比,此模式使用 Istio 自动生成的证书进行 mTLS 身份验证。当使用此模式时, |