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:v3
的 endpoints
(如 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.1 和 HTTP2 连接 |
否 |
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 services 、Consul 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 header
、cookie
或其他属性提供软会话亲和性。此负载平衡策略仅适用于 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-east
、us-west
和 eu-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[] |
(可选)只能设置为 distribute 或 failover 。指定跨不同区域和地理位置的负载均衡权重,如果为空,则根据区域内的 endpoints 数量设置区域权重 |
否 |
failover |
Failover[] |
(可选)只能设置为 distribute 或 failover 。指定当本地区域中的 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 |
移除扫描分析之间的时间间隔。格式:1h 、1m 、1s 、1ms ,必须 >= 1ms 。默认是 10s |
否 |
baseEjectionTime |
Duration |
最小移除持续时间。主机将在一段时间内保持被移除的状态,这个时间等于最小弹出持续时间与主机已移除次数的乘积。这样可以使系统自动增加不健康上游服务器的移除时间。格式:1h 、1m 、1s 、1ms ,必须 >= 1ms 。默认是 30s |
否 |
maxEjectionPercent |
int32 |
负载均衡池中可以移除的上游服务的最大主机百分比。默认是 10% | 否 |
minHealthPercent |
int32 |
只要关联的负载平衡池至少有 minHealthPercent 的主机处于健康模式,就将启用异常检测。当负载平衡池中的健康主机百分比降至此阈值以下时,异常检测将被禁用,代理将在池中所有主机(正常和不正常)之间进行负载平衡。可以通过将此阈值设置为 0% 来禁用它。默认是 0%,因为它通常不适用于每个服务只有少量 Pod 的 Kubernetes 环境 |
否 |
Subset
服务的 endpoints
的子集,子集可用于 A/B
测试或路由到特定服务版本的场景。此外,在服务级别定义的流量策略可以在子集级别被覆盖。
下面的示例中,对进入名为 testversion
的子集的所有流量使用 轮询 负载均衡策略,该子集由带有标签 version: v3
的 endpoints
(如 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相关设置,用于连接到上游服务 | 否 |