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

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 未使用的字元字串。你隨時可以更新該位置資訊。
  • 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生不重複的字串,通常您不需要在意該字串為何。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為 PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試使用自己的名稱,看看是否可用。完成這個步驟後就無法變更,且在整個專案期間都會維持不變。
  • 請注意,部分 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件
  1. 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的練習不會產生任何費用,或只會產生少量費用。如要關閉資源,避免產生本教學課程以外的費用,您可以刪除建立的資源或整個專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

啟動 Cloud Shell

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

Google Cloud 控制台中,點選右上工具列的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業只需幾分鐘即可完成。完成後,您應該會看到如下的內容:

7ffe5cbb04455448.png

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

2. 開始設定

Codelab 只需要一個專案。

在本教學課程中,您會建立含有三個 VM 執行個體的執行個體群組,並為每個執行個體指派權重。您會建立 HTTP 健康狀態檢查,回報後端執行個體權重。在後端服務上啟用加權網路負載平衡器,並將區域性負載平衡器政策設為 WEIGHTED_MAGLEV。

事前準備

gcloud services enable compute.googleapis.com

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

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

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

  1. 建立虛擬私有雲網路和子網路。a. 如要建立 VPC 網路,請執行 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