設定 Network 以及 HTTP 平衡負載器

概述

在這個教程中,你將會學習 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 optoinstwo 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, 例如:

gcloudGoogle Cloud Platform 的 command-line 工具, 他已事先被安裝在 Cloud Shell 並且支援自動補齊

使用這個 command, 你可以列出有效帳戶名稱:

gcloud auth list

輸出:

Credentialed accounts:
- <myaccount>@<mydomain>.com (active)

範例輸出:

Credentialed accounts:
- google1623327_student@qwiklabs.net

你可以使用以下 command 來列出專案 ID

gcloud config list project

輸出:

[core]
project = <project_ID>

範例輸出:

[core]
project = qwiklabs-gcp-44776a13dea667a6

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
#! /bin/bash
apt-get update
apt-get install -y nginx
service nginx start
sed -i -- 's/nginx/Google Cloud Platform - '"\$HOSTNAME"'/' /var/www/html/index.nginx-debian.html
EOF

建立使用 startup script 的 instance template

gcloud compute instance-templates create nginx-template \
--metadata-from-file startup-script=startup.sh

(輸出)

Created [...].
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP
nginx-template n1-standard-1 2015-11-09T08:44:59.007-08:00

建立 target pool 。一個 target pool 將針對所有的群組內的 instance 提供一個存取點,且在之後的平衡負載步驟,這是必須的。

gcloud compute target-pools create nginx-pool

(輸出)

Created [...].
NAME REGION SESSION_AFFINITY BACKUP HEALTH_CHECKS
nginx-pool us-central1

建立一個使用 instance template 的 managed instance group

gcloud compute instance-groups managed create nginx-group \
--base-instance-name nginx \
--size 2 \
--template nginx-template \
--target-pool nginx-pool

(輸出)

Created [...].
NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED
nginx-group us-central1-a zone nginx 0 2 nginx-template no

這將會建立兩個擁有相同前綴名稱 nginx-的vurtual machine ,需要幾分鐘。


檢視所有已建立的 instances

gcloud compute instances list

(輸出)

NAME       ZONE           MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
nginx-7wvi us-central1-a n1-standard-1 10.240.X.X X.X.X.X RUNNING
nginx-9mwd us-central1-a n1-standard-1 10.240.X.X X.X.X.X RUNNING

現在設定防火牆,所以我們可以經由 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 \
--region us-central1 \
--ports=80 \
--target-pool nginx-pool

(輸出)

Created [https://www.googleapis.com/compute/v1/projects/...].

列出所有 Google Compute Engine 轉發的規則

gcloud compute forwarding-rules list

(輸出)

NAME     REGION       IP_ADDRESS     IP_PROTOCOL TARGET
nginx-lb us-central1 X.X.X.X TCP us-central1/targetPools/nginx-pool

經由瀏覽器來拜訪 load balancer
http://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/...].
NAME HOST PORT REQUEST_PATH
http-basic-check 80 /

定義一個 HTTP 服務,並且給予我們 instance 使用的 port 號, 現在平衡負載服務已經將流量轉發到指定的 port

gcloud compute instance-groups managed \
set-named-ports nginx-group \
--named-ports http:80

(輸出)

Updated [https://www.googleapis.com/compute/v1/projects/...].

建立 後端服務

gcloud compute backend-services create nginx-backend \
--protocol HTTP --http-health-checks http-basic-check --global

(輸出)

Created [https://www.googleapis.com/compute/v1/projects/...].
NAME BACKENDS PROTOCOL
nginx-backend HTTP

將我們的 instance 群組加到後端服務:

gcloud compute backend-services add-backend nginx-backend \
--instance-group nginx-group \
--instance-group-zone us-central1-a \
--global

(輸出)

Updated [https://www.googleapis.com/compute/v1/projects/...].

建立一個預設的 URL 指定,他將會把所有收到的請求導向我們的 instance

gcloud compute url-maps create web-map \
--default-service nginx-backend

(輸出)

Created [https://www.googleapis.com/compute/v1/projects/...].
NAME DEFAULT_SERVICE
Web-map nginx-backend

若要直接將流量基於請求的 URL 不同,導向不同的 instance, 請參考 content-based routing

建立一個 target HTTP proxy 來將請求導向我們的 URL map

gcloud compute target-http-proxies create http-lb-proxy \
--url-map web-map

(輸出)

Created [https://www.googleapis.com/compute/v1/projects/...].
NAME URL_MAP
http-lb-proxy web-map

建立一個全球轉發規則來處理導向所有收到的請求。一個轉發規則將流量送到指定的 HTTP 或 HTTPS 代理根據請求的 IP 位址, IP 協議,或特定的 port 號。全球轉發規則不支援多個 port

gcloud compute forwarding-rules create http-content-rule \
--global \
--target-http-proxy http-lb-proxy \
--ports 80

(輸出)

Created [https://www.googleapis.com/compute/v1/projects/...].

全球轉發規則建立之後,需要幾分鐘時間生效

gcloud compute forwarding-rules list

(輸出)

NAME              REGION IP_ADDRESS    IP_PROTOCOL TARGET
http-content-rule X.X.X.X TCP http-lb-proxy
nginx-lb us-central1 X.X.X.X TCP us-central1/....

我們現在應該要可以從瀏覽器經由http://IP_ADDRESS/來連接,這可能會需要幾分鐘生效。如果無法連接,多等一些時間,重新整理瀏覽器。

測試進度

點擊 Check my progress 來確認目前的進度。如果你已經完成目前的進度,你將獲得一個評價分數。




測試你的理解

下面有多重選擇的問題來鞏固你對本教程概念的理解,盡你所能的回答吧:

答案是 true




恭喜

你已經完成本教程

使用 Laravel 儲存並重新縮放圖片大小 Cloud Shell 及 Gcloud 簡介!

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×