設定負載平衡轉送模式

本文說明負載平衡的兩種 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 模式的封包流程:

SNAT 模式下 Dataplane V2 負載平衡的封包流向

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 模式的封包流程:

SNAT 模式下 Dataplane V2 負載平衡的封包流向

啟用 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 值。建立叢集前,請務必根據需求設定正確的選項。