1. 簡介
歡迎參加進階負載平衡最佳化程式碼實驗室!
在本程式碼研究室中,您將瞭解如何為全域外部應用程式負載平衡器設定進階負載平衡選項。開始之前,建議先參閱雲端負載平衡相關文件 ( https://cloud.google.com/load-balancing/docs/load-balancing-overview)

圖 1. 使用全域外部應用程式負載平衡器選擇目的地端點的工作流程。
程式碼研究室拓撲和用途

圖 2. HTTP 負載平衡器路由拓撲
在本程式碼研究室中,您將設定兩個代管執行個體群組。您將建立全域外部 HTTPS 負載平衡器。負載平衡器會運用 Envoy 負載平衡器支援的進階功能清單中的多項功能。部署完成後,請產生一些模擬負載,並確認您設定的設定是否正常運作。
課程內容
- 如何設定 ServiceLbPolicy,微調負載平衡器。
軟硬體需求
- 瞭解外部 HTTPS 負載平衡。本程式碼研究室的前半部分與「具備進階流量管理功能 (Envoy) 的外部 HTTPs 負載平衡器」程式碼研究室 ( https://codelabs.developers.google.com/codelabs/externalhttplb-adv) 十分相似。建議您先完成該課程。
2. 事前準備
在 Cloud Shell 中,確認專案 ID 已設定完畢
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] prodproject=YOUR-PROJECT-NAME echo $prodproject
啟用 API
啟用所有必要服務
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com gcloud services enable networkservices.googleapis.com
3. 建立虛擬私有雲網路
建立虛擬私有雲網路
透過 Cloud Shell
gcloud compute networks create httplbs --subnet-mode=auto
輸出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/httplbs]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 httplbs AUTO REGIONAL
建立虛擬私有雲防火牆規則
建立虛擬私有雲後,現在要建立防火牆規則。防火牆規則會允許所有 IP 透過通訊埠 80 存取測試應用程式網站的外部 IP,以傳輸 HTTP 流量。
透過 Cloud Shell
gcloud compute firewall-rules create httplb-allow-http-rule \ --allow tcp:80 \ --network httplbs \ --source-ranges 0.0.0.0/0 \ --priority 700
輸出
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/httplb-allow-http-rule]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED httplb-allow-http-rule httplbs INGRESS 700 tcp:80 False
在本程式碼研究室中,我們將調整 VM 的健康狀態。因此我們也會建立防火牆規則,允許 SSH 連線。
透過 Cloud Shell
gcloud compute firewall-rules create fw-allow-ssh \
--network=httplbs \
--action=allow \
--direction=ingress \
--target-tags=allow-ssh \
--rules=tcp:22
輸出
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/fw-allow-ssh]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED fw-allow-ssh httplbs INGRESS 1000 tcp:22 False
4. 設定代管執行個體群組
您需要設定代管執行個體群組,其中包含 HTTP 負載平衡器使用的後端資源模式。首先,我們會建立執行個體範本,為每個區域要建立的 VM 定義相關設定。接下來,我們會為每個區域的後端建立代管執行個體群組,並參照執行個體範本。
代管執行個體群組的範圍可以是區域性或地區性。在本實驗室練習中,我們將建立區域代管執行個體群組。
在本節中,您會看到預先建立的啟動指令碼,在建立執行個體時會參照該指令碼。這個開機指令碼會安裝並啟用網路伺服器功能,我們將使用這些功能模擬網路應用程式。歡迎查看這個指令碼。
建立執行個體範本
首先,請建立執行個體範本。
透過 Cloud Shell
gcloud compute instance-templates create test-template \
--network=httplbs \
--tags=allow-ssh,http-server \
--image-family=debian-9 \
--image-project=debian-cloud \
--metadata=startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
a2ensite default-ssl
a2enmod ssl
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
systemctl restart apache2'
輸出
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP test-template n1-standard-1 2021-11-09T09:24:35.275-08:00
現在可以使用下列 gcloud 指令,確認執行個體範本是否已順利建立:
透過 Cloud Shell
gcloud compute instance-templates list
輸出
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP test-template n1-standard-1 2021-11-09T09:24:35.275-08:00
建立執行個體群組
現在必須從先前建立的執行個體範本建立代管執行個體群組。
透過 Cloud Shell
gcloud compute instance-groups managed create us-east1-a-mig \ --size=1 \ --template=test-template \ --zone=us-east1-a
輸出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instanceGroupManagers/us-east1-a-mig]. NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED us-east1-a-mig us-east1-a zone us-east1-a-mig 0 1 test-template no
透過 Cloud Shell
gcloud compute instance-groups managed create us-east1-b-mig \ --size=5 \ --template=test-template \ --zone=us-east1-b
輸出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-b-mig]. NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED us-east1-b-mig us-east1-b zone us-east1-b-mig 0 5 test-template no
我們可以執行下列 gcloud 指令,確認執行個體群組已順利建立:
透過 Cloud Shell
gcloud compute instance-groups list
輸出
NAME LOCATION SCOPE NETWORK MANAGED INSTANCES us-east1-a-mig us-east1-a zone httplbs Yes 1 us-east1-b-mig us-east1-b zone httplbs Yes 5
驗證網路伺服器功能
每個執行個體都設定為執行 Apache 網路伺服器,並使用簡單的 PHP 指令碼,呈現類似下列內容:
提供網頁的伺服器:us-east1-a-mig-ww2h
如要確保網路伺服器運作正常,請依序前往「Compute Engine」->「VM 執行個體」。確認新執行個體 (例如 us-east1-a-mig-xxx) 已根據執行個體群組定義建立。
現在,請在瀏覽器中向該伺服器發出網路要求,確保網路伺服器正在執行 (啟動可能需要一分鐘)。在 Compute Engine 下方的「VM instances」(VM 執行個體) 頁面中,選取執行個體群組建立的執行個體,然後按一下其「External (public) IP」(外部 (公開) IP)。
或者在瀏覽器中前往 http://<IP_Address>
5. 設定負載平衡器
建立健康狀態檢查
首先,我們必須建立基本健康狀態檢查,確保服務正常運作。我們將建立基本健康狀態檢查,但您也可以進行更多進階自訂。
透過 Cloud Shell
gcloud compute health-checks create http http-basic-check \
--port 80
輸出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks/http-basic-check]. NAME PROTOCOL http-basic-check HTTP
保留外部 IP 位址
在這個步驟中,您需要預留全域可用的靜態 IP 位址,稍後會附加至負載平衡器。
透過 Cloud Shell
gcloud compute addresses create lb-ipv4-2 \
--ip-version=IPV4 \
--global
輸出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/lb-ipv4-2].
請務必記下預留的 IP 位址。
gcloud compute addresses describe lb-ipv4-2 \
--format="get(address)" \
--global
建立後端服務
現在必須為先前建立的代管執行個體群組建立後端服務。
透過 Cloud Shell
gcloud compute backend-services create east-backend-service \
--load-balancing-scheme=EXTERNAL_MANAGED \
--protocol=HTTP \
--port-name=http \
--health-checks=http-basic-check \
--global
輸出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/east-backend-service]. NAME BACKENDS PROTOCOL east-backend-service HTTP
將 MIG 新增至後端服務
現在我們已建立後端服務,接下來必須將先前建立的代管執行個體群組新增至每個後端服務。
透過 Cloud Shell
gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-a-mig --instance-group-zone us-east1-a --global
透過 Cloud Shell
gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-b-mig --instance-group-zone us-east1-b --global
執行下列指令,即可確認後端是否已新增。
透過 Cloud Shell
gcloud compute backend-services list
輸出
NAME BACKENDS PROTOCOL east-backend-service us-east1-a/instanceGroups/us-east1-a-mig,us-east1-b/instanceGroups/us-east1-b-mig HTTP
建立網址對應
現在要建立網址對應。
gcloud compute url-maps create web-map-http \
--default-service=east-backend-service \
--global
輸出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http]. NAME DEFAULT_SERVICE web-map-http backendServices/east-backend-service
建立 HTTP 前端
建立前端是建立負載平衡器的最後一個步驟。這會將您先前預留的 IP 位址對應至您建立的負載平衡器網址對應。
透過 Cloud Shell
gcloud compute target-http-proxies create http-lb-proxy-adv \
--url-map=web-map-http
輸出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpProxies/http-lb-proxy-adv]. NAME URL_MAP http-lb-proxy-adv web-map-http
接著,您需要建立全域轉送規則,將先前保留的 IP 位址對應至 HTTP Proxy。
透過 Cloud Shell
gcloud compute forwarding-rules create http-content-rule \
--load-balancing-scheme EXTERNAL_MANAGED \
--address=lb-ipv4-2 \
--global \
--target-http-proxy=http-lb-proxy-adv \
--ports=80
此時,您可以使用先前記下的 IP 位址,確認負載平衡器是否正常運作。
6. 確認負載平衡器是否正常運作
如要確認負載平衡功能是否正常運作,您需要產生一些負載。為此,我們將建立新的 VM 來模擬負載。
建立 Siege-vm
現在要建立 siege-vm,用來產生負載
透過 Cloud Shell
gcloud compute instances create siege-vm \
--network=httplbs \
--zone=us-east1-a \
--machine-type=e2-medium \
--tags=allow-ssh,http-server \
--metadata=startup-script='sudo apt-get -y install siege'
輸出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instances/siege-vm]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS siege-vm us-central1-ir1 e2-medium 10.132.0.15 34.143.20.68 RUNNING
接著,您可以透過 SSH 連線至建立的 VM。建立完成後,按一下「SSH」啟動終端機並連線。
連線後,請執行下列指令來產生負載。使用您先前為外部 HTTP 負載平衡器保留的 IP 位址。
透過 Cloud Shell
siege -c 20 http://$lb-ipv4-2
輸出
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file
檢查負載分配情形
Siege 正在執行,現在要檢查流量是否平均分配到兩個代管執行個體群組。
停止圍城
您已證明進階流量分配功能正常運作,現在可以停止 Siege。如要這麼做,請返回 siege-vm 的 SSH 終端機,然後按下 CTRL+C 鍵停止執行 siege。
7. 設定服務負載平衡器政策
建立服務負載平衡器政策
基本設定完成後,我們將建立服務負載平衡政策,並試用進階功能。舉例來說,我們會將服務設定為使用一些進階負載平衡設定。在本範例中,我們只會建立政策,以運用自動容量排空功能。但歡迎試用其他功能。
透過 Cloud Shell
gcloud beta network-services service-lb-policies create http-policy \
--auto-capacity-drain --location=global
我們可以透過下列 gcloud 指令,確認政策是否已順利建立:
透過 Cloud Shell
gcloud beta network-services service-lb-policies list --location=global
輸出
NAME http-policy
將服務負載平衡器政策附加至後端服務
現在,我們將新的政策附加至上述現有的後端服務。
透過 Cloud Shell
gcloud beta compute backend-services update east-backend-service \
--service-lb-policy=http-policy --global
8. 調整後端健康狀態
此時,新的服務負載平衡政策已套用至後端服務。因此從技術上來說,你可以直接跳到清理程序。不過,我們也會在本程式碼研究室中進行一些額外的製作調整,向您展示新政策的運作方式。
當健康狀態良好的後端總數低於某個門檻 (25%) 時,自動容量耗盡功能會自動從負載平衡器移除後端 MIG。如要測試這項功能,請透過 SSH 連線至 us-east1-b-mig 中的 VM,並將這些 VM 設為異常。如果門檻為 25%,您需要透過 SSH 連線至四部 VM,並關閉 Apache 伺服器。
如要這麼做,請選取四部 VM,然後按一下「SSH」啟動終端機並連線,藉此透過 SSH 連線至 VM。然後執行下列指令。
sudo apachectl stop
此時,系統會觸發自動容量耗盡功能,us-east1-b-mig 不會收到新要求。
9. 確認自動容量排空功能是否正常運作
重新啟動 Siege
如要驗證新功能,我們會再次使用 siege VM。請透過 SSH 連線至上一步建立的 VM。建立完成後,按一下「SSH」啟動終端機並連線。
連線後,請執行下列指令來產生負載。使用您先前為外部 HTTP 負載平衡器保留的 IP 位址。
透過 Cloud Shell
siege -c 20 http://$lb-ipv4-2
輸出
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file
此時,您會發現所有要求都傳送至 us-east1-a-mig。
停止圍城
您已證明進階流量分配功能正常運作,現在可以停止 Siege。如要這麼做,請返回 siege-vm 的 SSH 終端機,然後按下 CTRL+C 鍵停止執行 siege。
10. 清除步驟
我們已完成實驗室環境,現在要將其拆除。請執行下列指令來刪除測試環境。
透過 Cloud Shell
gcloud compute instances delete siege-vm --zone=us-east1-a gcloud compute forwarding-rules delete http-content-rule --global gcloud compute target-http-proxies delete http-lb-proxy-adv gcloud compute url-maps delete web-map-http gcloud compute backend-services delete east-backend-service --global gcloud compute addresses delete lb-ipv4-2 --global gcloud compute health-checks delete http-basic-check gcloud beta network-services service-lb-policies delete http-policy --location=global gcloud compute instance-groups managed delete us-east1-a-mig --zone=us-east1-a gcloud compute instance-groups managed delete us-east1-b-mig --zone=us-east1-b gcloud compute instance-templates delete test-template gcloud compute firewall-rules delete httplb-allow-http-rule gcloud compute firewall-rules delete fw-allow-ssh gcloud compute networks delete httplbs
11. 恭喜!
恭喜您完成本程式碼研究室。
涵蓋內容
- 使用服務負載平衡政策建立外部應用程式負載平衡器。
- 使用自動容量排除功能設定後端服務。
後續步驟
- 試用服務負載平衡政策提供的其他功能。