本教學課程說明如何透過地區代管執行個體群組使用負載平衡功能,重新導向流量以避開繁忙或無法使用的 VM 執行個體。如此一來,即使區域服務中斷,您還是能確保應用程式的高可用性。
地區代管執行個體群組會在多個區域中的多個執行個體上發布應用程式。全域負載平衡器會透過單一 IP 位址將流量導向多個地區。您可以利用這兩項服務在多個區域中發布應用程式,協助確保即使發生極端情況 (例如區域服務中斷),應用程式仍可供使用。
負載平衡器可用來引導多種類型的流量。本教學課程示範如何建立用於引導外部 HTTP 流量的全域負載平衡器,不過本頁面的大部分內容也適用於其他類型的負載平衡器。如要進一步瞭解負載平衡器可引導的流量類型,請參閱 Cloud Load Balancing 類型一節。
本教學課程說明以下操作的詳細步驟:在地區代管執行個體群組中啟動網頁應用程式、設定網路存取權、建立用於將流量導向網頁應用程式的負載平衡器,以及模擬區域服務中斷的情形,藉此觀察負載平衡器的效用。本教學課程約需 45 分鐘才能完成,但實際情況視您使用這些功能的經驗而定。
應用程式架構
應用程式包含以下 Compute Engine 元件:
- 虛擬私有雲網路: Google Cloud 中的虛擬網路,可透過自身的路徑和防火牆規則提供全域連線能力。
- 防火牆規則: Google Cloud防火牆可讓您允許或拒絕流向執行個體的流量。
- 執行個體範本:此範本是用於在代管執行個體群組中建立每個 VM 執行個體。
- 地區代管執行個體群組:在多個區域中執行相同應用程式的一組 VM 執行個體。
- 全域靜態外部 IP 位址:此靜態 IP 位址可透過外部網路存取,且可附加至全域資源。
- 全域負載平衡器:可將後端執行個體分散在多個地區中的負載平衡器。如果您的使用者需要存取相同的應用程式和內容,而且您想使用單一 Anycast IP 位址提供存取權時,請使用全域負載平衡器。
- 健康狀態檢查:負載平衡器會運用此政策評估應用程式在每個 VM 執行個體上的回應速度。
啟動網頁應用程式
本教學課程使用儲存在 GitHub 上的網頁應用程式。如要進一步瞭解應用程式的實作方式,請參閱 GitHub 上的 GoogleCloudPlatform/python-docs-samples 存放區。
在執行個體範本中加入開機指令碼,就能在執行個體群組中的每個 VM 上啟動網頁應用程式。此外,讓執行個體群組在專屬的 VPC 網路中執行,可防止本教學課程的防火牆規則干擾在專案中執行的任何現有資源。
Create a VPC network
使用虛擬私人雲端網路可保護專案中的現有資源,使資源不受您在本教學課程中建立的資源影響。此外,您還須透過虛擬私人雲端網路限制連入流量,使流量必須通過負載平衡器。
建立虛擬私人雲端網路以封裝示範網頁應用程式的防火牆規則:
- 在 Google Cloud 控制台中,前往「VPC networks」(虛擬私有雲網路) 頁面。 
- 按一下「建立虛擬私有雲網路」。 
- 在「Name」(名稱) 下方輸入 - web-app-vpc。
- 將「Subnet creation mode」(子網路建立模式) 設為「Custom」(自訂)。 
- 建立新子網路的步驟如下: - 在「Subnets」部分中,設定「Name」欄位,輸入 web-app-vpc-subnet。
- 在「Region」(區域) 下拉式選單中,選取「us-central1」。
- 確認「IP 堆疊類型」選項已設為「IPv4」。
- 在「主要 IPv4 範圍」部分,輸入 IPv4 範圍 10.2.0.0/24。
 
- 在「Subnets」部分中,設定「Name」欄位,輸入 
- 按一下頁面底部的 [Create] (建立)。 
等待虛擬私有雲網路建立完成後再繼續操作。
建立防火牆規則
建立虛擬私人雲端網路後,請設定防火牆規則,允許 HTTP 流量傳入虛擬私人雲端網路:
- 前往 Google Cloud 控制台的「Firewalls」(防火牆) 頁面。 
- 按一下「Create firewall rule」(建立防火牆規則)。 
- 在「Name」(名稱) 欄位中輸入 - allow-web-app-http。
- 將「Network」(網路) 設為 - web-app-vpc。
- 確認下列選項已設為指定的值: - 「Direction of traffic」(流量方向) 選項設為「Ingress」(輸入)。
- 「Action on match」(相符時執行的動作) 選項設為「Allow」(允許)。
 
- 在「Targets」(目標) 下拉式選單中,選取「All instances in the network」(網路中的所有執行個體)。 
- 將「Source filter」(來源篩選器) 設為 - IPv4 ranges。
- 在「Source IP ranges」(來源 IP 範圍) 欄位中輸入 - 130.211.0.0/22, 35.191.0.0/16,允許負載平衡器健康狀態檢查。
- 在「通訊協定和通訊埠」下方,執行下列操作: - 選取「指定的通訊協定和通訊埠」。
- 選取「TCP」TCP。
- 在「Ports」(通訊埠) 欄位中輸入 80,允許存取 HTTP 流量。
 
- 點選「建立」。 
建立執行個體範本
建立範本,以便用來建立一組 VM 執行個體。每個利用範本建立的執行個體,都會透過開機指令碼啟動示範網頁應用程式。
- 前往 Google Cloud 控制台的「Instance Templates」(執行個體範本) 頁面。 
- 點選「建立執行個體範本」。 
- 在「Name」(名稱) 下方輸入 - load-balancing-web-app-template。
- 在「Machine configuration」(機器設定) 下,將「Machine type」(機器類型) 設為 - e2-medium。
- 按一下「進階選項」部分展開。 
- 按一下「Networking」(網路) 區段,然後執行下列操作: - 在「網路介面」部分,按一下現有網路介面旁邊的 圖示,即可刪除這些介面。
- 按一下「新增網路介面」,然後選取網路 web-app-vpc。這會強制使用此範本建立的每個執行個體都在先前建立的網路上執行。
- 在「Subnetwork」(子網路) 下拉式選單中,選取 web-app-vpc-subnet。
- 按一下 [完成]。
 
- 按一下「管理」部分,然後執行下列操作: - 在「Automation」(自動化) 專區中,輸入以下開機指令碼: - apt-get update apt-get -y install git python3-pip python3-venv git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git python3 -m venv venv ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt ./venv/bin/pip3 install gunicorn ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo - VM 執行個體啟動時,指令碼會取得、安裝並啟動網頁應用程式。 
 
- 保留其他選項的預設值。 
- 點選「建立」。 
請等待範本建立完成後再繼續操作。
建立地區代管執行個體群組
如要執行網頁應用程式,請使用執行個體範本建立地區代管執行個體群組:
- 前往 Google Cloud 控制台的「Instance groups」(執行個體群組) 頁面。 
- 點選「建立執行個體群組」。 
- 在「Name」(名稱) 中輸入 - load-balancing-web-app-group。
- 在「Instance template」(執行個體範本) 中選取 - load-balancing-web-app-template。
- 將「Number of instances」(執行個體數量) 設為 - 6。如果這個欄位已停用,請先關閉自動調度功能。- 如要關閉自動調度資源功能,請前往「自動調度資源」部分。在「Autoscaling mode」(自動調度資源模式) 下拉式選單中,選取「Off: do not autoscale」(關閉:不自動調度資源)。 
- 在「Location」(位置) 中選取「Multiple zones」(多可用區)。 
- 在「Region」(區域) 中,選取「us-central1」。 
- 在「區域」部分,從下拉式清單中選取下列區域: - us-central1-b
- us-central1-c
- us-central1-f
 
- 保留其他選項的預設值。 
- 點按「Create」(建立)。系統就會將您重新導向至「Instance groups」(執行個體群組) 頁面。 - 您可能需要稍候幾分鐘,等待群組中的所有執行個體都在執行。 
設定負載平衡器
如要使用負載平衡器將流量導向網頁應用程式,您必須保留外部 IP 位址以接收所有連入流量。接下來,請建立負載平衡器,以便接受來自該 IP 位址的流量,並將流量重新導向至執行個體群組。
保留靜態 IP 位址
使用全域靜態外部 IP 位址,替負載平衡器提供單一進入點,以便接收所有使用者流量。即使您變更或刪除任何相關聯的 Google Cloud 資源,Compute Engine 也會保留靜態 IP 位址。如此一來,即使網頁應用程式的其他部分可能有所變更,網頁應用程式仍具有相同的進入點。
- 前往 Google Cloud 控制台的「IP addresses」(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」(下一步)。
- 在「公開或內部」部分選取「公開 (外部)」,接著點選「下一步」。
- 在「Global or single region deployment」(全域或單一區域部署) 部分,選取「Best for global workloads」(最適合全域工作負載),然後點選「Next」(下一步)。
- 在「Load balancer generation」(負載平衡器代別) 部分,選取「Global external Application Load Balancer」(全域外部應用程式負載平衡器),然後點選「Next」(下一步)。
- 按一下 [設定]。
為負載平衡器命名
- 在左側面板的「Load balancer name」(負載平衡器名稱) 中,輸入 web-app-load-balancer。
設定前端
- 在「Frontend configuration」(前端設定) 頁面的「Name」(名稱) 下方輸入 web-app-ipv4-frontend。
- 將「Protocol」(通訊協定) 設為 HTTP。
- 將「IP version」(IP 版本) 設為 IPv4。
- 將「IP address」(IP 位址) 設為 web-app-ipv4。
- 將「Port」(通訊埠) 設為 80。
- 按一下 [Done] (完成) 即可建立前端。
設定後端
- 按一下左側面板中的「後端設定」。
- 按一下「後端服務和後端值區」下拉式選單開啟選單,然後按一下「建立後端服務」。
- 在新視窗中,在後端服務的「Name」(名稱) 中輸入 web-app-backend。
- 在「Backends」(後端) 部分執行下列操作:
- 將「Instance group」(執行個體群組) 設為 load-balancing-web-app-group。
- 將「Port numbers」(通訊埠編號) 設為 80,即可在負載平衡器和執行個體群組之間傳送 HTTP 流量。
- 在「Balancing mode」(平衡模式) 下,選取 [Utilization] (使用率)。
- 按一下 [完成]。
 
- 將「Instance group」(執行個體群組) 設為 
- 針對負載平衡器的後端建立健康狀態檢查,如下所示: - 按一下「健康狀態檢查」下拉式選單,然後按一下「建立健康狀態檢查」。系統隨即會開啟新視窗。
- 在新視窗的「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」(檢查時間間隔) 設定為 
- 按一下 [Create] (建立),建立健康狀態檢查。 
 
- 保留其他選項的預設值。 
- 點選「建立」即可建立後端服務。 
檢查並完成
先驗證負載平衡設定,然後再建立負載平衡器:
- 在「建立全域外部應用程式負載平衡器」頁面的左側面板上,按一下「檢查並完成」。
- 在「Review and finalize」(檢查並完成) 頁面上,確認「Frontend」(前端) 使用「Protocol」(通訊協定) 為 - HTTP的 IP 位址。
- 在同一頁面上,確認下列「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」(後端服務) 為 
- 按一下「建立」,完成負載平衡器建立程序。 
您可能需要稍候幾分鐘,等待系統完成負載平衡器的建立作業。
測試負載平衡器
確認您可以透過負載平衡器連線至網頁應用程式,方法如下:
- 前往 Google Cloud 控制台的「Load balancing」(負載平衡)頁面。 
- 在「Name」(名稱) 欄中,按一下 - web-app-load-balancer來展開您剛建立的負載平衡器。
- 如要使用外部靜態 IP 位址連線至網頁應用程式,請按照下列步驟操作: - 在「Frontend」(前端) 部分中,複製「IP:Port」(IP:通訊埠) 欄中顯示的 IP 位址。
- 開啟新的瀏覽器分頁,並將 IP 位址貼到網址列。畫面上應該會出現示範網頁應用程式:  
 - 請注意,每當您重新整理頁面時,負載平衡器就會連線至不同區域中的不同執行個體。您並非直接連線至執行個體,所以才會發生這個情況。您連線的是負載平衡器,此平衡器選取了將您重新導向的目標執行個體。 - 完成後,關閉示範網頁應用程式的瀏覽器分頁。 
模擬區域服務中斷的情況
您可以模擬因區域服務中斷而導致服務廣泛無法使用的情況,藉此觀察負載平衡器的功能。這項模擬作業會強制位於指定區域中的所有執行個體在 /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 sleep 2 # Wait for 2 seconds 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 中,按一下「新增」按鈕即可開啟第二個終端機工作階段。
- 針對專案 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 - 這表示負載平衡器正在將連入流量再次導向到所有區域。 - 完成後,請關閉這兩個終端機。