多叢集流量管理
在多叢集網格中,可能需要特定於叢集拓撲的流量規則。本文說明幾種管理多叢集網格中流量的方法。在閱讀本指南之前
- 請閱讀部署模型
- 請確保您部署的服務遵循命名空間一致性的概念。
將流量保留在叢集內
在某些情況下,預設的跨叢集負載平衡行為並非理想。若要保持流量「叢集本機」(例如,從 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 元數據中的標籤,或是內建標籤。其中一個內建標籤 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-v2
,cluster-2-v2
)。這種方法最好僅限於需要更精細地控制基於叢集的路由的情況。