本文說明負載平衡的兩種 Dataplane V2 轉送模式,以及如何為 Google Distributed Cloud 啟用這些模式。Dataplane V2 支援兩種負載平衡轉送模式:
- 來源網路位址轉譯 (SNAT)
- 伺服器直接回傳 (DSR)
您只能在建立叢集時設定負載平衡的轉送模式。
SNAT 負載平衡
來源網路位址轉譯 (SNAT) 是 Dataplane V2 負載平衡的預設轉送模式。不過,在 SNAT 模式下,系統不會為後端 Pod 保留用戶端 IP 位址。當用戶端的封包抵達負載平衡器節點時,系統會翻譯並轉送至目的地工作站節點,其中包含後端 Pod。後端 Pod 會發現要求來自負載平衡器節點,而非用戶端位置。因此,回覆會傳回負載平衡器節點,並經過反向翻譯,然後傳回給用戶端。
SNAT 的封包傳輸流
使用 Dataplane V2 負載平衡的 SNAT 轉送模式時,封包會從外部用戶端流向後端 Pod,再流回外部用戶端,流程如下:
LoadBalancer 類型的 Service 會指派給負載平衡器節點,而該節點上執行的 MetalLB speaker 會宣傳其 IP 位址
172.16.20.16
。資料平面 V2 會使用 SNAT 將來源 IP 位址和通訊埠轉譯為
<LB_NODE_IP>:52000
,並將封包轉送至工作站節點。回應會傳回負載平衡器節點,並反向轉譯目的地地址。
下圖顯示 SNAT 模式的封包流程:
DSR 負載平衡
伺服器直接回傳 (DSR) 可解決 SNAT 負載平衡的問題。在 DSR 模式中,負載平衡器節點會使用 IP 選項儲存用戶端來源位址。工作站節點可以復原原始封包,並轉送至後端 Pod。後端 Pod 可以看出封包來自用戶端 IP 位址,而非負載平衡器節點 IP 位址。因此,傳回封包會直接傳回至用戶端 IP 位址,而不會傳回負載平衡器節點。
這個模式不僅解決了用戶端 IP 位址可視性問題,還能節省負載平衡器節點的頻寬。回程流量不必經過負載平衡器節點,負載平衡器節點也不必再追蹤連線。這種做法可節省記憶體,並釋出轉送埠。對於非對稱工作負載 (下載流量遠高於要求流量),DSR 流程可大幅減少頻寬。
DSR 的封包傳輸流
使用 Dataplane V2 負載平衡的 DSR 轉送模式時,封包會從外部用戶端流向後端 Pod,再流回外部用戶端,流程如下:
LoadBalancer 類型的 Service 會指派給負載平衡器節點,而該節點上執行的 MetalLB speaker 會播送其 IP 位址
172.16.20.16
。資料平面 V2 會將封包轉送至工作站節點,並使用 IP 選項儲存原始用戶端來源 IP 位址和通訊埠。
工作站節點上的 Dataplane V2 會將封包轉送至後端 Pod。
後端 Pod 會復原來源 IP 位址和通訊埠,並回覆給用戶端。
下圖顯示 DSR 模式的封包流程:
啟用 DSR 模式
如要啟用 DSR 模式,請將 spec.clusterNetwork.forwardMode
欄位新增至叢集設定檔,並設為 dsr
。如先前所述,SNAT 模式預設為啟用。您可以將 forwardMode
設為 snat
,明確指定 SNAT 模式。Dataplane V2 負載平衡的轉送模式只能在建立叢集時設定。
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: lb-mode
namespace: cluster-lb-mode
...
spec:
clusterNetwork:
forwardMode: dsr # valid options are dsr or snat
pods:
cidrBlocks:
- 192.168.0.0/16
services:
cidrBlocks:
- 10.96.0.0/20
...
叢集建立後,就無法修改 forwardMode
值。建立叢集前,請務必根據需求設定正確的選項。