本文說明負載平衡的兩種 Dataplane V2 轉送模式,以及如何為 Google Distributed Cloud 啟用這些模式。Dataplane V2 支援兩種負載平衡轉送模式:
- 來源網路位址轉譯 (SNAT)
- 伺服器直接回傳 (DSR)
只有在建立叢集時,才能設定負載平衡的轉送模式。
SNAT 負載平衡
來源網路位址轉譯 (SNAT) 是 Dataplane V2 負載平衡的預設轉送模式。不過,在 SNAT 模式下,系統不會為後端 Pod 保留用戶端 IP 位址。當用戶端傳送的封包抵達負載平衡器節點時,系統會翻譯並轉送至目的地 worker 節點,以及後端 Pod。後端 Pod 會發現要求來自負載平衡器節點,而非用戶端位置。因此,回覆會傳回負載平衡器節點,並經過反向翻譯,然後傳回給用戶端。
SNAT 的封包流程
如果 Dataplane V2 負載平衡採用 SNAT 轉送模式,外部用戶端到後端 Pod 的封包流程如下:
LoadBalancer 類型的 Service 會指派給負載平衡器節點,而該節點上執行的 MetalLB speaker 會宣傳其 IP 位址
172.16.20.16。資料平面 V2 會使用 SNAT 將來源 IP 位址和通訊埠轉譯為
<LB_NODE_IP>:52000,並將封包轉送至 worker 節點。回應會傳回負載平衡器節點,且目的地地址會反向轉譯。
下圖顯示 SNAT 模式的封包流程:
DSR 負載平衡
伺服器直接回傳 (DSR) 可解決 SNAT 負載平衡的問題。在 DSR 模式中,負載平衡器節點會使用 IP 選項儲存用戶端來源位址。worker 節點可以復原原始封包,並轉送至後端 Pod。後端 Pod 可以看出封包來自用戶端 IP 位址,而非負載平衡器節點 IP 位址。因此,傳回封包會直接傳回用戶端 IP 位址,而不會傳回負載平衡器節點。
這個模式不僅解決了用戶端 IP 位址的顯示問題,也為負載平衡器節點節省了頻寬。返回流量不必經過負載平衡器節點,負載平衡器節點也不必再追蹤連線。這種做法可節省記憶體,並釋出轉送埠。對於非對稱工作負載 (下載流量遠高於要求流量),DSR 流程可大幅減少頻寬。
DSR 的封包傳輸流
使用 Dataplane V2 負載平衡的 DSR 轉送模式時,封包會從外部用戶端流向後端 Pod,再流回外部用戶端,流程如下:
LoadBalancer 類型的 Service 會指派給負載平衡器節點,而該節點上執行的 MetalLB speaker 會發布其 IP 位址
172.16.20.16。資料平面 V2 會將封包轉送至 worker 節點,並使用 IP 選項儲存原始用戶端來源 IP 位址和通訊埠。
worker 節點上的 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 值。建立叢集前,請確認已根據需求設定正確的選項。