設定手動負載平衡

本頁說明使用手動負載平衡時的負載平衡需求。與隨附的負載平衡不同,Google Distributed Cloud 會將負載平衡器部署至叢集節點,以處理控制層和資料層流量,而手動負載平衡則是由您自行設定控制層和資料層流量的負載平衡解決方案。

建立裸機叢集前,您必須先為控制層設定外部負載平衡器。外部控制層負載平衡器也可用於資料層流量,您也可以為資料層設定個別的負載平衡器。舉例來說,您可以使用 MetalLB 等叢集內負載平衡器,處理資料平面流量。

除了說明負載平衡需求外,本頁面也介紹如何使用 F5 BIG-IP 設定手動負載平衡。

必要條件

以下各節說明設定手動負載平衡的先決條件。

必要 IP 位址

建立叢集前,請務必規劃 VIP。所有叢集都需要控制層的 VIP。所有使用者叢集都需要第二個虛擬 IP 位址,用於 Ingress 服務。

這些 VIP 可以位於任何可從負載平衡器路由傳輸的 IPv4 子網路中。所有叢集節點和您執行 bmctl 的管理員工作站,都必須可連線至控制層 VIP。

建立叢集時,系統會使用您在叢集設定檔中指定的 VIP 部署 Ingress 服務。叢集建立後,您可以為這個 IP 位址設定負載平衡。

您必須知道要用於控制層節點的節點 IP 位址。

外部控制層負載平衡器需求

建立叢集前,請先設定控制層負載平衡器。 控制層負載平衡器必須符合下列規定:

  • 控制層 VIP 的虛擬服務 (前端)。控制層的預設接聽通訊埠為 443。不過,如果您在叢集設定檔的 loadBalancer.ports.controlPlaneLBPort 欄位中指定其他通訊埠,虛擬服務就會使用該通訊埠。
  • 後端群組,內含叢集控制層節點的所有 IP 位址。控制層監聽的後端通訊埠為 6444。
  • 監控後端節點的健康狀態檢查。健康狀態檢查必須使用 HTTPS,並檢查通訊埠 6444 上的 /readyz 端點。健康狀態檢查必須確認這個端點會傳回狀態碼 200,才會將節點視為健康狀態良好。

如果外部負載平衡器設定有誤,叢集啟動程序可能會失敗。預檢會驗證外部負載平衡器是否設定正確,包括驗證負載平衡器是否正在對 /readyz 端點執行健康狀態檢查。

將連線重設為失敗的節點 (建議)

除了上述需求外,我們建議您設定負載平衡器,在偵測到後端節點故障時重設用戶端連線。如果沒有這項設定,伺服器執行個體停止運作時,Kubernetes API 伺服器的用戶端可能會停止回應幾分鐘,導致 Kubernetes 控制層不穩定。

  • 使用 F5 BIG-IP 時,這項設定在後端集區設定頁面中稱為「Action On Service Down」。
  • 在 HAProxy 中,這項設定稱為後端伺服器設定中的 on-marked-down shutdown-sessions。
  • 如果您使用其他負載平衡器,請參閱相關文件,找出對應的設定。

設定叢集

建立 Google Distributed Cloud 叢集之前,請先使用 bmctl 建立叢集設定檔。編輯這個檔案,在叢集中啟用手動負載平衡:

  1. loadBalancer.mode 欄位設為 manual
  2. loadBalancer.vips.controlPlaneVIP 欄位設為您在負載平衡器上設定的 VIP。
  3. 移除或排除 loadBalancer.addressPools 區段的註解。

編輯完設定檔後 (包括與負載平衡無關的欄位),請執行前置檢查,確認負載平衡器上的控制層 VIP 設定正確無誤:

bmctl check preflight -c CLUSTER_NAME

CLUSTER_NAME 替換為叢集名稱。

支援使用者叢集中的 LoadBalancer 服務

您必須設定負載平衡,才能支援 Kubernetes LoadBalancer 服務。在手動負載平衡模式中,Google Distributed Cloud 不會自動佈建負載平衡器,因此除非您佈建及設定負載平衡器來指向服務,否則 LoadBalancer 服務無法運作。

此外,Google Distributed Cloud 會使用 LoadBalancer 服務,在所有使用者叢集中自動部署 Ingress 服務。如要從外部存取這個 LoadBalancer 服務,必須設定負載平衡器,指向該服務。

支援 LoadBalancer 服務的選項包括:

  • 為叢集中的每個 LoadBalancer 服務手動設定負載平衡器。如需使用 F5 BIG-IP 的範例,請參閱設定 LoadBalancer 服務的支援功能
  • 在叢集中安裝負載平衡器控制器,以便在建立 LoadBalancer 服務時設定外部負載平衡器。
  • 安裝叢集內負載平衡解決方案,例如 MetalLB

使用 F5 BIG-IP 進行手動負載平衡

本節說明如何使用 F5 BIG-IP 做為外部負載平衡器,設定手動負載平衡。如果您使用其他負載平衡器,請參閱該負載平衡器的說明文件,並以這些步驟做為範本。

設定控制層負載平衡器

您必須先設定控制層負載平衡器,才能建立叢集。完成這些步驟後,即可設定及建立叢集

為叢集建立分割區

每個叢集都應有自己的分割區。 使用 BIG-IP 設定公用程式建立分割區:

  1. 依序前往「系統」>「使用者」>「分割區清單」
  2. 點選「建立」
  3. 輸入分割區名稱。
  4. 按一下「完成」

在下列步驟中,您將在這個分割區中建立物件。請務必在下列各項工作的 UI 右上角下拉式選單中選取這個分割區,確保每個物件都是在這個分割區中建立。

建立監控器

建立監控器,對控制平面節點執行健康狀態檢查:

  1. 依序前往「Local Traffic」>「Monitors」
  2. 點選「建立」
  3. 輸入監控項目的名稱 (例如 https_readyz)。
  4. 將「類型」設為「HTTPS」
  5. 在「Send String」(傳送字串) 中輸入 GET /readyz HTTP/1.1\r\nHost: \r\nConnection: close
  6. 在「Receive String」(接收字串) 中輸入 HTTP/1.1 200
  7. 按一下「完成」

建立節點

建立指向控制層節點的節點。如果叢集具有高可用性 (HA) 控制層,且有多個控制層節點,請為每個控制層節點建立節點物件。

  1. 依序前往「Local Traffic」>「Nodes」>「Node List」
  2. 點選「建立」
  3. 輸入節點的名稱。
  4. 在「地址」欄位中輸入節點的 IP 位址。
  5. 按一下「完成」

建立後端集區

為控制層節點建立集區

  1. 依序前往「Local」>「流量」>「集區」>「集區清單」
  2. 點選「建立」
  3. 在「設定」下拉式選單中選取「進階」
  4. 輸入集區名稱。
  5. 選取先前建立的健康狀態監控器。
  6. 將「Action On Service Down」設為「Reject」 (請參閱「Resetting connections to failed nodes」一節中對這項設定的討論)。
  7. 將控制層節點新增至集區。如果叢集有多個控制平面節點,請針對每個節點重複執行下列步驟:
    1. 在「New Members」(新成員) 區段中,按一下「Node List」(節點清單),然後選取先前建立的控制平面節點。
    2. 在「服務通訊埠」欄位中輸入 6444
    3. 按一下「新增」

建立虛擬伺服器

為控制層建立虛擬伺服器

  1. 依序前往「Local Traffic」>「Virtual Servers」>「Virtual Server List」
  2. 點選「建立」
  3. 輸入虛擬伺服器的名稱。
  4. 將「Type」設為「Standard」。
  5. 在「來源地址」欄位中輸入 0.0.0.0/0,允許來自任何來源的流量。
  6. 輸入控制層 VIP 做為「目的地地址」
  7. 輸入控制層通訊埠做為「服務通訊埠」。預設值為 443,但您可以設定這個值,且必須與叢集設定中 loadBalancer.ports.controlPlaneLBPort 的設定相符。
  8. 在「Source Address Translation」(來源地址轉譯) 欄位中,選取「Auto Map」(自動對應)
  9. 在「Default Pool」(預設集區) 中,從下拉式選單選取先前建立的集區。
  10. 按一下「完成」

設定 LoadBalancer 服務的支援功能

在手動負載平衡模式下,Google Distributed Cloud 不會自動佈建負載平衡器,以支援 LoadBalancer 服務。詳情請參閱「在使用者叢集中支援 LoadBalancer 服務」。

本節說明如何手動設定 LoadBalancer 服務的 F5 BIG-IP 負載平衡器。針對要公開的每個 LoadBalancer 服務重複執行這些步驟。

必要條件

如要設定 LoadBalancer 服務,您需要知道要透過負載平衡器公開的 VIP、要公開的連接埠,以及 Kubernetes 中 LoadBalancer 服務使用的 NodePort。

在叢集中部署 LoadBalancer 服務後,請找出 LoadBalancer 服務使用的 NodePort。下列指令會顯示服務的連接埠:

kubectl --kubeconfig KUBECONFIG get service SERVICE_NAME -oyaml

更改下列內容:

  • KUBECONFIG,並提供要使用的 kubeconfig 檔案路徑。
  • SERVICE_NAME 改為 LoadBalancer 服務的名稱。

kubctl get service 的輸出內容包含 ports 區段。每個通訊埠項目都會顯示服務上公開的 nodePort,而您設定負載平衡器後端時,就是指向這個 nodePort。下列範例輸出內容顯示 ports 區段的結構:

spec:
  clusterIP: 172.26.232.107
  externalTrafficPolicy: Cluster
  loadBalancerIP: 21.0.101.77
  ports:
  - name: status-port
    nodePort: 30281
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http
    nodePort: 30124
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    nodePort: 31858
    port: 443
    protocol: TCP
    targetPort: 443

HTTP 和 HTTPS 流量都有專屬通訊埠。您可以透過負載平衡器公開其中一個或兩個連接埠。

如果您要公開在所有叢集中自動部署的 Ingress 服務,LoadBalancer 服務會命名為 istio-ingress,並位於 gke-system 命名空間。使用下列指令找出其連接埠:

kubectl --kubeconfig KUBECONFIG -n gke-system get service istio-ingress -oyaml

Ingress 服務會使用 loadBalancerIP 進行設定,這是初始叢集設定中 loadBalancer.vips.ingressVIP 欄位提供的 IP。您應公開這個 VIP,以便在外部負載平衡器上公開 Ingress 服務。

建立後端集區

  1. 依序前往「Local Traffic」>「Pools」>「Pool List」
  2. 點選「建立」
  3. 輸入集區名稱。
  4. 選取「tcp」tcp做為健康狀態監控器。
  5. 將工作站節點新增至節點集區。針對每個節點重複執行這些步驟。您可以新增控制層和工作站節點,因為 Kubernetes NodePort 可在叢集中的任何節點上存取。
    1. 在「新成員」部分中,按一下「節點清單」,然後選取先前建立的節點。
    2. 在「Service Port」(服務通訊埠) 欄位中,輸入服務的 NodePort 值。
    3. 按一下「新增」

建立虛擬伺服器

  1. 依序前往「Local Traffic」>「Virtual Servers」>「Virtual Server List」
  2. 點選「建立」
  3. 輸入虛擬伺服器的名稱。
  4. 將「Type」設為「Standard」。
  5. 在「來源地址」欄位中輸入 0.0.0.0/0,允許來自任何來源的流量。
  6. 輸入負載平衡器服務 VIP 做為「目的地地址」
  7. 輸入負載平衡器服務公開的通訊埠做為「服務通訊埠」
  8. 在「Source Address Translation」(來源地址轉譯) 欄位中,選取「Auto Map」(自動對應)
  9. 在「Default Pool」(預設集區) 中,從下拉式選單選取先前建立的集區。
  10. 按一下「完成」