文章段落
在《GCP – Cloud Load Balancing 之分類與選擇》一文中,我們介紹了各種 GCP Load Balancer 的選擇標準,而這次將深入介紹 GCP HTTP(S) Load Balancer 這款負載平衡器。如果對 GCP Load Balancer 的種類及架構還不熟悉,可先閱讀《什麼是負載平衡?原理、6大 GCP Load Balancer 完整介紹》這篇介紹。
GCP HTTP(S) Load Balancer 可以讓多個網域,或同個網域但不同路徑,都指向同一個Load Balancer,再依照URL去分流到不同目的地。詳情可看以下文章:
https://cloud.google.com/load-balancing/docs/url-map
因為分流是依照URL,而 Public DNS需額外去購買,所以為了節省相關費用和設定上的方便,可用 Internal Load Balancer 和 Cloud DNS 的 Private Zone 來設定DNS,如果要看網頁是否生效,就在GCP同一個subnet來建立VM,透過內部IP去確認即可。
建立2台要分流的主機
先建立一台VM名為ap1,在zone a:

作業系統選擇 Ubuntu:

網路的部分,內部IP不用管,外部IP則是因為你要先讓 Ubuntu 安裝 Apache,所以先暫時用一下外部IP。

防火牆的部分,針對要開放的協定來勾選

第二台依此類推:

直接點選SSH就可以連線

更新可安裝的package列表

安裝apache

我們直接點 External IP就能打開網頁

但是如果看到這個

是因為你點擊時,它帶的是 HTTPS 的協定,你要手動把 URL中的”S”拿掉,例如
這樣才能看到歡迎頁面:

接下來更改主頁內容,以利分辨目前造訪的VM是AP1還是AP2.

更改這裡:

改完重新整理頁面,會看到網頁更新了:

AP2也一樣:

如果把外部IP拿掉,也可以在GCP內建一台Linux VM使用CURL去內部IP確認:

建立 Cloud DNS Private Zone
接下來去 Cloud DNS
建立一個 Private Zone,在這裡你想要用什麼 Domain 都可以,我取名 aaronweb.com

接下來建立Record也很簡單,直接輸入主機名稱和對應的IP就好,真的跟外部DNS代管廠商的頁面差不多:

第二台的DNS

用一台內網的Windows VM去連連看。
AP1可以連:

AP2也可以連,超快就設好,簡單到我很驚訝!

建立 Instance Group
接下來我們要把VM建成 Unmanaged Instance Group:

另一個ap2也是,就不多放截圖。

另外有一個東西要先建,叫做 Name Port,也要在 instance group建,點擊Edit:

注意要展開隱藏選單,Add item:

Port Name取個簡單易懂的名字就好

ap2也照做

建立 Internal HTTP Load Balancer
接下來要建 Internal HTTP Load Balancer,碰到要建 Proxy-only subnet的要求,它是 Internal HTTP Load Balancer 特有的一個 proxy,它會依照 URL Map的描述來判斷進來的 request 要導向哪裡去,詳細文章可以看這裡:
https://cloud.google.com/load-balancing/docs/l7-internal/proxy-only-subnets

看一下現有的subnet,找一段不會重疊的IP Range:

建一段10.141.0.20/24:

想說沒有重疊到就沒關係,但是:

因為default VPC Network佔了 10.120.0.0/9 非常大的IP Range,如果要避免重疊,乾脆把整個 VPC 直接從default轉custom

轉換VPC Network前的警告:

接下來建 Load Balancer:

因為是內部的,要選 Only between my VMs:

成功建立 proxy-subnet 了:

接下來進入後端,選擇 ig-ap1 這個instance group,來建立backend service

然後也要建立 Health Check:

確認後建立 Health Check:

第二個也是:

接下來的Routing Rules是分流的關鍵:

接著建立 Frontend:

建好之後,會取得Frontend IP,那我們再去Cloud DNS ,把原本指向 VM IP的記錄改成指向 Frontend IP。

變這樣
(PS.我建2個Frontend IP是為了其他用途,正常情況一個IP就好)

這樣就完成了!
測試分流效果
接下來測試,把 ap1和ap2的外部IP拿掉,然後用一台Windows VM,直接在瀏覽器輸入網址:

再確認第二台:

看到2台VM在Load Balance後面依照網址進行分流,這樣就代表 Load Balance 分流成功了。
以上是這次的分享,完整的 Internal HTTP(S) Load Balancer 概念大家可以參考以下文章:《Internal HTTP(S) Load Balancing overview》。而如果針對負載平衡或 GCP 有任何想詢問的內容,也都可以直接聯繫我們喔!
▋延伸閱讀:
・什麼是負載平衡?原理、6大 GCP Load Balancer 完整介紹
・[ GCP 教學] 打造彈性、快速且安全的雲端基本服務架構 – 負載平衡 Load Balancer 和 Instance Group
・在 GCP Load Balancer 上設定 logging 以及 monitoring 功能 – TCP Load Balancer dashboard & Email 告警設定教學
・如何透過 GCP HTTP(S) Load Balancing 來實現 HTTP Redirect HTTPS
・GCP – Cloud Load Balancing 之分類與選擇
