多叢集流量管理

在多叢集網格中,可能需要特定於叢集拓撲的流量規則。本文說明幾種管理多叢集網格中流量的方法。在閱讀本指南之前

  1. 請閱讀部署模型
  2. 請確保您部署的服務遵循命名空間一致性的概念。

將流量保留在叢集內

在某些情況下,預設的跨叢集負載平衡行為並非理想。若要保持流量「叢集本機」(例如,從 cluster-a 傳送的流量只會到達 cluster-a 中的目的地),請使用MeshConfig.serviceSettings將主機名稱或萬用字元標記為 clusterLocal

例如,您可以針對單一服務、特定命名空間中的所有服務,或全域網格中的所有服務強制執行叢集本機流量,如下所示

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

分割服務

DestinationRule.subsets 允許透過選擇標籤來分割服務。這些標籤可以是 Kubernetes 元數據中的標籤,或是內建標籤。其中一個內建標籤 topology.istio.io/cluster,在 DestinationRule 的子集選擇器中,允許建立每個叢集的子集。

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)。這種方法最好僅限於需要更精細地控制基於叢集的路由的情況。

這個資訊有用嗎?
您有任何改進建議嗎?

感謝您的回饋!