多集群流量管理

在多集群网格中,可能需要特定于集群拓扑的流量规则。本文档介绍了几种在多集群网格中管理流量的方法。在阅读本指南之前

  1. 阅读 部署模型
  2. 确保您部署的服务遵循 命名空间一致性 概念。

保持流量在集群内

在某些情况下,默认的跨集群负载均衡行为可能不理想。为了使流量保持“集群本地”(即,从cluster-a发送的流量只会到达cluster-a中的目标),请使用MeshConfig.serviceSettings将主机名或通配符标记为clusterLocal

例如,您可以对单个服务、特定命名空间中的所有服务或网格中所有服务的全局流量强制执行集群本地流量,如下所示

serviceSettings:
- settings:
    clusterLocal: true
  hosts:
  - "mysvc.myns.svc.cluster.local"

分区服务

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-v2cluster-2-v2)。这种方法最好限制在需要更细粒度控制基于集群的路由的情况下。

这些信息是否有用?
您是否有任何改进建议?

感谢您的反馈!