如何在 GCP 中建立 L4 或 L7 負載平衡機制 | Qwiklabs GSP007



簡介

在本文實作練習中,將會透過 Set Up Network and HTTP Load Balancers | Google Cloud Skills Boost 主題,學習如何在 GCP 雲端環境中,了解「網路負載平衡器」(Network Load Balancer) 也就是 Layer 4 (TCP) 層級的負載平衡器,以及「HTTP 負載平衡器」(HTTP Load Balancer) 也就是 Layer 7 (HTTP) 層級的負載平衡器,這兩者之間有什麼差異,以及如何為 Compute Engine 虛擬主機 (VM) 中執行的應用程式,組態設定使用 L4 (TCP) 或 L7 (HTTP) 負載平衡器。






啟用 Cloud Shell (gcloud)

本次實作時間給予 1.5 小時也是非常充裕。同樣的,啟動實作環境後,系統提供暫用的使用者帳號、密碼、Project ID…等資訊。


在 Cloud Console 畫面中,點選右上角圖示後,準備啟用 Cloud Shell (gcloud),稍後也會使用到。簡單來說,Cloud Shell 是個已經載入了開發工具的極小型 VM 虛擬主機,並且提供 5 GB 儲存空間,以便管理人員可以透過 Cloud Shell 對 Google Cloud 資源進行存取等管理動作。

順利啟用 Cloud Shell 之後,可以嘗試執行「gcloud auth list」、「gcloud config list project」指令,了解目前運作環境的相關系統資訊。詳細資訊請參考 gcloud CLI overview  |  Google Cloud CLI Documentation 官方文件。






設定採用的 Region 和 Zone

在開始實作之前,應該先了解有哪一些 Google Compute Engine 資源,可供使用。簡單來說,「區域」(Region) 是執行資源的特定地理位置,每個區域當中則會有一或多個「可用區」(Zone)。舉例來說,「asia-east1」表示東亞區域,在這個區域中有「asia-east1-a、asia-east1-basia-east1-c」 可用區。有關 Region 和 Zone 的詳細資訊,請參考 Regions and zones  |  Compute Engine Documentation  |  Google Cloud 官方文件。下表列出各個可用區和所屬區域:


透過下列指令,可以組態設定 Region 為「us-west4」,並將 Zone 設定為「us-west4-c」,組態設定完成後,記得透過指令確認組態設定是否套用生效。






部署 3 台 VM 虛擬主機並擔任網頁伺服器

在實作負載平衡機制之前,先部署 3 台 Compute Engine VM 虛擬主機,並安裝 Apache 網頁伺服器服務。在下列指令中,可以看到部署的 VM 虛擬主機名稱為 www1、www2、www3。
gcloud compute instances create www1 \     --zone= \     --tags=network-lb-tag \     --machine-type=e2-medium \     --image-family=debian-11 \     --image-project=debian-cloud \     --metadata=startup-script='#!/bin/bash       apt-get update       apt-get install apache2 -y       service apache2 restart       echo " <h3>Web Server: www1</h3>" | tee /var/www/html/index.html'
gcloud compute instances create www2 \     --zone= \     --tags=network-lb-tag \     --machine-type=e2-medium \     --image-family=debian-11 \     --image-project=debian-cloud \     --metadata=startup-script='#!/bin/bash       apt-get update       apt-get install apache2 -y       service apache2 restart       echo " <h3>Web Server: www2</h3>" | tee /var/www/html/index.html'
gcloud compute instances create www3 \     --zone= \     --tags=network-lb-tag \     --machine-type=e2-medium \     --image-family=debian-11 \     --image-project=debian-cloud \     --metadata=startup-script='#!/bin/bash       apt-get update       apt-get install apache2 -y       service apache2 restart       echo " <h3>Web Server: www3</h3>" | tee /var/www/html/index.html'


接著,透過指令「gcloud compute firewall-rules create www-firewall-network-lb --target-tags network-lb-tag --allow tcp:80」新增 HTTP 流量,並允許傳送至這 3 台網頁伺服器的防火牆規則。然後執行「gcloud compute instances list」指令,列出 3 台網頁伺服器使用的 EXTERNAL_IP


確認每台網頁伺服器的 Public IP 位址之後,使用 curl 指令確認網頁伺服器服務正常運作。






組態設定 Layer 4 (TCP) 負載平衡機制

在組態設定 L4 負載平衡服務時,VM 虛擬機器會收到預定傳送至您所設定的靜態外部 IP 位址的封包,並透過 Compute Engine 映像檔建立的執行個體會自動設定為處理這個 IP 位址。詳細資訊請參考 External passthrough Network Load Balancer overview  |  Load Balancing  |  Google Cloud  官方文件。

依序執行下列指令,建立 Layer 4 (TCP) 負載平衡機制:
  • 為 L4 負載平衡器建立靜態外部 IP 位址
    • gcloud compute addresses create network-lb-ip-1 --region  us-west4
  • 建立目標集區 www-pool 並啟用健康狀態檢查功能
    • gcloud compute target-pools create www-pool --region us-west4 --http-health-check basic-check
  • 將 3 台網頁伺服器加入集區 www-pool 當中
    • gcloud compute target-pools add-instances www-pool --instances www1,www2,www3
  • 新增 HTTP 封包轉送規則
    • gcloud compute forwarding-rules create www-rule --region us-west4 --ports 80 --address network-lb-ip-1 --target-pool www-pool





測試封包轉送規則是否正確運作

現在,L4 負載平衡服務已經設定完成。先執行「gcloud compute forwarding-rules describe www-rule --region us-west4」指令,確認 L4 負載平衡服務的 Public IP 位址,本文實作為「34.125.40.173」。

接著,定義名稱為 IPADDRESS 的變數,內容為「IPADDRESS=$(gcloud compute forwarding-rules describe www-rule --region us-west4 --format="json" | jq -r .IPAddress)」,定義完成後先執行「echo $IPADDRESS」,確認是否顯示為 L4 負載平衡服務的 Public IP 位址,然後使用 curl 指令「while true; do curl -m1 $IPADDRESS; done」存取 L4 負載平衡服務的 Public IP 位址。

此時,便可以看到隨機傳回 3 台網頁伺服器的 IP 位址,表示 L4 負載平衡服務封包轉送規則正確運作,按下 Ctrl + C 組合鍵即可停止測試。值得注意的是,若一開始發生回應失敗情況的話,請等待 30 秒之後再次測試。


事實上,也可以從 Google Console 管理介面,查看 L4 負載平衡服務的組態設定內容。








組態設定 Layer 7 (HTTP) 負載平衡機制

在 Google Cloud 運作架構中,Layer 7 (HTTP) 負載平衡機制,是由 GFE (Google Front End) 所負責。GFE 遍布全球各地,透過 Google 的全球網路和控制層互相搭配運作,所以管理人員可以設定網址規則,將部分網址轉送至某一組 VM 虛擬主機,並將其他網址轉送至其他 VM 虛擬主機。

GFE 一律會將網頁請求轉送至距離使用者最近的 VM 虛擬主機群組,但前提是該群組已經具備足夠的處理能力且適合該要求。倘若距離最近的群組處理能力不足,系統會將要求傳送至距離較近且具備充足處理能力的群組進行回應。因此,當管理人員需要組態設定 L7 負載平衡服務時,VM 虛擬主裝必須先屬於某個執行個體群組,然後群組內的 VM 虛擬主機必須運作網頁伺服器擔任後端伺服器才行。

首先,執行下列指令建立 Layer 7 (HTTP) 負載平衡機制範本,透過 MIGs (Managed Instance Groups) 機制,管理人員可以自動調度資源、自動修復、區域 (多可用區) 部署以及自動更新等自動化 MIG 服務,讓工作負載具有可擴充性和高可用性。有關 MIGs 的詳細資訊請參考 Instance groups  |  Compute Engine Documentation  |  Google Cloud 官方文件。

gcloud compute instance-templates create lb-backend-template \ --region=us-west4 \ --network=default \ --subnet=default \ --tags=allow-health-check \ --machine-type=e2-medium \ --image-family=debian-11 \ --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'

依據上述建立的範本,建立名稱為「lb-backend-group」的 MIGs,並建立名稱為「fw-allow-health-check」的防火牆規則。其中,在 Ingress 的部份允許來自 Google Cloud 健康狀態檢查系統的流量 (130.211.0.0/22 和 35.191.0.0/16)

gcloud compute instance-groups managed create lb-backend-group \ --template=lb-backend-template --size=2 --zone=us-west4
gcloud compute firewall-rules create fw-allow-health-check \ --network=default \ --action=allow \ --direction=ingress \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --target-tags=allow-health-check \ --rules=tcp:80


現在,請依序執行下列指令,建立 Layer 7 (HTTP) 負載平衡機制:
  • 組態設定全域靜態外部 IP 位址
    • gcloud compute addresses create lb-ipv4-1 --ip-version=IPV4 --global
    • gcloud compute addresses describe lb-ipv4-1 --format="get(address)" --global
  • 建立健康狀態檢查機制
    • gcloud compute health-checks create http http-basic-check --port 80
  • 建立後端服務
    • gcloud compute backend-services create web-backend-service --protocol=HTTP --port-name=http --health-checks=http-basic-check --global
  • 將 VM 虛擬主機加入至後端服務
    • gcloud compute backend-services add-backend web-backend-service --instance-group=lb-backend-group --instance-group-zone=us-west4-c --global
  • 建立網址對應,以便將連線請求轉送至後端服務
    • gcloud compute url-maps create web-map-http --default-service web-backend-service
  • 建立目標 HTTP Proxy 將連線請求轉送至網址對應
    • gcloud compute target-http-proxies create http-lb-proxy --url-map web-map-http
  • 建立全域轉送規則,將連線請求轉送至 HTTP Proxy
    • gcloud compute forwarding-rules create http-content-rule  --address=lb-ipv4-1 --global --target-http-proxy=http-lb-proxy --ports=80






測試封包轉送規則是否正確運作

現在,L7 負載平衡機制已經設定完成。同樣的,管理人員可以透過 Google Console 管理介面,查看 L7 負載平衡服務的組態設定內容。


查看 lb-backup-group 後端服務的組態設定內容和運作狀態。


確認後端服務運作正常後,開啟瀏覽器進行測試,成功連線的話可以看到後端服務回應的主機是哪一台。


同樣的,在完成實作練習結束前,記得確認是否通過所有的檢查程序,才能確保獲得這個實作課程的積分。


由於這個實作是 Google Cloud Essentials 系列的最後一個實戰項目,所以系統回應你已經完成並取得 Google Cloud Essentials Badge。