概述
在這個教程中,你將會學習 network load balance 與 HTTP load balance 之間的不同,以及如何正確地根據你的應用來設定,讓你的應用在 Google Compute Engine VM 上運行平衡負載的功能。
有好幾種方法可以在Google Cloud Platform 上實施平衡負載。 本教程會帶你走過以下兩種負載器的設定:
學生們會建議自己輸入指令,這對學習核心概念有幫助。 很多教程中,都會有代碼區塊,可以直接複製需要的代碼,你可以很簡單的從代碼區塊複製貼上這些指令到教程中適當的位置。
你將會做什麼
- 設定一個網路平衡負載器
- 設定一個 HTTP(S) 平衡負載器
- 通過實作,學習兩者之間的不同之處
前言
本篇主要是利用 Google 的 Qwiklab 平台學習的同時,做的一份學習筆記
設定及要求
在你按下 Start Lab 按鈕之前
詳讀所有的教學。 Labs 是有時間限制的, 而且你不可以停止時間倒數。 倒數計時器在你按下 Start Lab 按鈕後開始倒數, 上面顯示的時間為你還能使用 Cloud 資源的時間。
Qwiklabs 的手把手環境, 讓你可以在真實環境中來操作進行 Qwiklabs 上提供的課程, 而不是在一個模擬或是展示的環境。 我們透過提供你一個全新的、暫時的帳號密碼, 在計時器歸零之前, 你可以用來登入並存取 Google Cloud Platform。
你需要什麼?
要完成這個 lab, 你需要:
- 一個一般的網路瀏覽器(推薦 Chrome)
- 完成這個 lab 的時間
備註: 如果你已經有你自己的個人 GCP 帳號或專案,請不要使用在這一個 lab
現在你已經開始你的 lab
, 你將會登入 Google Cloud Shell
主控台, 然後開啟命令列工具
如何開始你的 lab, 然後登入 Console?
- 按下 Start Lab 按鈕。 如果你需要付費, 會有一個彈出視窗來讓你選擇付費的方式。 在左方你會看到一個面板, 上面有暫時的帳號密碼, 你必須使用這些帳號密碼在此次 lab
- 複製
username
, 然後點擊Open Google Console
。 Lab 會開啟另外一個視窗, 顯示選擇帳號
的頁面
tip: 開啟一個全新的視窗,然後跟原本的頁面並排
- 在
選擇帳號
頁面, 點擊Use Another Account
- 登入頁面開啟, 貼上之前複製的
username
以及password
, 然後貼上
重要: 必須使用之前於 Connection Details 面板
取得的帳號密碼,不要使用你自己的 Qwiklabs 帳號密碼。 如果你有自己的 GCP 帳號, 請不要用在這裡(避免產生費用)
- 點擊並通過接下來的頁面:
- 接受
terms
以及conditions
- 不要增加
recovery optoins
或two factor authentication
(因為這只是一個臨時帳號) - 不要註冊免費體驗
- 接受
稍待一些時候, GCP 控制台將會在這個視窗開啟。
注意: 按下左上方位於 Google Cloud Platform
隔壁的 Navigation menu
, 你可以瀏覽選單, 裡面有一系列的 GCP 產品以及服務
啟動 Google Cloud Shell
Google Cloud Shell
是載有開發工具的虛擬機器。 它提供了5GB的 home 資料夾, 並且運行在 Google Cloud
上。 Google Cloud Shell
讓你可以利用 command-line 存取 GCP
資源
- 在
GCP 控制台
, 右上的工具列,點擊Open Cloud Shell
按鈕
- 在打開的對話框裡, 按下
START CLOUD SHELL
:
你可以立即按下 START CLOUD SHELL
當對話視窗打開。
連結並提供環境會需要一點時間。 當你連結成功, 這代表你已成功獲得授權, 且此專案已被設為你的專案ID, 例如:
gcloud 是 Google Cloud Platform
的 command-line 工具, 他已事先被安裝在 Cloud Shell
並且支援自動補齊
使用這個 command, 你可以列出有效帳戶名稱:
gcloud auth list |
輸出:
Credentialed accounts: |
範例輸出:
Credentialed accounts: |
你可以使用以下 command 來列出專案 ID
gcloud config list project |
輸出:
[core] |
範例輸出:
[core] |
gcloud
的完整文件可以參閱 Google Cloud gcloud Overview
為你的資源設定預設的 region 以及 zone
- 在 Cloud Shell ,設定預設 zone
gcloud config set compute/zone us-central1-a
- 在 Cloud Shell ,設定預設 region
gcloud config set compute/region us-central1
建立多個 web server instance
為了模擬使用一個群組的機器來服務,我們可以利用 Instance Template 以及 Managed Instance Groups 來創建一個群集的 Nginx web servers 用以服務靜態的內容。 Instance Template 定義了在這個群組中的 virtual machine 的規格( disk, CPUs, memory, 等等)。 Managed Instance Groups 可以初始化多台使用 Instance Template 定義的 virtual machine
要建立一個 Nginx web server 服務群,建立以下事物:
- 一份用來設定所有 virtual machine 上的 Nginx server 的 script
- 一份 instance template 來使用上述的 script
- 一個 target pool
- 一個使用 instance template 的 managed instance group
在 Cloud Shell
中,建立一個使用在所有 VM 上的 startup script
。 這個腳本會在一開始時設定 Nginx server
cat << EOF > startup.sh |
建立使用 startup script 的 instance template
gcloud compute instance-templates create nginx-template \ |
(輸出)
Created [...]. |
建立 target pool 。一個 target pool 將針對所有的群組內的 instance 提供一個存取點,且在之後的平衡負載步驟,這是必須的。
gcloud compute target-pools create nginx-pool |
(輸出)
Created [...]. |
建立一個使用 instance template 的 managed instance group
gcloud compute instance-groups managed create nginx-group \ |
(輸出)
Created [...]. |
這將會建立兩個擁有相同前綴名稱 nginx-的vurtual machine ,需要幾分鐘。
檢視所有已建立的 instances
gcloud compute instances list |
(輸出)
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS |
現在設定防火牆,所以我們可以經由 port 80,EXTERNAL_IP 位址來連接我們的機器
gcloud compute firewall-rules create www-firewall --allow tcp:80 |
現在我們應該要可以經由上述的 external IP 位址連接到任何一台的 instance
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經完成目前的進度,你將獲得一個評價分數。
建立Network Load Balancer
Network Load Balancing 允許我們依據收到的 IP 協議資料,像是位址, port 號,還有協議類型,來平衡負載我們的系統。
我們還可以取得一些 HTTP(S) load balancing 沒有提供的選項,例如說,基於 TCP/UDP 的協議, 像是 SMTP traffic ,且如果你的應用對 TCP 連結相關的特性感興趣的話, Network Load Balacing 也允許你的 app 去檢查封包,這是 HTTP(S) Load Balancing 沒有提供的。
更多資訊,可以參考Setting Up Network Load Balancing
針對我們的 instance ,建立一個 L3 network load balancer
gcloud compute forwarding-rules create nginx-lb \ |
(輸出)
Created [https://www.googleapis.com/compute/v1/projects/...]. |
列出所有 Google Compute Engine 轉發的規則
gcloud compute forwarding-rules list |
(輸出)
NAME REGION IP_ADDRESS IP_PROTOCOL TARGET |
經由瀏覽器來拜訪 load balancerhttp://IP_ADDRESS/
IP_ADDRESS 可從上一個指令輸出中找到
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經完成目前的進度,你將獲得一個評價分數。
建立一個 HTTP(S) Load Balancer
HTTP(S) Load Balancing 提供全球性的所有對我們的 instance 所做的請求。我們可以設定 URL 規則來將某些 URL 導向一些 instance ,而將另一些 URL 導向另外一些 instance 。正常下,請求將會被導向離使用者最近的 instance ,以確保該群組的 instance 有足夠的資源可以提供給使用者。如果被導向的 instance 沒有足夠的資源,那請求將會被導向離使用者最近的並且有足夠資源的 instance
更多資訊可以參考 HTTP(s) Load Balancer in the documentation
首先,建立一個 health check 。 Health check 可以核實 instance 有針對 HTTP 或 HTTPS 通道做回應
gcloud compute http-health-checks create http-basic-check |
(輸出)
Created [https://www.googleapis.com/compute/v1/projects/...]. |
定義一個 HTTP 服務,並且給予我們 instance 使用的 port 號, 現在平衡負載服務已經將流量轉發到指定的 port
gcloud compute instance-groups managed \ |
(輸出)
Updated [https://www.googleapis.com/compute/v1/projects/...]. |
建立 後端服務
gcloud compute backend-services create nginx-backend \ |
(輸出)
Created [https://www.googleapis.com/compute/v1/projects/...]. |
將我們的 instance 群組加到後端服務:
gcloud compute backend-services add-backend nginx-backend \ |
(輸出)
Updated [https://www.googleapis.com/compute/v1/projects/...]. |
建立一個預設的 URL 指定,他將會把所有收到的請求導向我們的 instance
gcloud compute url-maps create web-map \ |
(輸出)
Created [https://www.googleapis.com/compute/v1/projects/...]. |
若要直接將流量基於請求的 URL 不同,導向不同的 instance, 請參考 content-based routing
建立一個 target HTTP proxy 來將請求導向我們的 URL map
gcloud compute target-http-proxies create http-lb-proxy \ |
(輸出)
Created [https://www.googleapis.com/compute/v1/projects/...]. |
建立一個全球轉發規則來處理導向所有收到的請求。一個轉發規則將流量送到指定的 HTTP 或 HTTPS 代理根據請求的 IP 位址, IP 協議,或特定的 port 號。全球轉發規則不支援多個 port
gcloud compute forwarding-rules create http-content-rule \ |
(輸出)
Created [https://www.googleapis.com/compute/v1/projects/...]. |
全球轉發規則建立之後,需要幾分鐘時間生效
gcloud compute forwarding-rules list |
(輸出)
NAME REGION IP_ADDRESS IP_PROTOCOL TARGET |
我們現在應該要可以從瀏覽器經由http://IP_ADDRESS/
來連接,這可能會需要幾分鐘生效。如果無法連接,多等一些時間,重新整理瀏覽器。
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經完成目前的進度,你將獲得一個評價分數。
測試你的理解
下面有多重選擇的問題來鞏固你對本教程概念的理解,盡你所能的回答吧:
答案是 true
恭喜
你已經完成本教程
留言