多集群流量管理

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

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

保持集群内的流量

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

例如,您可以为单个服务、特定命名空间中的所有服务或网格中的所有服务全局实施 “cluster-local” 流量管理,如下所示:

  1. serviceSettings:
  2. - settings:
  3. clusterLocal: true
  4. hosts:
  5. - "mysvc.myns.svc.cluster.local"
  1. serviceSettings:
  2. - settings:
  3. clusterLocal: true
  4. hosts:
  5. - "*.myns.svc.cluster.local"
  1. serviceSettings:
  2. - settings:
  3. clusterLocal: true
  4. hosts:
  5. - "*"

分区服务

DestinationRule.subsets 允许通过选择标签对服务进行分区。这些标签可以是来自 Kubernetes metadata 的标签, 也可以是内置标签。 这些内置标签之一的 topology.istio.io/clusterDestinationRule 的子集选择器中允许按集群创建子集。

  1. apiVersion: networking.istio.io/v1beta1
  2. kind: DestinationRule
  3. metadata:
  4. name: mysvc-per-cluster-dr
  5. spec:
  6. host: mysvc.myns.svc.cluster.local
  7. subsets:
  8. - name: cluster-1
  9. labels:
  10. topology.istio.io/cluster: cluster-1
  11. - name: cluster-2
  12. labels:
  13. topology.istio.io/cluster: cluster-2

使用这些子集,您可以基于这些集群创建各种路由规则,如镜像 或者流量转移

这提供了另一种方案来创建集群内部流量规则,具体是在 VirtualService 中限制目标集群子集的流量:

  1. apiVersion: networking.istio.io/v1beta1
  2. kind: VirtualService
  3. metadata:
  4. name: mysvc-cluster-local-vs
  5. spec:
  6. hosts:
  7. - mysvc.myns.svc.cluster.local
  8. http:
  9. - name: "cluster-1-local"
  10. match:
  11. - sourceLabels:
  12. topology.istio.io/cluster: "cluster-1"
  13. route:
  14. - destination:
  15. host: mysvc.myns.svc.cluster.local
  16. subset: cluster-1
  17. - name: "cluster-2-local"
  18. match:
  19. - sourceLabels:
  20. topology.istio.io/cluster: "cluster-2"
  21. route:
  22. - destination:
  23. host: mysvc.myns.svc.cluster.local
  24. subset: cluster-2

使用这种基于子集的路由方式可以控制集群内部流量,但 MeshConfig.serviceSettings 有一个缺点:它把服务层面的代理和拓扑层面的代理混在了一起。 比如,一个规则发送 10% 的流量给一个 v2 服务将需要两倍的子集的数量 (例如 cluster-1-v2cluster-2-v2)。 这个处理方式最好限制在需要对集群的路由进行更多的精细化控制的场景下。