多集群流量管理
在多集群网格中,可能需要特定于集群拓扑的流量规则。本文档介绍了几种在多集群网格中管理流量的方法。在阅读本指南之前
- 阅读 部署模型
- 确保您部署的服务遵循 命名空间一致性 概念。
保持流量在集群内
在某些情况下,默认的跨集群负载均衡行为可能不理想。为了使流量保持“集群本地”(即,从cluster-a
发送的流量只会到达cluster-a
中的目标),请使用MeshConfig.serviceSettings
将主机名或通配符标记为clusterLocal
。
例如,您可以对单个服务、特定命名空间中的所有服务或网格中所有服务的全局流量强制执行集群本地流量,如下所示
serviceSettings:
- settings:
clusterLocal: true
hosts:
- "mysvc.myns.svc.cluster.local"
serviceSettings:
- settings:
clusterLocal: true
hosts:
- "*.myns.svc.cluster.local"
serviceSettings:
- settings:
clusterLocal: true
hosts:
- "*"
分区服务
DestinationRule.subsets
允许通过选择标签来对服务进行分区。这些标签可以是 Kubernetes 元数据中的标签,也可以是内置标签。DestinationRule
的子集选择器中的内置标签之一topology.istio.io/cluster
允许创建每个集群的子集。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: mysvc-per-cluster-dr
spec:
host: mysvc.myns.svc.cluster.local
subsets:
- name: cluster-1
labels:
topology.istio.io/cluster: cluster-1
- name: cluster-2
labels:
topology.istio.io/cluster: cluster-2
使用这些子集,您可以根据集群创建各种路由规则,例如镜像或切换。
这提供了另一种通过限制VirtualService
中的目标子集来创建集群本地流量规则的选项。
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: mysvc-cluster-local-vs
spec:
hosts:
- mysvc.myns.svc.cluster.local
http:
- name: "cluster-1-local"
match:
- sourceLabels:
topology.istio.io/cluster: "cluster-1"
route:
- destination:
host: mysvc.myns.svc.cluster.local
subset: cluster-1
- name: "cluster-2-local"
match:
- sourceLabels:
topology.istio.io/cluster: "cluster-2"
route:
- destination:
host: mysvc.myns.svc.cluster.local
subset: cluster-2
使用这种基于子集的路由来控制集群本地流量,而不是MeshConfig.serviceSettings
,其缺点是将服务级策略与拓扑级策略混合在一起。例如,将10%的流量发送到服务v2
的规则将需要两倍数量的子集(例如,cluster-1-v2
、cluster-2-v2
)。这种方法最好限制在需要更细粒度控制基于集群的路由的情况下。