個別執行個體的加權網路負載平衡

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 健康狀態檢查使用加權負載平衡回報的權重,將流量分配給負載平衡器的後端執行個體。

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您隨時可以更新這項資訊。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。此外,您也可以自行嘗試,看看系統是否提供該付款方式。在完成這個步驟後就無法變更,而且在專案期間仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免系統產生本教學課程結束後產生的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

Google Cloud 控制台,按一下右上方的工具列上的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:

7ffe5cbb04455448.png

這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。本程式碼研究室的所有工作都可以在瀏覽器中完成。不必安裝任何程式。

2. 開始設定

如要使用程式碼研究室,您必須有一個專案。

在這個教學課程中,您會建立具備三個 VM 執行個體的執行個體群組,並為每個執行個體指派權重。您建立了 HTTP 健康狀態檢查來回報後端執行個體的權重。在採用位置負載平衡器政策為 WEIGHTED_MAGLEV 的後端服務中,已啟用加權網路負載平衡器。

事前準備

gcloud services enable compute.googleapis.com

注意:您無法使用 Google Cloud 控制台設定位置負載平衡器政策,並將權重指派給 VM 執行個體。請改用 Google Cloud CLI。

建立虛擬私有雲網路、子網路和防火牆規則

建立虛擬私有雲網路、子網路和輸入允許防火牆規則,允許連線至負載平衡器後端 VM。

  1. 建立虛擬私有雲網路和子網路。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:要建立的子網路名稱。
  1. 建立允許輸入防火牆規則,允許傳送至目的地 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 執行個體並指派權重:

  1. 設定三個後端 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
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 回應。」

gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

HTTP_HEALTH_CHECK_NAME 替換為要建立的 HTTP 健康狀態檢查名稱。

建立後端服務

以下示範如何建立設為使用加權負載平衡的區域外部後端服務。

  1. 建立具有 HTTP 健康狀態檢查的後端服務,並將位置負載平衡器政策設為 WEIGHTED_MAGLEV。
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 替換為要建立的後端服務名稱。
  1. 將執行個體群組新增至後端服務。
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. 為負載平衡器保留區域性外部 IP 位址。
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

ADDRESS_NAME 替換為要建立的 IP 位址名稱。使用 compute addresses describe 指令查看結果。記下預留的靜態外部 IP 位址 (「IP_ADDRESS'」)。

gcloud compute addresses describe ADDRESS_NAME
  1. 使用預留的區域外部 IP 位址「IP_ADDRESS」建立轉送規則。將轉送規則連線至後端服務。
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 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