GCP 網路負載平衡(Network Load Balancing)
核心觀念
什麼是負載平衡?
負載平衡是一種分散技術,用於將進來的網路流量均勻地分配到多個後端伺服器上。它的主要目的是提高系統的可用性、可靠性和效能。
負載平衡的核心優勢:
- 高可用性:當某台伺服器故障時,流量會自動轉向健康的伺服器
- 流量均衡:避免單一伺服器過載
- 故障轉移:健康檢查機制自動偵測和排除故障伺服器
- 無縫擴展:可輕鬆新增或移除伺服器
GCP 網路負載平衡的架構
1 |
|
逐步指令說明與觀念
第一步:設定 GCP 專案和地區
1 |
|
觀念解釋:
- 專案(Project):GCP 中的獨立工作區,所有資源都屬於某個專案
- 地區(Region):地理位置,如 us-central1(美國中部)
- 可用區(Zone):地區內的特定資料中心,如 us-central1-b
- 為什麼重要:設定預設值後,後續命令無需重複指定這些參數
第二步:建立後端伺服器實例
1 |
|
指令參數說明:
參數 | 說明 |
---|---|
--zone |
指定伺服器所在的可用區 |
--tags |
標籤,用於識別和套用防火牆規則 |
--machine-type |
機器類型,e2-small 是低成本的計算實例 |
--image-family |
作業系統映像族系,debian-11 表示 Debian 11 |
--image-project |
映像所屬的專案 |
--metadata=startup-script |
啟動腳本,實例啟動時自動執行 |
啟動腳本的作用:
apt-get update
:更新套件清單apt-get install apache2 -y
:安裝 Apache2 網頁伺服器service apache2 restart
:重啟 Apache 服務- 最後一行:在首頁顯示伺服器識別標記
重複此步驟建立 www2 和 www3,將伺服器標籤改為對應的名稱。
觀念理解:
- 創建多個相同配置的伺服器是負載平衡的基礎
- 啟動腳本自動化了伺服器初始化,確保所有伺服器配置一致
- 標籤用於區分和管理伺服器分組
第三步:建立防火牆規則
1 |
|
參數說明:
參數 | 說明 |
---|---|
--target-tags |
套用規則的標籤,符合此標籤的實例會受該規則限制 |
--allow tcp:80 |
允許 TCP 埠口 80(HTTP)的進入流量 |
觀念理解:
- 防火牆規則是 GCP 的網路安全機制
tcp:80
是 HTTP 協定的標準埠口- 只有標籤為
network-lb-tag
的實例才能接收 80 埠的流量 - 這確保了安全性,只有授權的伺服器可以接收客戶端請求
第四步:建立靜態外部 IP 位址
1 |
|
觀念理解:
- 靜態 IP:不會改變的公開 IP 位址,客戶端可以可靠地訪問此 IP
- 動態 IP:會隨著實例重啟而改變,不適合作為服務端點
- 為什麼需要:提供一個穩定的入口點給所有客戶端連接
第五步:建立健康檢查
1 |
|
預設配置:
- 埠口:80
- 路徑:/
- 協定:HTTP
觀念理解 - 健康檢查的重要性:
健康檢查是負載平衡的核心機制,定期向後端伺服器發送請求檢查其狀態。
1 |
|
健康檢查的工作流程:
- 負載平衡器定期向每台伺服器發送 HTTP GET 請求
- 如果伺服器回應 200 OK,標記為健康
- 如果伺服器無回應或回應錯誤,標記為不健康
- 不健康的伺服器會被暫時移出流量池
- 當伺服器恢復健康時,自動重新加入
第六步:建立目標池
1 |
|
參數說明:
參數 | 說明 |
---|---|
--region |
目標池所在的地區 |
--http-health-check |
關聯的健康檢查名稱 |
觀念理解:
- 目標池(Target Pool):是一個邏輯概念,代表一組要進行負載平衡的後端伺服器
- 為什麼需要:它是轉發規則和實際伺服器之間的橋樑
- 目標池包含伺服器列表和健康檢查政策
第七步:將實例添加到目標池
1 |
|
觀念理解:
- 此命令將三個伺服器實例註冊到目標池
- 目標池現在知道應該將流量分配到這三台伺服器
- 後續可以使用類似命令添加或移除伺服器(用於動態擴展)
第八步:建立轉發規則
1 |
|
參數說明:
參數 | 說明 |
---|---|
--region |
轉發規則所在的地區 |
--ports |
監聽的埠口(80 = HTTP) |
--address |
綁定的靜態公開 IP 位址 |
--target-pool |
目標池名稱 |
觀念理解 - 這是負載平衡的「大腦」:
轉發規則的職責:
- 監聽指定的公開 IP 和埠口(34.57.214.60:80)
- 接收進來的客戶端請求
- 根據負載平衡演算法決定轉發給哪台伺服器
- 將請求轉發到目標池中的伺服器
流量流向:
1 |
|
第九步:查詢轉發規則詳情
1 |
|
輸出重點字段:
字段 | 說明 |
---|---|
IPAddress |
轉發規則綁定的公開 IP |
IPProtocol |
使用的協定(TCP) |
portRange |
監聽的埠口範圍 |
loadBalancingScheme |
負載平衡方案(EXTERNAL = 公開) |
target |
指向的目標池 |
第十步:提取 IP 地址並測試
1 |
|
指令說明:
部分 | 說明 |
---|---|
--format="json" |
以 JSON 格式輸出結果,便於程式化解析 |
jq -r .IPAddress |
使用 jq 工具提取 JSON 中的 IPAddress 字段 |
-m1 |
curl 的 1 秒超時設定 |
while true; do |
無限迴圈,持續發送請求 |
測試結果解釋:
- 正常情況:應該看到來自 www1、www2、www3 的輪詢迴應
- 超時錯誤:可能表示防火牆規則未正確套用或伺服器未就緒
負載平衡演算法
GCP 網路負載平衡器使用以下演算法:
1. 輪詢(Round Robin) - 預設演算法
1 |
|
優點:簡單、公平、適合無狀態應用
2. 會話親和性(Session Affinity) - 可選
同一客戶端的請求總是轉發到同一伺服器,保持會話狀態一致
故障排除指南
問題 | 原因 | 解決方案 |
---|---|---|
Connection timed out | 防火牆規則未應用或標籤不匹配 | 檢查 --target-tags 是否正確 |
無法連接到 IP | 伺服器未完全啟動 | 等待 1-2 分鐘讓啟動腳本完成 |
伺服器不在目標池中 | 實例標籤不匹配 | 使用 --tags 確保標籤一致 |
健康檢查失敗 | Apache 未啟動或埠口錯誤 | 檢查 startup-script 是否正確執行 |
最佳實踐
- 使用標籤分組:便於管理和套用規則
- 定期監控健康檢查:確保後端伺服器狀態正常
- 使用靜態 IP:提供穩定的服務端點
- 設定適當的超時:避免無限等待
- 記錄和監控:使用 Cloud Logging 追蹤流量和錯誤
- 測試故障轉移:模擬伺服器故障測試系統可靠性
進階延伸概念
HTTP(S) 負載平衡 vs 網路負載平衡
- 網路負載平衡(LB):第 4 層(傳輸層),更快速,支援 TCP/UDP
- HTTP(S) 負載平衡:第 7 層(應用層),支援 URL 路由、主機名稱路由
自動擴展(Auto Scaling)
結合負載平衡器與實例組,根據 CPU 使用率自動增加或減少伺服器數量
多地區負載平衡
跨多個地區部署負載平衡器,提供全球高可用性
GCP 網路負載平衡(Network Load Balancing)
https://shengshengyang.github.io/2025/10/18/gcp-load-balance/