1. 簡介
您可以設定網路負載平衡器,根據 HTTP 健康狀態檢查透過加權負載平衡回報的權重,將流量分配到各個負載平衡器的後端執行個體。
您必須設定以下兩項設定,才能使用加權負載平衡:
- 您必須將後端服務的地區性負載平衡器政策 (localityLbPolicy) 設為 WEIGHTED_MAGLEV。
- 您必須設定含有 HTTP/HTTP2/HTTPS 健康狀態檢查的後端服務。HTTP 健康狀態檢查回應必須包含自訂 HTTP 回應標頭欄位 X-Load-Balancing-Endpoint-Weight,才能為每個後端執行個體指定包含介於 0 至 1000 的整數值 (以十進位表示的權重)。
如果您為多個採用加權負載平衡的後端服務型網路負載平衡器,使用相同的執行個體群組做為後端,建議您為後端服務的每項健康狀態檢查使用不重複的要求路徑。詳情請參閱 HTTP、HTTPS 和 HTTP/2 健康狀態檢查的成功標準。
HTTP 健康狀態檢查應傳回 HTTP 200 (OK) 回應,以便通過健康狀態檢查,且系統會將後端執行個體視為健康狀態良好。如果所有後端執行個體都通過健康狀態檢查,並以零權重傳回 X-Load-Balancing-Endpoint-Weight,負載平衡器便會將新連線分配到健康狀態良好的後端,以相同權重處理。負載平衡器也可以在健康狀態不良的後端之間分配新連線。詳情請參閱流量分配。
如需加權負載平衡的範例,請參閱「後端選取與連線追蹤」。
加權負載平衡可用於下列情境:
- 如果某些連線處理的資料量比其他連線多,或某些連線的持續時間比其他連線更長,後端負載分配可能會變得不平均。透過訊號較低的每個執行個體權重,高負載的執行個體會降低新連線的共用比例,同時繼續為現有連線提供服務。
- 如果後端超載且指派更多連線可能會中斷現有連線,這類後端會將零權重指派給本身。如果發出零權重的訊號,後端執行個體就會停止為新的連線提供服務,但會繼續服務現有的連線。
- 如果後端在維護之前先清空現有連線,則會將零權重指派給本身。如果發出零權重的訊號,後端執行個體就會停止服務新的連線,但會繼續服務現有的連線。
課程內容
- 如何設定網路負載平衡器,根據 HTTP 健康狀態檢查使用加權負載平衡回報的權重,將流量分配給負載平衡器的後端執行個體。
自修環境設定
- 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。
- 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您隨時可以更新這項資訊。
- 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為
PROJECT_ID
)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。此外,您也可以自行嘗試,看看系統是否提供該付款方式。在完成這個步驟後就無法變更,而且在專案期間仍會保持有效。 - 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免系統產生本教學課程結束後產生的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。
啟動 Cloud Shell
雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。
在 Google Cloud 控制台,按一下右上方的工具列上的 Cloud Shell 圖示:
佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:
這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。本程式碼研究室的所有工作都可以在瀏覽器中完成。不必安裝任何程式。
2. 開始設定
如要使用程式碼研究室,您必須有一個專案。
在這個教學課程中,您會建立具備三個 VM 執行個體的執行個體群組,並為每個執行個體指派權重。您建立了 HTTP 健康狀態檢查來回報後端執行個體的權重。在採用位置負載平衡器政策為 WEIGHTED_MAGLEV 的後端服務中,已啟用加權網路負載平衡器。
事前準備
- 閱讀以後端服務為基礎的外部網路負載平衡總覽。
- 安裝 Google Cloud CLI。如需工具的完整總覽,請參閱 gcloud CLI 總覽。您可以在 API 和 gcloud CLI 參考資料中找到與負載平衡相關的指令。如果您之前未執行 Google Cloud CLI,請先執行 gcloud init 進行驗證。
- 啟用 Compute API。
gcloud services enable compute.googleapis.com
注意:您無法使用 Google Cloud 控制台設定位置負載平衡器政策,並將權重指派給 VM 執行個體。請改用 Google Cloud CLI。
建立虛擬私有雲網路、子網路和防火牆規則
建立虛擬私有雲網路、子網路和輸入允許防火牆規則,允許連線至負載平衡器後端 VM。
- 建立虛擬私有雲網路和子網路。a.如要建立虛擬私有雲網路,請執行
gcloud compute networks create
指令:
gcloud compute networks create NETWORK_NAME --subnet-mode custom
b. 在這個範例中,子網路的主要 IPv4 位址範圍為 10.10.0.0/24
。
如要建立子網路,請執行 gcloud compute networks subnets create
指令:
gcloud compute networks subnets create SUBNET_NAME \ --network=NETWORK_NAME \ --range=10.10.0.0/24 \ --region=us-central1
更改下列內容:
NETWORK_NAME
:要建立的虛擬私有雲網路名稱。SUBNET_NAME
:要建立的子網路名稱。
- 建立允許輸入防火牆規則,允許傳送至目的地 TCP 通訊埠 80 和 443 的封包傳送至後端 VM。在這個範例中,防火牆規則會允許來自任何來源 IP 位址的連線。防火牆規則會套用至含有網路標記
network-lb-tag
的 VM。如要建立防火牆規則,請執行gcloud compute firewall-rules create
指令:
gcloud compute firewall-rules create FIREWALL_RULE_NAME \ --direction=INGRESS \ --priority=1000 \ --network=NETWORK_NAME \ --action=ALLOW \ --rules=tcp:80,tcp:443 \ --source-ranges=0.0.0.0/0 \ --target-tags=network-lb-tag
請將 FIREWALL_RULE_NAME
替換為要建立的防火牆規則名稱。
建立 VM 執行個體並指定權重
建立三個 VM 執行個體並指派權重:
- 設定三個後端 VM 執行個體,以透過 HTTP 回應在 X-Load-Balancing-Endpoint-Weight 標頭中傳回權重。在本教學課程中,您將設定一個後端執行個體回報權重為零,第二個後端執行個體回報權重為 100,而設定第三個後端執行個體回報權重為 900。如要建立執行個體,請執行
gcloud compute instances create
指令:
gcloud compute instances create instance-0 \ --zone=us-central1-a \ --tags=network-lb-tag \ --image-family=debian-10 \ --image-project=debian-cloud \ --subnet= SUBNET_NAME \ --metadata=load-balancing-weight=0,startup-script='#! /bin/bash apt-get update apt-get install apache2 -y ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html lb_weight="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)" echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \ tee /etc/apache2/conf-enabled/headers.conf systemctl restart apache2'
gcloud compute instances create instance-100 \ --zone=us-central1-a \ --tags=network-lb-tag \ --image-family=debian-10 \ --image-project=debian-cloud \ --subnet=SUBNET_NAME \ --metadata=load-balancing-weight=100,startup-script='#! /bin/bash apt-get update apt-get install apache2 -y ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html lb_weight="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)" echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \ tee /etc/apache2/conf-enabled/headers.conf systemctl restart apache2'
gcloud compute instances create instance-900 \ --zone=us-central1-a \ --tags=network-lb-tag \ --image-family=debian-10 \ --image-project=debian-cloud \ --subnet= SUBNET_NAME \ --metadata=load-balancing-weight=900,startup-script='#! /bin/bash apt-get update apt-get install apache2 -y ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html lb_weight="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)" echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \ tee /etc/apache2/conf-enabled/headers.conf systemctl restart apache2'
建立執行個體群組
在本教學課程中,您將說明如何建立非代管執行個體群組,並容納全部三個 VM 執行個體(instance-0, instance-100, and instance-900
)。
- 如要建立執行個體群組,請執行
gcloud compute instance-groups unmanaged create
指令:
gcloud compute instance-groups unmanaged create INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \ --zone=us-central1-a \ --instances=instance-0,instance-100,instance-900
將 INSTANCE_GROUP
替換為要建立的執行個體群組名稱。
建立 HTTP 健康狀態檢查
在本教學課程中,您將提供建立 HTTP 健康狀態檢查的操作說明,以讀取含有後端 VM 權重的 HTTP 回應。」
- 如要建立 HTTP 健康狀態檢查,請執行
gcloud compute health-checks create
指令:
gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \ --region=us-central1
將 HTTP_HEALTH_CHECK_NAME
替換為要建立的 HTTP 健康狀態檢查名稱。
建立後端服務
以下示範如何建立設為使用加權負載平衡的區域外部後端服務。
- 建立具有 HTTP 健康狀態檢查的後端服務,並將位置負載平衡器政策設為 WEIGHTED_MAGLEV。
- 如要建立後端服務,請執行
gcloud compute backend-services create
指令:
gcloud compute backend-services create BACKEND_SERVICE_NAME \ --load-balancing-scheme=external \ --protocol=tcp \ --region=us-central1 \ --health-checks=HTTP_HEALTH_CHECK_NAME \ --health-checks-region=us-central1 \ --locality-lb-policy=WEIGHTED_MAGLEV
- 將
BACKEND_SERVICE_NAME
替換為要建立的後端服務名稱。
- 將執行個體群組新增至後端服務。
- 如要新增執行個體群組,請執行
gcloud compute backend-services add-backend
指令:
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group=INSTANCE_GROUP \ --instance-group-zone=us-central1-a \ --region=us-central1
- 為負載平衡器保留區域性外部 IP 位址。
- 如要保留一或多個 IP 位址,請執行
gcloud compute addresses create
指令:
gcloud compute addresses create ADDRESS_NAME \ --region us-central1
將 ADDRESS_NAME
替換為要建立的 IP 位址名稱。使用 compute addresses describe
指令查看結果。記下預留的靜態外部 IP 位址 (「IP_ADDRESS'
」)。
gcloud compute addresses describe ADDRESS_NAME
- 使用預留的區域外部 IP 位址「IP_ADDRESS」建立轉送規則。將轉送規則連線至後端服務。
- 如要建立轉送規則,請執行
gcloud compute forwarding-rules create
指令:
gcloud compute forwarding-rules create FORWARDING_RULE \ --region=us-central1 \ --ports=80 \ --address=IP_ADDRESS \ --backend-service=BACKEND_SERVICE_NAME
- 請將下列指令:
FORWARDING_RULE
:要建立的轉送規則名稱。IP_ADDRESS:
要指派給執行個體的 IP 位址。請使用預留的靜態外部 IP 位址,不要使用位址名稱。
使用後端服務 API 驗證後端權重
確認後端權重能正確回報至 HTTP 健康狀態檢查。
- 如要從後端服務取得後端權重 (以及健康狀態),請執行
gcloud compute backend-services get-health
指令:
gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \ --region=us-central1
輸出內容應如下所示:
backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name} status: healthStatus: - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name} forwardingRuleIp: 34.135.46.66 healthState: HEALTHY instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0 ipAddress: 10.10.0.5 port: 80 weight: '0' - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name} forwardingRuleIp: 34.135.46.66 healthState: HEALTHY instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100 ipAddress: 10.10.0.6 port: 80 weight: '100' - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name} forwardingRuleIp: 34.135.46.66 healthState: HEALTHY instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900 ipAddress: 10.10.0.7 port: 80 weight: '900' kind: compute#backendServiceGroupHealth