Multi Cluster Ingress 是 Google Kubernetes Engine (GKE) 叢集的雲端代管控制器。這項服務由 Google 託管,可以在不同叢集和區域部署共用的負載平衡資源。如要在多個叢集中部署多叢集 Ingress,請先完成「設定多叢集 Ingress」,然後參閱「在多個叢集中部署 Ingress」。
如要詳細比較多叢集 Ingress (MCI)、多叢集閘道 (MCG) 和負載平衡器與獨立網路端點群組 (LB 和獨立 NEG),請參閱為 GKE 選擇多叢集負載平衡 API。
多叢集網路
多叢集拓撲的驅動因素有很多,包括應用程式與使用者的距離、叢集和區域的高可用性、安全性與機構分離、叢集遷移,以及資料區域性。這些用途很少是獨立的。隨著多叢集的原因增加,對正式且產品化的多叢集平台需求也日益迫切。
多叢集 Ingress 專為滿足多叢集、多區域環境的負載平衡需求而設計。這是外部 HTTP(S) 負載平衡器的控制器,可為來自網際網路的流量提供 Ingress,並跨越一或多個叢集。
多叢集 Ingress 的多叢集支援功能可滿足許多用途,包括:
- 應用程式的單一一致虛擬 IP (VIP),與應用程式的全球部署位置無關。
- 透過健康狀態檢查和流量容錯移轉,提供多區域、多叢集可用性。
- 透過公開 Anycast VIP 進行鄰近區域的路由,縮短用戶端延遲時間。
- 升級或重建叢集時,可進行叢集遷移作業,使用者不會受到影響。
預設配額
多叢集 Ingress 的預設配額如下:
- 如要瞭解機群的成員限制,請參閱機群管理配額。
- 每個專案最多可有 100 個
MultiClusterIngress
資源和 100 個MultiClusterService
資源。在設定叢集中,您最多可以為任意數量的後端叢集建立 100 個MultiClusterIngress
和 100 個MultiClusterService
資源,但不得超過每個專案的叢集上限。
定價與試用方案
如要瞭解多叢集 Ingress 定價,請參閱多叢集 Ingress 定價。
多叢集 Ingress 的運作方式
多叢集 Ingress 是以全域外部應用程式負載平衡器的架構為基礎建構而成。全域外部應用程式負載平衡器是全球分散式負載平衡器,代理程式部署在全球 100 多個 Google 服務點 (PoP)。這些稱為 Google Front Ends (GFE) 的 Proxy 位於 Google 網路邊緣,靠近用戶端。多叢集 Ingress 會在進階層級中建立外部應用程式負載平衡器。這些負載平衡器會使用透過任播宣傳的全域外部 IP 位址。要求會由 GFE 和距離用戶端最近的叢集處理。網際網路流量會傳送至最接近的 Google PoP,並使用 Google 骨幹網路連線至 GKE 叢集。這種負載平衡設定可縮短延遲時間,此外,您也可以在最靠近用戶端的區域執行 GKE 叢集,縮短服務 GKE 叢集與 GFE 之間的延遲。
在邊緣終止 HTTP 和 HTTPS 連線,可讓 Google 負載平衡器在流量進入資料中心或區域前,判斷後端可用性,決定流量的轉送位置。這樣一來,流量就能以最有效率的路徑從用戶端傳輸至後端,同時考量後端的健康狀態和容量。
Multi Cluster Ingress 是一種 Ingress 控制器,可使用網路端點群組(NEG) 程式設計外部 HTTP (S) 負載平衡器。建立 MultiClusterIngress
資源時,GKE 會部署 Compute Engine 負載平衡器資源,並將叢集中的適當 Pod 設定為後端。NEG 用於動態追蹤 Pod 端點,因此 Google 負載平衡器會有一組正確的健康狀態後端。
在 GKE 的叢集之間部署應用程式時,多叢集 Ingress 可確保負載平衡器與叢集中發生的事件保持同步:
- 系統會使用正確的相符標籤建立 Deployment。
- Pod 的程序終止,且健康狀態檢查失敗。
- 叢集會從後端集區中移除。
多叢集 Ingress 會更新負載平衡器,使其與環境和 Kubernetes 資源的所需狀態保持一致。
多叢集 Ingress 架構
多叢集 Ingress 會使用集中式 Kubernetes API 伺服器,在多個叢集中部署 Ingress。這個集中式 API 伺服器稱為設定叢集。任何 GKE 叢集都可以做為設定叢集。設定叢集會使用兩種自訂資源類型:MultiClusterIngress
和 MultiClusterService
。在設定叢集上部署這些資源後,多叢集 Ingress 控制器就會在多個叢集部署負載平衡器。
多叢集 Ingress 由下列概念和元件組成:
多叢集 Ingress 控制器:這是全球分散式控制層,會在叢集外部以服務形式執行。這樣一來,控制器的生命週期和作業就能獨立於 GKE 叢集。
設定叢集:這是所選的 GKE 叢集,在Google Cloud 上執行,用於部署
MultiClusterIngress
和MultiClusterService
資源。這是這些多叢集資源的集中控管點。這些多叢集資源存在於單一邏輯 API 中,並可從該 API 存取,確保所有叢集的一致性。Ingress 控制器會監控設定叢集,並調解負載平衡基礎架構。機群可讓您有條理地將 GKE 叢集分類並正規化,讓基礎架構管理作業更輕鬆,並啟用多叢集功能,例如多叢集 Ingress。如要進一步瞭解車隊的優點和建立方式,請參閱車隊管理說明文件。叢集只能是單一車隊的成員。
成員叢集:註冊至機群的叢集稱為成員叢集。 機群中的成員叢集構成多叢集 Ingress 可識別的完整後端範圍。Google Kubernetes Engine 叢集管理檢視畫面提供安全的主控台,讓您查看所有已註冊叢集的狀態。
部署工作流程
下列步驟說明跨多個叢集使用多叢集 Ingress 的高階工作流程。
將 GKE 叢集註冊至所選專案中的機群。
將 GKE 叢集設為中央設定叢集。 這個叢集可以是專屬的控制層,也可以執行其他工作負載。
將應用程式部署至需要執行的 GKE 叢集。
在設定叢集中部署一或多個
MultiClusterService
資源,並使用標籤和叢集比對來選取叢集、命名空間和 Pod,這些項目會視為特定服務的後端。這會在 Compute Engine 中建立 NEG,並開始註冊及管理服務端點。在設定叢集中部署
MultiClusterIngress
資源,將一或多個MultiClusterService
資源參照為負載平衡器的後端。這會部署 Compute Engine 外部負載平衡器資源,並透過單一負載平衡器 VIP 公開叢集中的端點。
Ingress 概念
Multi Cluster Ingress 會使用集中式 Kubernetes API 伺服器,在多個叢集中部署 Ingress。以下各節說明多叢集 Ingress 資源模型、如何部署 Ingress,以及管理這個高可用性網路控制層的重要概念。
MultiClusterService 資源
MultiClusterService
是多叢集 Ingress 用於代表跨叢集共用服務的自訂資源。MultiClusterService
資源會選取 Pod,與 Service 資源類似,但 MultiClusterService
也可以選取標籤和叢集。MultiClusterService
選取的叢集集區稱為「成員叢集」。註冊至機群的所有叢集都是成員叢集。
MultiClusterService
只存在於設定叢集中,不會像 ClusterIP、LoadBalancer 或 NodePort 服務一樣,轉送任何內容。而是讓多叢集 Ingress 控制器參照單一分散式資源。
下列範例資訊清單說明名為 foo
的應用程式的 MultiClusterService
:
apiVersion: networking.gke.io/v1
kind: MultiClusterService
metadata:
name: foo
namespace: blue
spec:
template:
spec:
selector:
app: foo
ports:
- name: web
protocol: TCP
port: 80
targetPort: 80
這個資訊清單會在所有成員叢集中部署服務,並使用選取器 app:
foo
。如果該叢集有 app: foo
Pod,這些 Pod 的 IP 位址就會新增為 MultiClusterIngress
的後端。
以下 mci-zone1-svc-j726y6p1lilewtu7
是在其中一個目標叢集中產生的衍生服務。這項服務會建立 NEG,追蹤這個叢集中與指定標籤選取器相符的所有 Pod 端點。每個目標叢集都會有衍生服務和 NEG,適用於每個 MultiClusterService
(除非使用叢集選取器)。如果目標叢集中沒有相符的 Pod,Service 和 NEG 就會是空白。衍生服務完全由 MultiClusterService
管理,使用者無法直接管理。
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/neg: '{"exposed_ports":{"8080":{}}}'
cloud.google.com/neg-status: '{"network_endpoint_groups":{"8080":"k8s1-a6b112b6-default-mci-zone1-svc-j726y6p1lilewt-808-e86163b5"},"zones":["us-central1-a"]}'
networking.gke.io/multiclusterservice-parent: '{"Namespace":"default","Name":"zone1"}'
name: mci-zone1-svc-j726y6p1lilewtu7
namespace: blue
spec:
selector:
app: foo
ports:
- name: web
protocol: TCP
port: 80
targetPort: 80
衍生服務的注意事項:
- 其功能是將端點邏輯分組,做為多叢集 Ingress 的後端。
- 並管理特定叢集和應用程式的 NEG 生命週期。
- 並以無頭服務的形式建立。請注意,只有
Selector
和Ports
欄位會從MultiClusterService
帶到衍生服務。 - Ingress 控制器會管理生命週期。
MultiClusterIngress 資源
在許多方面,MultiClusterIngress
資源的行為與核心 Ingress 資源相同。兩者在定義主機、路徑、通訊協定終止和後端時,都採用相同的規格。
下列資訊清單說明 MultiClusterIngress
如何根據 HTTP 主機標頭,將流量轉送至 foo
和 bar
後端:
apiVersion: networking.gke.io/v1
kind: MultiClusterIngress
metadata:
name: foobar-ingress
namespace: blue
spec:
template:
spec:
backend:
serviceName: default-backend
servicePort: 80
rules:
- host: foo.example.com
backend:
serviceName: foo
servicePort: 80
- host: bar.example.com
backend:
serviceName: bar
servicePort: 80
這個 MultiClusterIngress
資源會將 foo.example.com
和 bar.example.com
上的虛擬 IP 位址流量,傳送至名為 foo
和 bar
的 MultiClusterService
資源,藉此比對流量。這個 MultiClusterIngress
具有預設後端,可比對所有其他流量,並將該流量傳送至預設後端 MultiClusterService
。
下圖顯示流量從 Ingress 流向叢集的方式:
在上圖中,有兩個叢集:gke-us
和 gke-eu
。流量會從 foo.example.com
流向兩個叢集中具有 app:foo
標籤的 Pod。流量會從 bar.example.com
流向兩個叢集中具有 app:bar
標籤的 Pod。
跨叢集的 Ingress 資源
只有設定叢集可以有 MultiClusterIngress
和 MultiClusterService
資源。每個目標叢集都有符合 MultiClusterService
標籤選取器的 Pod,且這些叢集也排定要執行對應的衍生 Service。如果 MultiClusterService
明確未選取叢集,系統就不會在該叢集中建立對應的衍生服務。
命名空間相同
命名空間相同性是 Kubernetes 叢集的屬性,其中命名空間會跨叢集延伸,並視為相同的命名空間。
在下圖中,命名空間 blue
存在於 gke-cfg
、gke-eu
和 gke-us
GKE 叢集中。命名空間相同性會將所有叢集中的命名空間 blue
視為相同。也就是說,使用者在每個叢集的 blue
命名空間中,都擁有相同的資源權限。命名空間相同性也表示,命名空間 blue
中多個叢集內名稱相同的 Service 資源,會視為同一個 Service。
Gateway 會將這三個叢集中的 Service 視為單一端點集區。由於 Route 和 MultiClusterIngress
資源只能將流量轉送至相同命名空間內的 Service,因此這項功能可為機群中所有叢集的設定提供一致的多租戶環境。由於資源可跨叢集部署或移動,且無需變更設定,因此機群具有高度可攜性。部署到相同機群命名空間,可確保叢集間的一致性。
請考慮下列命名空間相同性設計原則:
- 不同用途的命名空間在叢集間不得重複。
- 應為機群中的團隊和叢集保留命名空間,方法是明確分配命名空間,或透過頻外政策隱含保留。
- 叢集中用途相同的命名空間應共用相同名稱。
- 應嚴格控管使用者在叢集命名空間的權限,防止未經授權的存取行為。
- 您不應使用預設命名空間或一般命名空間 (例如「prod」或「dev」) 部署一般應用程式。使用者很容易不小心將資源部署到預設命名空間,進而違反命名空間的區隔原則。
- 凡是特定團隊或使用者群組必須部署資源的叢集,都應建立相同的命名空間。
設定叢集設計
多叢集 Ingress 設定叢集是單一 GKE 叢集,可代管 MultiClusterIngress
和 MultiClusterService
資源,並做為機群中所有目標 GKE 叢集的單一 Ingress 控制點。啟用多叢集 Ingress 時,您會選擇設定叢集。您可以選擇任何 GKE 叢集做為設定叢集,並隨時變更設定叢集。
設定叢集可用性
由於設定叢集是單一控制點,如果設定叢集 API 無法使用,就無法建立或更新 Multi Cluster Ingress 資源。負載平衡器和其提供的流量不會受到設定叢集服務中斷的影響,但控制器會等到恢復運作後,才會協調 MultiClusterIngress
和 MultiClusterService
資源的變更。
設定叢集時,請考量下列設計原則:
- 請選擇高可用性的設定叢集。 建議使用區域叢集,而非可用區叢集。
- 如要啟用多叢集 Ingress,設定叢集不必是專屬叢集。設定叢集可能會代管管理或甚至應用程式工作負載,但您應確保代管應用程式不會影響設定叢集 API 伺服器的可用性。設定叢集可以是代管資源後端的目標叢集,但如有額外防護需求,也可以透過叢集選取作業,將設定叢集排除為後端。
MultiClusterService
- 設定叢集應包含目標叢集後端使用的所有命名空間。
MultiClusterService
資源只能參照叢集內相同命名空間中的 Pod,因此命名空間必須存在於設定叢集中。 - 在多個叢集中部署 Ingress 的使用者必須有權存取設定叢集,才能部署
MultiClusterIngress
和MultiClusterService
資源。不過,使用者應只存取有權使用的命名空間。
選取並遷移設定叢集
啟用多叢集 Ingress 時,您必須選擇設定叢集。您可以選取機群的任何成員叢集做為設定叢集。您可以隨時更新設定叢集,但必須確保不會造成中斷。Ingress 控制器會調解設定叢集中現有的任何資源。將設定叢集從目前叢集遷移至下一個叢集時,MultiClusterIngress
和 MultiClusterService
資源必須相同。如果資源不相同,設定叢集更新後,Compute Engine 負載平衡器可能會更新或毀損。
下圖顯示集中式 CI/CD 系統如何隨時將 MultiClusterIngress
和 MultiClusterService
資源套用至設定叢集 (gke-us
) 和備份叢集 (gke-eu
) 的 GKE API 伺服器,確保兩個叢集的資源完全相同。您隨時可以變更緊急情況或計畫性停機的設定叢集,不會造成任何影響,因為 MultiClusterIngress
和 MultiClusterService
資源完全相同。
選取叢集
MultiClusterService
資源可以跨叢集選取。根據預設,控制器會在每個目標叢集上排定衍生服務。如果不想在每個目標叢集上衍生服務,可以使用 MultiClusterService
資訊清單中的 spec.clusters
欄位定義叢集清單。
如需執行下列操作,您可能需要定義叢集清單:
- 隔離設定叢集,防止
MultiClusterService
資源跨設定叢集選取。 - 控制叢集之間的流量,以利應用程式遷移。
- 將流量轉送至僅存在於部分叢集中的應用程式後端。
- 使用單一 HTTP(S) 虛擬 IP 位址,將流量轉送至不同叢集上的後端。
您必須確保同一機群和區域內的成員叢集名稱不重複,以免發生命名衝突。
如要瞭解如何設定叢集選取作業,請參閱設定多叢集 Ingress。
下列資訊清單說明具有 clusters
欄位的 MultiClusterService
,該欄位會參照 europe-west1-c/gke-eu
和 asia-northeast1-a/gke-asia
:clusters
europe-west1-c/gke-eu
apiVersion: networking.gke.io/v1
kind: MultiClusterService
metadata:
name: foo
namespace: blue
spec:
template:
spec:
selector:
app: foo
ports:
- name: web
protocol: TCP
port: 80
targetPort: 80
clusters:
- link: "europe-west1-c/gke-eu"
- link: "asia-northeast1-a/gke-asia-1"
這個資訊清單指定 gke-asia
和 gke-eu
叢集中具有相符標籤的 Pod 可做為 MultiClusterIngress
的後端。即使其他叢集有 app: foo
標籤的 Pod,也會遭到排除。
下圖顯示使用上述資訊清單的 MultiClusterService
設定範例:
在圖表中,有三個叢集:gke-eu
、gke-asia-1
和 gke-asia-2
。即使有標籤相符的 Pod,gke-asia-2
叢集也不會納入後端,因為該叢集未列入資訊清單 spec.clusters
清單。叢集不會接收維護或其他作業的流量。
後續步驟
- 瞭解如何設定多叢集 Ingress。
- 瞭解如何部署多叢集閘道。
- 瞭解如何部署多叢集 Ingress。
- 實作適用於外部負載平衡的多叢集 Ingress。