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
可以通过定义一个命名的子集并覆盖服务级别指定的设置来指定特定于版本的策略。以下规则对所有流向名为 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 定义路由发生后适用于服务流量的策略。
Field | Description |
---|---|
host string Required |
服务注册表中的服务名称。服务名称从平台的服务注册表(例如 Kubernetes 服务、Consul 服务等)以及 ServiceEntries 声明的主机中查找。服务注册表中不存在的服务定义的规则将被忽略。 Kubernetes 用户须知:当使用短名称(例如,使用“reviews”而不是“reviews.default.svc.cluster.local”)时,Istio 将根据规则的命名空间(而不是服务)来解释短名称。“default”命名空间中包含主机“reviews”的规则将被解释为“reviews.default.svc.cluster.local”,无论 reviews 服务关联的实际命名空间是什么。为避免潜在的配置错误,建议始终使用完全限定域名,而不是短名称。 请注意,host 字段适用于 HTTP 和 TCP 服务。 |
trafficPolicy | 流量策略(负载均衡策略、连接池大小、异常值检测)。 |
subsets Subset[] |
一个或多个命名集,代表服务的各个版本。流量策略可以在子集级别被覆盖。 |
exportTo string[] |
此目标规则导出到的namespace列表。应用于服务的目标规则的解析发生在命名空间层次结构的上下文中。导出目标规则允许将其包含在其他namespace中服务的解析层次结构中。此功能为服务所有者和网格管理员提供了一种机制,用于控制目标规则跨命名空间边界的可见性。 如果未指定命名空间,则默认将目标规则导出到所有namespace。 值“.”是保留值,表示导出到声明目标规则的同一命名空间。同样,值“*”是保留值,表示导出到所有namespace。 |
workloadSelector | 用于选择应应用此 DestinationRule 配置的特定 Pod/VM 集合的标准。如果指定,则 DestinationRule 配置将仅应用于同一命名空间内与工作负载选择器标签匹配的工作负载实例。工作负载选择器不跨命名空间边界应用。如果省略,DestinationRule 将恢复其默认行为。例如,如果特定的 Sidecar 需要为网格外部的服务设置出口 TLS 设置,而不是网格内的每个 Sidecar 都需要设置该配置(这是默认行为),则可以指定工作负载选择器。 |
TrafficPolicy
Field | Description |
---|---|
loadBalancer LoadBalancerSettings |
控制负载均衡器算法的设置。 |
connectionPool ConnectionPoolSettings |
控制上游服务连接量的设置 |
outlierDetection OutlierDetection |
控制从负载均衡池中驱逐不健康主机的设置 |
tls ClientTLSSettings |
与上游服务连接的 TLS 相关设置。 |
portLevelSettings PortTrafficPolicy[] |
特定于各个端口的流量策略。请注意,端口级设置将覆盖目标级设置。目标级指定的流量设置在被端口级设置覆盖时不会被继承,也就是说,端口级流量策略中省略的字段将采用默认值。 |
tunnel TunnelSettings |
为 DestinationRule 中配置的主机配置通过其他传输层或应用层建立 TCP 隧道。隧道设置可以应用于 TCP 或 TLS 路由,但不能应用于 HTTP 路由。 |
proxyProtocol ProxyProtocol |
上游PROXY协议设置。 |
PortTrafficPolicy
Traffic policies that apply to specific ports of the service
适用于服务特定端口的流量策略
Field | Description |
---|---|
port PortSelector |
指定应用此策略的目标服务上的端口号。 |
loadBalancer LoadBalancerSettings |
控制负载均衡器算法的设置。 |
connectionPool ConnectionPoolSettings |
控制上游服务连接量的设置 |
outlierDetection OutlierDetection |
控制从负载均衡池中驱逐不健康主机的设置 |
tls ClientTLSSettings |
与上游服务连接的 TLS 相关设置。 |
TunnelSettings
Field | Description |
---|---|
protocol | 指定用于隧道化下游连接的协议。支持的协议包括: - CONNECT - 使用 HTTP CONNECT; - POST - 使用 HTTP POST. CONNECT 如果没有指定则默认使用。 上游请求的 HTTP 版本由代理定义的服务协议决定。 |
targetHost | 指定下游连接通过隧道传输到的主机。目标主机必须是 FQDN 或 IP 地址。 |
targetPort | 指定下游连接通过隧道传输到的端口。 |
ProxyProtocol
Field | Description |
---|---|
version | 要使用的 PROXY 协议版本。详情请参阅 https://www.haproxy.org/download/2.1/doc/proxy-protocol.txt 。默认为 V1。 |
Subset
endpoints的子集。子集可用于 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 主机(例如,Egress 网关)的主机时,不带标签的子集可能更有意义。在这种情况下,可以使用包含 ClientTLSSettings 的流量策略来标识与指定子集对应的特定 SNI 主机。
Field | Description |
---|---|
name string Required |
子集的名称。服务名称和子集名称可用于路由规则中的流量拆分。 |
labels | 标签用于对服务注册表中服务的端点进行过滤。请参阅路由规则以获取使用示例。 |
trafficPolicy | 适用于此子集的流量策略。子集会继承在 DestinationRule 级别指定的流量策略。在子集级别指定的设置将覆盖在 DestinationRule 级别指定的相应设置。 |
...
Ref
更多查看官方:https://istio.io/latest/docs/reference/config/networking/destination-rule/