本總覽頁面說明如何在 Google Distributed Cloud (GDC) 實體隔離環境中,設定區域和全域網路設定的內部和外部負載平衡器。
GDC 的負載平衡機制可確保流量有效分配到後端工作負載,進而提升應用程式的可用性和效能。流量分配演算法為 Maglev,詳情請參閱「負載平衡演算法」。
本頁內容適用於平台管理員群組中的網路管理員,或應用程式運算子群組中的開發人員,負責管理所屬機構的網路流量。詳情請參閱 GDC 氣隙式環境的目標對象說明文件。
負載平衡架構
Google Distributed Cloud 提供負載平衡器,可讓應用程式彼此公開服務。負載平衡器會分配穩定的虛擬 IP (VIP) 位址,在後端工作負載集區中平衡流量。GDC 中的負載平衡器會執行第 4 層 (L4) 負載平衡,也就是將一組設定的前端 TCP 或 UDP 連接埠對應至相應的後端連接埠。負載平衡器是在專案層級設定。
負載平衡器適用於下列工作負載類型:
- 在 VM 上執行的工作負載。
- Kubernetes 叢集內的容器化工作負載。
在 GDC 中,您可以透過三種方式設定負載平衡器:
- 使用 Networking Kubernetes 資源模型 (KRM) API。您可以使用這個 API 建立全域或區域負載平衡器。
- 使用 gdcloud CLI。 您可以使用這個 API 建立全域或區域負載平衡器。
- 直接從 Kubernetes 叢集使用 Kubernetes 服務。這個方法只會建立區域負載平衡器。
負載平衡器元件
使用 KRM API 或 gdcloud CLI 設定負載平衡器時,您會使用 L4 直通負載平衡器:
- L4 代表通訊協定為 TCP 或 UDP。
- 直通表示工作負載與用戶端之間沒有 Proxy。
負載平衡器包含下列可設定的元件:
轉送規則:指定要轉送的流量,以及轉送至哪個後端服務。轉送規則的規格如下:
- 包含三個元組:CIDR、通訊埠和通訊協定,供用戶端存取。
- 支援 TCP 和 UDP 通訊協定。
- 提供內部和外部轉送規則。用戶端可以從虛擬私有雲 (VPC) 內存取內部轉送規則。用戶端可從 GDC 平台外部或內部存取外部轉送規則,方法是透過定義
EgressNAT值的作業負載。 - 轉送規則會連線至後端服務。您可以將多個轉送規則指向同一個後端服務。
後端服務:是負載平衡中樞,可將轉送規則、健康狀態檢查和後端連結在一起。後端服務會參照後端物件,該物件會識別負載平衡器轉送流量的工作負載。單一後端服務可參照的後端有以下限制:
- 每個可用區一個區域後端資源。
- 每個叢集一個叢集後端資源。這無法與專案後端混合使用。
後端:區域物件,用於指定做為所建立後端服務後端的端點。後端資源必須限定於可用區。使用標籤選取端點。將選取器範圍設為專案或叢集:
專案後端是指未指定
ClusterName欄位的後端。在這種情況下,指定的標籤會套用至特定專案中,位於特定區域 VPC 的所有工作負載。標籤會套用至多個叢集中的 VM 和 Pod 工作負載。如果後端服務使用專案後端,您就無法在該後端服務中,參照該可用區的其他後端。叢集後端是指指定
ClusterName欄位的後端。在這種情況下,指定的標籤會套用至指定專案中具名叢集的所有工作負載。在單一後端服務中,每個叢集的每個區域最多可以指定一個後端。
健康狀態檢查:指定探測,判斷後端中特定工作負載端點的健康狀態是否良好。健康狀態不良的端點會從負載平衡器中移除,直到恢復健康狀態為止。健康狀態檢查僅適用於 VM 工作負載。Pod 工作負載可使用內建的 Kubernetes 探查機制,判斷特定端點是否正常運作。詳情請參閱健康狀態檢查。
直接從 Kubernetes 使用者叢集使用 Kubernetes 服務時,您會使用 Service 物件,而非先前列出的元件。您只能指定建立 Service 物件的叢集中的工作負載。
外部和內部負載平衡
GDC 應用程式可存取下列網路服務類型:
- 內部負載平衡器 (ILB):可將服務公開給機構內的其他叢集。
- 外部負載平衡器 (ELB):從可從外部工作負載路由傳輸的範圍分配虛擬 IP (VIP) 位址,並將服務公開至 GDC 機構外部,例如 GDC 執行個體內或外部的其他機構。使用 ELB 的工作階段相依性,確保來自用戶端的要求一律會轉送至相同的後端。
全域和可用區負載平衡器
您可以建立全域或區域負載平衡器。全域負載平衡器的範圍涵蓋整個 GDC 宇宙。每個 GDC 宇宙可由多個 GDC 區域組成,這些區域會劃分為相互連線並共用控制層的區域。舉例來說,如果宇宙包含兩個地區,每個地區有三個區域,則可能如下所示:us-virginia1-a、us-virginia1-b、us-virginia1-c 和 eu-ams1-a、eu-ams1-b、eu-ams1-c。
區域負載平衡器的範圍僅限於建立時指定的區域。每個可用區都是獨立的災害網域。區域會管理使用本機控制層的基礎架構、服務、API 和工具。
如要進一步瞭解 GDC 宇宙中的全域和區域資源,請參閱多區域總覽。
您可以使用下列方法建立全域負載平衡器:
- 使用 Networking Kubernetes 資源模型 (KRM) API。使用 API 版本
networking.global.gdc.goog建立全域資源。 - 使用 gdcloud CLI。
使用 gdcloud CLI 指令時,請使用
--global旗標指定全域範圍。
您可以使用下列方法建立區域負載平衡器:
- 使用 Networking Kubernetes 資源模型 (KRM) API。使用 API 版本
networking.gdc.goog建立區域資源。 - 使用 gdcloud CLI。
使用 gdcloud CLI 指令時,請使用
--zone旗標指定要為哪些區域建立負載平衡器。 - 直接從 Kubernetes 叢集使用 Kubernetes
Service。
服務虛擬 IP 位址
ILB 會分配僅供機構內部使用的 VIP 位址。這些 VIP 位址無法從機構外部連線,因此您只能使用這些位址,向機構內的其他應用程式公開服務。在同一個執行個體中,這些 IP 位址可能會在不同機構之間重疊。
另一方面,ELB 會分配可從機構外部連線的 VIP 位址。因此,所有機構的 ELB VIP 位址不得重複。通常機構可用的 ELB VIP 位址較少。
負載平衡演算法
我們的負載平衡器使用 Maglev (一致性雜湊演算法),將連入流量分配至後端目標。這項演算法的設計宗旨是提供高效能和高復原力,確保流量平均且可預測地分散,同時盡量提高後端的資料區域性。
Maglev 的運作方式:雜湊機制
Maglev 會對每個傳入封包的屬性進行雜湊處理,然後做出轉送決策。這可確保特定連線的所有封包都一律傳送至同一個後端,盡量提高資料區域性。
- 雜湊輸入 (5 值組):演算法會使用封包標頭中的標準 5 值組產生雜湊。這個元組包含:
- 來源 IP 位址
- 來源通訊埠
- 目的地 IP 位址
- 目的地通訊埠
- 通訊協定 (例如 TCP、UDP)
- 轉送決策:這個雜湊的結果會將連線確定性地對應至負載平衡集區中健康狀態良好的後端。在該連線的生命週期內,所有封包都會轉送至相同的後端。
- 平衡熵:Maglev 會使用元組的所有五個元素產生足夠的熵,確保不同連線平均分配到所有可用的後端。
處理後端健康狀態和失敗情形
Maglev 的設計宗旨是確保彈性,並在可用後端集變更時,盡量減少服務中斷。
- 後端失敗:如果後端未通過健康狀態檢查,系統會將其從可用目標清單中移除。先前路由至失敗後端的連線會終止。系統會根據雜湊演算法,在剩餘的健康後端之間自動重新分配新的連線。重要的是,連線至其他運作正常的後端不會受到影響或重新導向。
- 後端復原:當健康狀態不良的後端恢復正常並重新加入集區時,雜湊的一致性可確保後端以最少的服務中斷時間加入集區,且負載平衡器會重新平衡負載,將流量導向這個新恢復正常的後端。這種「干擾最少」的做法可避免大規模重組所有現有連線,否則可能會導致應用程式快取或狀態不堪負荷。
多可用區部署作業中的行為
請務必瞭解 Maglev 不會感知拓撲。這項功能會根據雜湊的數學結果分配流量,不會考量後端的實際位置或網路路徑。
- 不論位置,一律平均分配:Maglev 會將集區中的所有後端視為同等目標。如果後端分散在不同可用區,流量會平均分配給所有後端。演算法不會優先選擇「本機」可用區或帳戶中的後端,因為可用區之間的網路延遲時間。
- 確保多區域互連容量:由於後端可跨越多個區域,因此網路管理員必須確保多區域互連網路有足夠的網路容量,可處理負載平衡器節點與後端之間的跨區域流量。
限制
BackendService資源不得為 Pod 工作負載設定HealthCheck資源。BackendService規格中的HealthCheckName為選用項目,使用 Pod 設定負載平衡器時必須省略。負載平衡器設定無法以涉及 Pod 和 VM 的混合式工作負載為目標。因此,不允許在一個
BackendService資源中混合使用 Pod 和 VM。全域負載平衡器自訂資源 (例如
ForwardingRuleExternal、ForwardingRuleInternal、BackendService或HealthCheck) 的名稱不得與這些區域負載平衡器自訂資源相同。機構在所屬區域中,最多可以定義 500 項轉送規則。所有區域的通用轉送規則都會計入這項限制。
標準叢集的限制
標準叢集的負載平衡有以下限制:
單一叢集範圍
單一叢集範圍:使用
Service type=LoadBalancer資源為標準叢集佈建的任何負載平衡器 (ILB 或 ELB),都必須以位於該單一標準叢集內的 Pod 為後端端點。系統不支援單一負載平衡器定義,該定義會嘗試將流量分配給在多個不同標準叢集或標準叢集和共用叢集混合環境中執行的 Pod。標準叢集不支援 gdcloud CLI 和 Networking Kubernetes Resource Model API。使用標準 Kubernetes
Service資源搭配type=LoadBalancer和相關聯的註解,管理標準叢集的負載平衡。專案範圍的負載平衡器會忽略標準叢集。如果使用 gdcloud CLI 指令或 Networking Kubernetes Resource Model API 建立專案範圍的負載平衡器設定,系統會忽略專案中的所有標準叢集。
不支援全域負載平衡。為標準叢集佈建的 ILB 和 ELB 資源是可用區資源,範圍僅限於單一可用區。標準叢集負載平衡器不支援全域負載平衡。
不支援跨可用區 ILB 連線。系統不支援從標準叢集 Pod 連線至不同區域中的全域 ILB 或區域 ILB。