本教學課程說明如何透過地區代管執行個體群組使用負載平衡功能,重新導向流量以避開繁忙或無法使用的 VM 執行個體。如此一來,即使區域服務中斷,您還是能確保應用程式的高可用性。
地區代管執行個體群組會在多個區域中的多個執行個體上發布應用程式。全域負載平衡器會透過單一 IP 位址將流量導向多個地區。您可以利用這兩項服務在多個區域中發布應用程式,協助確保即使發生極端情況 (例如區域服務中斷),應用程式仍可供使用。
負載平衡器可用來引導多種類型的流量。本教學課程示範如何建立用於引導外部 HTTP 流量的全域負載平衡器,不過本頁面的大部分內容也適用於其他類型的負載平衡器。如要進一步瞭解負載平衡器可引導的流量類型,請參閱 Cloud Load Balancing 類型一節。
本教學課程說明以下操作的詳細步驟:在地區代管執行個體群組中啟動網頁應用程式、設定網路存取權、建立用於將流量導向網頁應用程式的負載平衡器,以及模擬區域服務中斷的情形,藉此觀察負載平衡器的效用。本教學課程約需 45 分鐘才能完成,但實際情況視您使用這些功能的經驗而定。
目標
- 在地區代管執行個體群組上啟動示範網頁應用程式。
- 設定全域負載平衡器,將 HTTP 流量導向多個區域。
- 模擬區域服務中斷的情形,藉此觀察負載平衡器發揮的效果。
費用
In this document, you use the following billable components of Google Cloud:
- Compute Engine
To generate a cost estimate based on your projected usage,
use the pricing calculator.
事前準備
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
應用程式架構
應用程式包含以下 Compute Engine 元件:
- 虛擬私有雲網路: Google Cloud 中的虛擬網路,可透過自身的路徑和防火牆規則提供全域連線能力。
- 防火牆規則: Google Cloud防火牆可讓您允許或拒絕流向執行個體的流量。
- 執行個體範本:此範本是用於在代管執行個體群組中建立每個 VM 執行個體。
- 地區代管執行個體群組:在多個區域中執行相同應用程式的一組 VM 執行個體。
- 全域靜態外部 IP 位址:此靜態 IP 位址可透過外部網路存取,且可附加至全域資源。
- 全域負載平衡器:可將後端執行個體分散在多個地區中的負載平衡器。如果您的使用者需要存取相同的應用程式和內容,而且您想使用單一 Anycast IP 位址提供存取權時,請使用全域負載平衡器。
- 健康狀態檢查:負載平衡器會運用此政策評估應用程式在每個 VM 執行個體上的回應速度。
啟動網頁應用程式
本教學課程使用儲存在 GitHub 上的網頁應用程式。如要進一步瞭解應用程式的實作方式,請參閱 GitHub 上的 GoogleCloudPlatform/python-docs-samples 存放區。
在執行個體範本中加入開機指令碼,就能在執行個體群組中的每個 VM 上啟動網頁應用程式。此外,讓執行個體群組在專屬的 VPC 網路中執行,可防止本教學課程的防火牆規則干擾在專案中執行的任何現有資源。
建立虛擬私人雲端網路
使用虛擬私人雲端網路可保護專案中的現有資源,使資源不受您在本教學課程中建立的資源影響。此外,您還須透過虛擬私人雲端網路限制連入流量,使流量必須通過負載平衡器。
建立虛擬私人雲端網路以封裝示範網頁應用程式的防火牆規則:
在 Google Cloud 控制台中,前往「虛擬私有雲網路」頁面。
按一下「建立虛擬私有雲網路」。
在「Name」(名稱) 下方輸入
web-app-vpc
。將「Subnet creation mode」(子網路建立模式) 設為 [Automatic] (自動)。
按一下頁面底部的 [Create] (建立)。
等待 VPC 網路建立完成後再繼續操作。
建立防火牆規則
建立 VPC 網路後,請設定防火牆規則,允許 HTTP 流量傳入 VPC 網路:
在 Google Cloud 控制台中,前往「防火牆」頁面。
點按「建立防火牆規則」。
在「Name」(名稱) 欄位中輸入
allow-web-app-http
。將「Network」(網路) 設為
web-app-vpc
。在「Targets」(目標) 下,選取 [All instances in the network] (網路中的所有執行個體)。
將「Source filter」(來源篩選器) 設定為
IPv4 ranges
。在「Source IP ranges」(來源 IP 範圍) 下方輸入
0.0.0.0/0
,以允許存取所有 IP 位址。在「Protocols and ports」(通訊協定和通訊埠) 下方,執行下列操作:
- 選取「Specified protocols and ports」。
- 選取「TCP」。
- 在「Ports」欄位中輸入
80
,允許存取 HTTP 流量。
按一下 [建立]。
建立執行個體範本
建立範本,以便用來建立一組 VM 執行個體。每個利用範本建立的執行個體,都會透過開機指令碼啟動示範網頁應用程式。
前往 Google Cloud 控制台的「Instance templates」(執行個體範本) 頁面。
點選「建立執行個體範本」。
在「Name」(名稱) 下方輸入
load-balancing-web-app-template
。在「Machine configuration」(機器設定) 下,將「Machine type」(機器類型) 設為
e2-micro
。在「Firewall」(防火牆) 下,選取 [Allow HTTP traffic] (允許 HTTP 流量)。
展開「Advanced options」(進階選項) 區段。
展開「管理」部分。
在「Automation」(自動化) 專區中,輸入以下開機指令碼:
sudo apt update && sudo apt -y install git gunicorn3 python3-pip git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git cd python-docs-samples/compute/managed-instances/demo sudo pip3 install -r requirements.txt sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon
當 VM 執行個體啟動時,指令碼會取得、安裝並啟動網頁應用程式。
展開「Networking」(網路) 區段。
在「Network interfaces」部分,按一下「Add a network interface」,然後選取網路
web-app-vpc
。這會強制使用此範本建立的每個執行個體都在先前建立的網路上執行。按一下 [建立]。
請等候範本建立完成後再繼續操作。
建立地區代管執行個體群組
如要執行網頁應用程式,請使用執行個體範本建立地區代管執行個體群組:
前往 Google Cloud 控制台的「Instance groups」(執行個體群組) 頁面。
點選「建立執行個體群組」。
選取「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。
在「Name」(名稱) 中輸入
load-balancing-web-app-group
。在「Instance template」(執行個體範本) 中選取
load-balancing-web-app-template
。將「Number of instances」設為
6
。如果這個欄位已停用,請先關閉自動調整大小功能。在「Location」(位置) 中,選取「Multiple zones」(多可用區)。
在「Region」(區域) 中,選取「us-central1」。
在「區域」中,從下拉式清單中選取下列區域:
- us-central1-b
- us-central1-c
- us-central1-f
選取「允許執行個體重新分配」。
針對「Autoscaling mode」(自動調度資源模式),選取「Off: do not autoscale」(關閉:不自動調度資源)。
按一下「建立」,系統就會將您重新導向至「Instance groups」(執行個體群組) 頁面。
如何確認您的執行個體是以正確的方式執行示範網頁應用程式:
- 在「Instance groups」(執行個體群組) 頁面上,按一下
load-balancing-web-app-group
以查看該群組中的執行個體。 在「External IP」(外部 IP) 下,按一下 IP 位址以連線至該執行個體。新的瀏覽器分頁隨即開啟,並顯示示範網頁應用程式:
完成後,關閉示範網頁應用程式的瀏覽器分頁。
- 在「Instance groups」(執行個體群組) 頁面上,按一下
設定負載平衡器
如要使用負載平衡器將流量導向網頁應用程式,您必須保留外部 IP 位址以接收所有連入流量。接下來,請建立負載平衡器,以便接受來自該 IP 位址的流量,並將流量重新導向至執行個體群組。
保留靜態 IP 位址
使用全域靜態外部 IP 位址,替負載平衡器提供單一進入點,以便接收所有使用者流量。即使您變更或刪除任何相關聯的 Google Cloud 資源,Compute Engine 也會保留靜態 IP 位址。如此一來,即使網頁應用程式的其他部分可能有所變更,網頁應用程式仍具有相同的進入點。
前往 Google Cloud 控制台的「IP 位址」頁面。
按一下「保留外部靜態 IP 位址」。
在「Name」(名稱) 欄位中輸入
web-app-ipv4
。將「IP version」(IP 版本) 設為「IPv4」。
將「Type」(類型) 設為「Global」(通用)。
按一下 [Reserve] (保留)。
建立負載平衡器
本節說明建立全域負載平衡器的所需步驟,藉此引導 HTTP 流量。
這類負載平衡器會使用前端接收連入流量,也會透過後端將這類流量分配至健康狀態良好的執行個體。負載平衡器是由多個元件組成,因此這項工作分成下列幾個部分:
- 後端設定
- 前端設定
- 檢查並完成
完成所有步驟以建立負載平衡器。
開始設定
在 Google Cloud 控制台中,前往「Load balancing」(負載平衡) 頁面。
- 點選「建立負載平衡器」。
- 在「Type of load balancer」(負載平衡器類型)部分,選取「Application Load Balancer (HTTP/HTTPS)」(應用程式負載平衡器 (HTTP/HTTPS)),然後點選「Next」(下一步)。
- 在「公開或內部」部分,選取「公開 (外部)」,然後點選「下一步」。
- 在「全域或單一區域部署」部分,選取「最適合全域工作負載」,然後點選「Next」。
- 在「Load balancer generation」(負載平衡器代別) 部分,選取「Global external Application Load Balancer」(全域外部應用程式負載平衡器),然後點選「Next」(下一步)。
- 按一下 [設定]。
基本設定
- 在「負載平衡器名稱」中輸入
web-app-load-balancer
。
後端設定
- 在「Create global external Application Load Balancer」(建立全域外部應用程式負載平衡器) 頁面的左側面板中,按一下「Backend configuration」(後端設定)。
- 按一下 [Create or select backend services & backend buckets] (建立或選擇後端服務與後端值區),以開啟下拉式選單。按一下 [Backend services] (後端服務),然後按一下 [Create a backend service] (建立後端服務)。
- 在新視窗中,在後端應用程式的「Name」(名稱) 中輸入
web-app-backend
。 - 將「Instance group」(執行個體群組) 設為
load-balancing-web-app-group
。 - 將「Port numbers」(通訊埠編號) 設為
80
,即可在負載平衡器和執行個體群組之間傳送 HTTP 流量。 - 在「Balancing mode」(平衡模式) 下,選取 [Utilization] (使用率)。
- 按一下 [Done] (完成) 即可建立後端。
針對負載平衡器的後端建立健康狀態檢查:
- 在「Health check」(健康狀態檢查) 下的下拉式選單中,選取 [Create a health check] (建立健康狀態檢查) (或 [Create another health check] (建立另一個健康狀態檢查))。系統隨即會開啟新視窗。
- 在新視窗的「Name」(名稱) 下方輸入
web-app-load-balancer-check
。 - 將「Protocol」(通訊協定) 設為 [HTTP]。
- 在「Port」(通訊埠) 下方輸入
80
。 - 在本教學課程中,將「Request path」(要求路徑) 設為
/health
,也就是示範網頁應用程式設定要回應的路徑。 設定下列「Health criteria」(健康狀態判定條件):
- 將「Check interval」(檢查時間間隔) 設定為
3
秒。這項設定會定義從一次探測開始到下一次探測開始之間的時間間隔。 - 將「Timeout」(逾時間隔) 設定為
3
秒。這項設定可定義 Google Cloud 等待探測回應的時間長度。這個值必須小於或等於檢查時間間隔。 - 將「Healthy Threshold」(良好健康狀態判定門檻) 設為連續
2
次通過健康狀態檢查。這項設定會定義將執行個體的健康狀態判定為良好時,必須成功執行的連續探測次數。 - 將「Unhealthy Threshold」(不良健康狀態判定門檻) 設為連續
2
次健康狀態檢查未通過。這項設定會定義將執行個體的健康狀態判定為不良時,探測必須連續失敗的次數。
- 將「Check interval」(檢查時間間隔) 設定為
按一下 [Save and continue] (儲存並繼續) 以建立健康狀態檢查。
按一下 [Create] (建立) 即可建立後端服務。
前端設定
- 在「Create global external Application Load Balancer」(建立全域外部應用程式負載平衡器)頁面的左側面板中,按一下「Frontend configuration」(前端設定)。
- 在「Frontend configuration」(前端設定) 頁面的「Name」(名稱) 下方輸入
web-app-ipv4-frontend
。 - 將「Protocol」(通訊協定) 設為
HTTP
。 - 將「IP version」(IP 版本) 設為
IPv4
。 - 將「IP address」(IP 位址) 設為
web-app-ipv4
。 - 將「Port」(通訊埠) 設為
80
。 - 按一下 [Done] (完成) 即可建立前端。
檢查並完成
先驗證負載平衡設定,然後再建立負載平衡器:
- 在「Create global external Application Load Balancer」(建立全域外部應用程式負載平衡器)頁面的左側面板中,按一下「Review and finalize」(檢查並完成)。
在「Review and finalize」(檢查並完成) 頁面上,確認下列「Backend」(後端) 設定:
- 「Backend service」(後端服務) 為
web-app-backend
。 - 「Endpoint protocol」(端點通訊協定) 為
HTTP
。 - 「Health check」(健康狀態檢查) 為
web-app-load-balancer-check
。 - 「Instance group」(執行個體群組) 為
load-balancing-web-app-group
。
- 「Backend service」(後端服務) 為
在同一個頁面上,確認「Frontend」(前端) 使用「Protocol」(通訊協定) 為
HTTP
的 IP 位址。
在「Create global external Application Load Balancer」(建立全域外部應用程式負載平衡器) 頁面的左側面板中,按一下「Create」(建立),完成負載平衡器的建立作業。
您可能需要稍候幾分鐘,等待系統完成負載平衡器的建立作業。
模擬區域服務中斷的情況
您可以模擬因區域服務中斷而導致服務廣泛無法使用的情況,藉此觀察負載平衡器的功能。這項模擬作業會強制位於指定區域中的所有執行個體在 /health
要求路徑中回報健康狀態不良。當執行個體回報健康狀態不良時,就不會通過負載平衡器的健康狀態檢查,系統會提示負載平衡器停止將流量導向這些執行個體。
監控負載平衡器將流量導向哪些區域。
前往 Google Cloud 控制台中的 Cloud Shell。
Cloud Shell 會在 Google Cloud 控制台的窗格中開啟。工作階段可能要幾秒鐘才能完成初始化。
儲存負載平衡器的靜態外部 IP 位址:
在終端機中輸入下列指令,取得負載平衡器前端轉送規則的外部 IP 位址:
gcloud compute forwarding-rules describe web-app-ipv4-frontend --global
從輸出內容複製
EXTERNAl_IP_ADDRESS
:IPAddress: EXTERNAl_IP_ADDRESS ...
建立本機 bash 變數:
export LOAD_BALANCER_IP=EXTERNAl_IP_ADDRESS
其中
EXTERNAl_IP_ADDRESS
是您複製的外部 IP 位址。
如要監控負載平衡器將流量導向哪些區域,請執行下列 bash 指令碼:
while true do BODY=$(curl -s "$LOAD_BALANCER_IP") NAME=$(echo -n "$BODY" | grep "load-balancing-web-app-group" | perl -pe 's/.+?load-balancing-web-app-group-(.+?)<.+/\1/') ZONE=$(echo -n "$BODY" | grep "us-" | perl -pe 's/.+?(us-.+?)<.+/\1/') echo $ZONE done
這個指令碼會持續嘗試透過負載平衡器前端的 IP 位址連線至網頁應用程式,並針對每個連線,於輸出結果顯示網頁應用程式的執行區域。
輸出結果應包含
us-central1-b
、us-central1-c
和us-central1-f
區域:us-central1-f us-central1-b us-central1-c us-central1-f us-central1-f us-central1-c us-central1-f us-central1-c us-central1-c
請將這個終端機保持為開啟狀態。
監控程式執行時,請開始模擬區域服務中斷的情形。
- 在 Cloud Shell 中,按一下 開啟第二個終端機工作階段。 「Add」按鈕,即可
針對專案 ID 建立本機 bash 變數:
export PROJECT_ID=PROJECT_ID
其中,
PROJECT_ID
是您目前專案的專案 ID,會顯示在 Cloud Shell 的每一新行中:user@cloudshell:~ (PROJECT_ID)$
針對您想停用的區域建立本機 bash 變數。如要模擬
us-central1-f
區域發生故障的情形,請使用下列指令:export DISABLE_ZONE=us-central1-f
接下來,請執行下列 bash 指令碼。這個指令碼會使已停用區域中的示範網頁應用程式執行個體,向負載平衡器健康狀態檢查輸出健康狀態不良的回應。健康狀態不良的回應會提示負載平衡器引導流量避開這些執行個體。
export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --filter="zone:($DISABLE_ZONE)" --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "load-balancing-web-app-group") for i in $MACHINES; do NAME=$(echo "$i" | cut -f1 -d,) IP=$(echo "$i" | cut -f2 -d,) echo "Simulating zonal failure for zone $DISABLE_ZONE, instance $NAME" curl -q -s "http://$IP/makeUnhealthy" >/dev/null --retry 2 done
經過短暫延遲後,負載平衡器會停止將流量導向健康狀態不良的區域,因此第一個終端機視窗的輸出內容將不再列出
us-central1-f
區域:us-central1-c us-central1-c us-central1-c us-central1-b us-central1-b us-central1-c us-central1-b us-central1-c us-central1-c
這表示負載平衡器僅將流量導向健康狀態良好且有回應的執行個體。
請將兩個終端機保持為開啟狀態。
在第二部終端機中,請為要復原的區域建立本機 bash 變數。如要恢復將流量導向
us-central1-f
區域,請使用下列指令:export ENABLE_ZONE=us-central1-f
接下來,請執行下列 bash 指令碼。這個指令碼會使已啟用區域中的示範網頁應用程式執行個體,向負載平衡器健康狀態檢查輸出健康狀態良好的回應。健康狀態良好的回應會提示負載平衡器開始再次分配流量到這些執行個體。
export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --filter="zone:($ENABLE_ZONE)" --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "load-balancing-web-app-group") for i in $MACHINES; do NAME=$(echo "$i" | cut -f1 -d,) IP=$(echo "$i" | cut -f2 -d,) echo "Simulating zonal restoration for zone $ENABLE_ZONE, instance $NAME" curl -q -s "http://$IP/makeHealthy" >/dev/null --retry 2 done
經過幾分鐘後,第一個終端機視窗的輸出內容會漸漸地再次列出
us-central1-f
區域:us-central1-b us-central1-b us-central1-c us-central1-f us-central1-c us-central1-c us-central1-b us-central1-c us-central1-f
這表示負載平衡器正在將連入流量再次導向到所有區域。
完成後,請關閉兩個終端機。
(選用) 限制連入流量
建立地區代管執行個體群組時,您可以透過群組的外部臨時 IP 位址直接存取每個執行個體。不過,您現在已經準備好負載平衡器和靜態外部 IP 位址,建議您修改網路防火牆,以確保連入流量「必須」通過負載平衡器。
如要要將連入流量侷限在負載平衡器,請修改網路防火牆,停用每個執行個體的臨時外部 IP 位址。
編輯防火牆規則以限制 HTTP 流量,讓網頁應用程式只能透過負載平衡器存取:
在 Google Cloud 控制台中,前往「防火牆」頁面。
在「Name」(名稱) 下,按一下
allow-web-app-http
。按一下 [Edit] (編輯)。
將「Source IP ranges」(來源 IP 範圍) 修改為僅允許健康狀態檢查探測:
- 刪除
0.0.0.0/0
。 - 在同一行輸入
130.211.0.0/22
,然後按下 Tab 鍵。 - 在同一行輸入
35.191.0.0/16
,然後按下 Tab 鍵。
- 刪除
按一下 [儲存]。
確認您無法透過特定執行個體的臨時外部 IP 位址連線至網頁應用程式:
前往 Google Cloud 控制台的「Instance groups」(執行個體群組) 頁面。
按一下
load-balancing-web-app-group
以查看該群組中的執行個體。在「External IP」(外部 IP) 下,按一下 IP 位址以連線至該執行個體。新的瀏覽器分頁隨即開啟,但網頁應用程式不會開啟 (頁面最終會顯示逾時錯誤)。
完成後,請關閉執行個體的瀏覽器分頁。
確認您可以使用負載平衡器連線至網頁應用程式:
在 Google Cloud 控制台中,前往「Load balancing」(負載平衡) 頁面。
在「Name」(名稱) 下,按一下
web-app-load-balancer
來展開您剛建立的負載平衡器。如要透過外部靜態 IP 位址連線至網頁應用程式,請查看「Frontend」(前端) 和「IP:Port」(IP:通訊埠) 下的內容,然後複製 IP 位址。接下來,請開啟新的瀏覽器分頁,並將 IP 位址貼到網址列。畫面上應該會出現示範網頁應用程式:
請注意,每當您重新整理頁面時,負載平衡器就會連線至不同區域中的不同執行個體。您並非直接連線至執行個體,所以才會發生這個情況。您連線的是負載平衡器,此平衡器選取了將您重新導向的目標執行個體。
完成後,關閉示範網頁應用程式的瀏覽器分頁。
清除所用資源
完成教學課程後,您可以清除所建立的資源,這樣資源就不會占用配額並產生費用。下列各節將說明如何刪除或關閉這些資源。
如果您為本教學課程特地建立了專案,請刪除這整個專案。不過,專案如有您想保留的資源,可以只刪除您在本教學課程中建立的資源。
刪除專案
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
刪除特定資源
刪除負載平衡器
在 Google Cloud 控制台中,前往「Load balancing」(負載平衡) 頁面。
勾選
web-app-load-balancer
旁邊的核取方塊。按一下頁面頂端的
「刪除」。在新開啟的視窗中,選取所有核取方塊,然後按一下 [Delete load balancer and selected resources] (刪除負載平衡器和選取的資源) 以確認刪除作業。
刪除靜態外部 IP 位址
前往 Google Cloud 控制台的「External IP addresses」(外部 IP 位址) 頁面。
勾選
web-app-ipv4
旁邊的核取方塊。按一下頁面頂端的
「Release static address」。在新開啟的視窗中,按一下 [Delete] (刪除) 以確認刪除作業。
刪除執行個體群組
- In the Google Cloud console, go to the Instance groups page.
-
Select the checkbox for
your
load-balancing-web-app-group
instance group. - To delete the instance group, click Delete.
刪除執行個體範本
前往 Google Cloud 控制台的「Instance Templates」(執行個體範本) 頁面。
勾選
load-balancing-web-app-template
旁邊的核取方塊。按一下頁面頂端的
「刪除」。在新開啟的視窗中,按一下 [Delete] (刪除) 以確認刪除作業。
刪除 VPC 網路
在 Google Cloud 控制台中,前往「虛擬私有雲網路」頁面。
按一下「
web-app-vpc
」。按一下頁面頂端的
「刪除」。在新開啟的視窗中,按一下 [Delete] (刪除) 以確認刪除作業。
後續步驟
- 瀏覽其他教學課程:
- 進一步瞭解代管執行個體群組。
- 進一步瞭解負載平衡。
- 進一步瞭解如何透過負載平衡改善應用程式延遲狀況。
- 進一步瞭解如何設計完善可靠的系統。
- 進一步瞭解如何在 Google Cloud上建立可擴充且有彈性的網路應用程式。