文章段落
很多人開始用雲端之後,就是把它當成傳統機房,一台一台開來用,但其實只是看不到實體機,所有動作都是透過網頁或遠端連線操作完成而已,雖然少了實體機房設備的維運,但仍然沒有充份利用雲端的優勢。
雲端帶給人們最大的優勢,就是快速、彈性和安全性,那底要如何發揮這三項優勢呢?這裡提供一個 GCP 基本架構給大家參考,就是 Load Balancer 和 Instance Group:

我們先準備好一組自動擴展的機器,也就是執行個體群組 (Instance Group),當使用者流量從最前端的負載平衡進來,接著把前端流量導到不同的機器,如果流量突然變大,後端機器無法負荷的時候,Instance Group 就會自動加開機器,由負載平衡自動把流量導流到新機器上,這樣原有的機器就不會因為負載過重而崩潰。
以下我們就開始吧!
建立執行個體範本 Instance Group
準備執行個體範本,做法和開 VM 一樣,步驟如下:
有關 VM 怎麼開,可參考《開 GCP VM 要注意什麼?Compute Engine 開機詳細教學》。

為範本取名,然後設定機器規格:

作業系統 Debian 10,允許 HTTP 流量,最重要的是要點開進階設定頁面:

在管理頁面會看到 Startup script,我們要在這裡寫東西:

Startup script 就是建立 VM 的時候,在開機完成時先自動執行一些指令,有點像當年 DOS 系統的 AUTOEXEC.BAT 開機執行檔。唉呀曝露我的年齡啊~沒關係我有一顆年輕的心!
如果你有把環境設定,或是架站的相關軟體、相依性套件或要部署的網站程式碼準備好,就可以寫指令在開 VM 時自動裝好,立即上線服務。就不用像上面提的, VM 一台一台開起來,再一台一台裝環境,再部署程式碼,太累了……。
在這裡我們貼上準備好的 script ,它其實就是自動裝好 apache ,並且寫一張網頁:

程式碼在這:
#! /bin/bash
apt-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World from Aaron at Cloud Ace!</h1>
<p>This page was created from a simple startup script!</p>
</body></html>
EOF
其他不用調整,直接按 Create 吧!

它不是真的開機器,所以很快,幾秒就完成了!

再補充一下,除了 startup script 以外,使用 image 來做 template 會更好,尤其是你的系統環境超複雜的時候,每次開 VM 都要花半天才能上線的情況,用 image 可以幫你省下更多時間。
建立執行個體群組 Instance Group
真的要開機器了!

先取個名字為 aaron-web,之後的 VM 名字會自動帶 aaron-web-xxx。然後找一個 Zone 來開 VM。

我們選擇剛建好的 instance template,注意 Autoscale 模式一定要啟動。下方有一個 CPU 使用率 60%,表示 VM 很忙,忙到 CPU 使用率超過 60% 時,它就再開一台新的 VM 來幫忙服務。但我們稍候會做 Load Balancer ,它會有一個健康狀態檢查 Health Check ,會比較重要喔,這裡保持預設就好。

Cool Down Period 指的是,如果機器數量上來了,過一陣子之後,使用者變少了,那你開那麼多台機器,要不要自動刪除,這裡保持預設值。
再來就是重點了,你最小要幾台,最多要幾台。雖然會自動刪除,但因為錢錢的關係,還是要設一個上限,總不能讓它無止境開個100台吧!在這裡我們設5台就好。

最重要的地方來了,Health check

這個 Health Check 一定要設定,如果沒有就必須建立一個。
這裡取好名字,設定要檢查的是 HTTP Port 80,要跟上面的 Apache 服務一致,才能檢查到喔!

檢查的規則,例如 10 秒鐘檢查一次,每次等 5 秒看有沒有正常回應,如果連續2次正常,就判斷為健康,如果連續3次不正常,就判斷不健康。這裡也保持預設。
這是為了要告訴前端的 Load Balance :「我這台機器快掛了,流量先去別台吧!」
類似本店客滿,請去隔壁吃飯的概念。如果你開餐廳總不希望客戶真的去隔壁吃飯,所以要趕快生出幾間包廂,讓客戶都進來吃。

還有一點點要設(不要急啊),Initial delay 指的是新的 VM 開機也要等,畢竟開機用的 CPU 很多,不要一開就判斷為不健康,所以你可以等久一點,例如 300 秒。
再來是,如果要讓 Health Check 可以運作,你要設定防火牆讓它可以去檢查你的機器喔!很多人在這一段都會忘記,然後 Load Balance 建好一直看不到 Health Check 的綠色勾勾,搞很久都不知道原因在哪裡,我是說我啦!

我們先把群組建起來,等等去設定防火牆也沒關係喔!

最後可以在主機頁面看到一台 VM ,上面有一個外部 IP,可以直接點擊它。

你會看到已經做好的歡迎頁面,這就是剛剛的 Startup Script 幫你做的事情喔!

建立防火牆允許健康狀態檢查 Health Check
從選單 VPC Network 進去找到 Firewall

取個名字,在這裡盡可能把名字寫完整,以利一眼辨識這一條防火牆規則的功用。



建立負載平衡 Load Balancer
接下來終於到主角 Load Balancer 出場了,快來看看怎麼設定:

點擊建立 Load Balancer

因為我建的是 Web 服務,走 HTTP ,所以就選 HTTP(S) Load Balancing。如果你要建立 HTTPS 的服務,記得要準備好網域,在建立的過程把憑證放上去喔!

因為流量是從外部進來,所以選擇 From Internet to my VMs

你會看到選擇後端服務 Backend services & backend buckets,後端服務可以接 Instance Group,而它也可以接 Cloud Storage Bucket,如果你的網站是靜態的,你其實可以直接把 HTML 檔放在 Bucket 裡面,根本就不用 Web Server 或是開任何機器來服務,非常省錢啊!!

建立後端服務 Backend Service,一樣先取名字。

選擇前面建好的 Instance Group ,Port 選80,其他保持預設,就可以按下 Done和 Create。

Health check 也選擇之前建好的,如果需要記錄的話,就把 Logging 勾起來。

你會看到目前完成的狀態,再點擊 Frontend configuration。

這裡是要指定一個 IP ,如果還沒有 IP ,也可以當場建立一個,像我早已準備好了嘿嘿!(明明就是上次測試的時候忘記釋放掉,各位不要像我一樣總是犯那些常見的低級錯誤啊!!)

按下 Done 之後,應該會看到設定好的畫面,最後按一下 Review and finalize。

因為設定很多,要看一下是否設定正確,Backend services 的圈圈會一直在轉,是正常的,如果都沒問題,可以直接按下 Create。

接下來就靜待偉大的 Load Balancer 建立完成吧!真是令人興奮啊!!
確認 Load Balencer 啟動
速度很快,在我上一句話才打完字,它就出現了綠色勾勾,可見 Google 的負載平衡反應迅速,難怪再大的流量都不怕。

我們點擊 aaron-lb 進去看看,裡面有一個 Load Balance IP

我們直接複製它,貼到瀏覽器上來看看:

太棒了,代表 Load Balance 有把我的訪問導到後端建立的 Web 服務上喔!
對 Load Balance 和 Instance Group 做壓力測試
又想開始想那些有的沒的了,沒錯,現在就是要送一堆流量,看看到底它們能不能撐得住!
點擊右上角的 Cloud Shell

安裝 siege 指令
sudo apt-get -y install siege

裝完馬上就可以測試了,真是無比興奮啊!!
測試指令 siege -c 250 http://[Load_Balance_IP]
準備…3…2…1…發射!!
siege -c 250 http://[Load_Balance_IP]

開始送流量了,因為我的機器很小,所以很快就撐不住,Health Check 馬上就檢查到機器不行了,就趕快去加開機器。
大概1分鐘的時間,1台機器瞬間變成4台了!

每個 IP 都點進去看一下,證明我不是開假的機器~
果然都是依照我原有的範本,Autoscale 出來的!

回來看一下整個 instance group 的流量

Siege 一打下去流量(藍線)真的飆高,後來機器為了回應,回傳的流量(紅線)也起來了。
再看一下 Autoscale 的狀態,使用率(紅線)超過 Capacity,就會馬上加開機器,讓使用率保持在 Capacity 可承受的量之下。

好了,以上的過程,讓我們可以看到整個 GCP 基本的網路服務架構,任何進來的流量一律經過 Load Balancer,再分流到後端的機器,也能夠承受惡意的流量攻擊例如 DDoS;如果機器資源不夠,就會自動擴充以支援前端的需求,待前端流量退去,機器也能夠自動刪減,節省不必要的成本。
因此,GCP 基本的快速、彈性和安全性都有初步達成,這只是基本的喔,未來會再深入了解更進階的功能,達到更強的快速、彈性跟安全性。
對了,建立完成後,記得要刪掉相關服務,尤其是靜態 IP 喔!
參考文件:
https://cloud.google.com/load-balancing/docs/load-balancing-overview?hl=zh-tw