手動負載平衡可讓您在 Google Distributed Cloud 中,為控制層和資料層流量設定自己的負載平衡解決方案。在套裝負載平衡中,Google Distributed Cloud 會將負載平衡器部署至叢集節點,但手動負載平衡則需要您自行設定及管理這些解決方案。
建立裸機叢集前,必須先為控制層設定外部負載平衡器。這個負載平衡器也可以處理資料層流量,您也可以為資料層使用獨立的負載平衡器,例如叢集內 MetalLB 部署作業。由於 Google Distributed Cloud 不會以這種模式佈建負載平衡器,因此您必須先為 LoadBalancer 服務設定負載平衡,這些服務才能運作。本文說明負載平衡需求,並提供使用 F5 BIG-IP 的設定範例。
必要條件
以下各節說明設定手動負載平衡的必要條件。
必要的 IP 位址
建立叢集前,請務必先規劃 VIP。所有叢集都需要控制層的 VIP。所有使用者叢集都需要第二個虛擬 IP,用於 Ingress 服務。
這些 VIP 可位於任何可從負載平衡器轉送的 IPv4 子網路。控制層 VIP 必須可從所有叢集節點和執行 bmctl 的管理員工作站連線。
建立叢集時,系統會使用您在叢集設定檔中指定的 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 建立叢集設定檔。編輯這個檔案,在叢集中啟用手動負載平衡:
- 將
loadBalancer.mode欄位設為manual。 - 將
loadBalancer.vips.controlPlaneVIP欄位設為您在負載平衡器上設定的 VIP。 - 移除或註解排除
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 設定公用程式建立分區:
- 依序前往「System」>「Users」>「Partition List」。
- 點選「建立」。
- 輸入分區名稱。
- 按一下「完成」。
在後續步驟中,您會在這個分區建立物件。請務必在 UI 右上角的下拉式選單中選取這個分區,以便在該分區中建立各項物件。
建立監控器
建立監控器,對控制層節點執行健康狀態檢查:
- 依序前往「Local Traffic」>「Monitors」。
- 點選「建立」。
- 輸入監控項目的名稱 (例如 https_readyz)。
- 將「Type」(類型) 設為「HTTPS」。
- 在「Send String」中輸入
GET /readyz HTTP/1.1\r\nHost: \r\nConnection: close。 - 在「Receive String」中輸入
HTTP/1.1 200。 - 按一下「完成」。
建立節點
建立指向控制層節點的節點。如果叢集具有高可用性 (HA) 控制層,且有多個控制層節點,請為每個控制層節點建立節點物件。
- 依序前往「Local Traffic」>「Nodes」>「Node List」。
- 點選「建立」。
- 輸入節點的名稱。
- 在「Address」(位址) 欄位中輸入節點的 IP 位址。
- 按一下「完成」。
建立後端集區
為控制層節點建立集區:
- 依序前往「Local Traffic」>「Pools」>「Pool List」。
- 點選「建立」。
- 在「設定」下拉式選單中,選取「進階」。
- 輸入集區名稱。
- 選取先前建立的健康狀態監控器。
- 將「Action On Service Down」設為「Reject」 (請參閱「重設與故障節點的連線」一節中關於這項設定的討論)。
- 將控制層節點新增至集區。如果叢集有多個控制層節點,請針對每個節點重複執行下列步驟:
- 在「New Members」(新成員) 區段中,按一下「Node List」(節點清單),然後選取先前建立的控制層節點。
- 在「Service Port」(服務通訊埠) 欄位中輸入 6444。
- 按一下「新增」。
建立虛擬伺服器
為控制層建立虛擬伺服器:
- 依序前往「Local Traffic」>「Virtual Servers」>「Virtual Server List」。
- 點選「建立」。
- 輸入虛擬伺服器的名稱。
- 將「Type」(類型) 設為「Standard」(標準)。
- 在「Source Address」(來源位址) 欄位中輸入 0.0.0.0/0,允許來自任何來源的流量。
- 輸入控制層 VIP 做為「Destination Address」(目的地地址)。
- 輸入控制層通訊埠做為「Service Port」(服務通訊埠)。預設值為 443,但可調整,且必須與您在叢集設定中為
loadBalancer.ports.controlPlaneLBPort設定的值相符。 - 在「Source Address Translation」欄位中,選取「Auto Map」。
- 在「預設集區」下拉式選單中,選取先前建立的集區。
- 按一下「完成」。
設定 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 區段。每個通訊埠項目都會顯示 Service 上公開的 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 流量有專屬通訊埠。您可以透過負載平衡器公開其中一個或兩個通訊埠。
如果您要公開在所有叢集中自動部署的輸入服務,LoadBalancer 服務會命名為 istio-ingress,並位於 gke-system 命名空間中。使用下列指令找出其通訊埠:
kubectl --kubeconfig KUBECONFIG -n gke-system get service istio-ingress -oyaml
ingress 服務會設定 loadBalancerIP,也就是初始叢集設定中 loadBalancer.vips.ingressVIP 欄位提供的 IP。您應公開這個 VIP,以便在外部負載平衡器上公開 ingress 服務。
建立後端集區
- 依序前往「Local Traffic」>「Pools」>「Pool List」。
- 點選「建立」。
- 輸入集區名稱。
- 選取「tcp」tcp做為健康狀態監控工具。
- 將 worker 節點新增至節點集區。針對每個節點重複執行這些步驟。您可以新增控制層和 worker 節點,因為叢集中的任何節點都能存取 Kubernetes NodePort。
- 在「New Members」(新成員) 部分,按一下「Node List」(節點清單),然後選取先前建立的其中一個節點。
- 在「Service Port」(服務通訊埠) 欄位中,輸入服務的 NodePort 值。
- 按一下「新增」。
建立虛擬伺服器
- 依序前往「Local Traffic」>「Virtual Servers」>「Virtual Server List」。
- 點選「建立」。
- 輸入虛擬伺服器的名稱。
- 將「Type」(類型) 設為「Standard」(標準)。
- 在「Source Address」(來源位址) 欄位中輸入 0.0.0.0/0,允許來自任何來源的流量。
- 輸入負載平衡器服務 VIP 做為「Destination Address」(目的地地址)。
- 在「Service Port」(服務通訊埠) 中,輸入負載平衡器服務公開的通訊埠。
- 在「Source Address Translation」欄位中,選取「Auto Map」。
- 在「預設集區」下拉式選單中,選取先前建立的集區。
- 按一下「完成」。