本指南說明如何部署內部直通式網路負載平衡器,並使用區域性網路端點群組 (NEG) 後端。區域 NEG 為區域資源,代表單一子網路中 Google Cloud 資源的 IP 位址或 IP 位址/通訊埠組合集合。您可以使用 NEG 建立 IP 位址的邏輯群組,或代表「軟體服務」的 IP 位址/通訊埠組合,而非整個 VM。
在您按照本指南操作之前,請先熟悉以下內容:
內部直通式網路負載平衡器僅支援使用 GCE_VM_IP
端點的可用區 NEG。
權限
如要按照本指南操作,您必須在專案中建立執行個體和修改網路,因此您必須是專案擁有者或編輯者,或是應具有以下所有 Compute Engine 身分與存取權管理角色:
工作 | 必要角色 |
---|---|
建立網路、子網路和負載平衡器元件 | 網路管理員 |
新增與移除防火牆規則 | 安全性管理員 |
建立執行個體 | Compute 執行個體管理員 |
詳情請參閱下列指南:
設定總覽
本指南說明如何設定及測試內部直通式網路負載平衡器,並使用 GCE_VM_IP
可用區 NEG 後端。本節中的步驟說明如何設定下列項目:
- 範例虛擬私有雲網路 (名稱為
lb-network
),其中包含自訂子網路 - 允許連入連線到後端 VM 的防火牆規則
- 四個 VM:
- 區域
us-west1-a
中的 VMvm-a1
和vm-a2
- 區域
us-west1-c
中的 VMvm-c1
和vm-c2
- 區域
- 兩個後端區域 NEG,
neg-a
位於區域us-west1-a
,neg-c
位於區域us-west1-c
。每個 NEG 都會有下列端點:neg-a
包含以下兩個端點:- VM
vm-a1
的內部 IP 位址 - VM
vm-a2
的內部 IP 位址
- VM
neg-c
包含以下兩個端點:- VM
vm-c1
的內部 IP 位址 - VM
vm-c2
的內部 IP 位址
- VM
us-west1-a
中用於測試連線的一個用戶端 VM (vm-client
)- 以下內部直通式網路負載平衡器元件:
us-west1
地區中的一個內部後端服務,用於管理兩個區域性 NEG 之間的連線分配- 一個用於負載平衡器前端的內部轉送規則和內部 IP 位址
這個範例的架構如下所示:
設定網路、地區和子網路
本頁所述的內部直通式網路負載平衡器範例,是在名為 lb-network
的自訂模式 VPC 網路中建立。
本範例的後端 VM、區域 NEG 和負載平衡器元件位於這個地區和子網路:
- 區域:
us-west1
- 子網路:
lb-subnet
,主要 IP 位址範圍為10.1.2.0/24
如要建立範例網路和子網路,請按照以下步驟操作。
主控台
- 前往 Google Cloud 控制台的「VPC networks」(虛擬私有雲網路) 頁面。
前往「VPC network」(虛擬私有雲網路) 頁面 - 按一下「建立虛擬私有雲網路」。
- 輸入
lb-network
的「Name」。 - 在「Subnets」(子網路) 區段中:
- 將「Subnet creation mode」(子網路建立模式) 設為 [Custom] (自訂)。
- 在「New subnet」(新的子網路) 區段中,輸入以下資訊:
- Name (名稱):
lb-subnet
- Region (區域):
us-west1
- IP address range (IP 位址範圍):
10.1.2.0/24
- 按一下 [完成]。
- Name (名稱):
- 按一下 [建立]。
gcloud
建立自訂虛擬私人雲端網路:
gcloud compute networks create lb-network --subnet-mode=custom
- 在
lb-network
網路中,為us-west1
區域中的後端 VM 建立子網路:
gcloud compute networks subnets create lb-subnet \ --network=lb-network \ --range=10.1.2.0/24 \ --region=us-west1
- 在
設定防火牆規則
這個範例使用以下防火牆規則:
fw-allow-lb-access
:輸入規則,適用於虛擬私人雲端網路中的所有目標,允許來源在10.1.2.0/24
範圍內的流量。這項規則允許來自lb-subnet
的任何用戶端的連入流量。fw-allow-ssh
:輸入規則,適用於要進行負載平衡的執行個體,可在 TCP 通訊埠 22 上允許來自任何位址的連入 SSH 連線。您可以為這項規則選擇較嚴格的來源 IP 範圍;例如,您可以僅指定要從其中啟動 SSH 工作階段之系統的 IP 範圍。本範例使用目標標記allow-ssh
來識別應套用此規則的 VM。
如果沒有這些防火牆規則,預設拒絕輸入規則將會封鎖傳入至後端執行個體的流量。
主控台
- 在 Google Cloud 控制台中,前往「Firewall policies」(防火牆政策) 頁面。
前往「防火牆政策」頁面 - 按一下「Create firewall rule」(建立防火牆規則),然後輸入以下資訊,以建立允許子網路流量的規則:
- Name (名稱):
fw-allow-lb-access
- Network (網路):
lb-network
- Priority (優先順序):
1000
- 「Direction of traffic」(流量方向):[ingress] (輸入)
- 「Action on match」(相符時執行的動作):[allow] (允許)
- 「Targets」(目標):[All instances in the network] (網路中的所有執行個體)
- 來源篩選器:IPv4 範圍
- Source IPv4 ranges (來源 IPv4 範圍):
10.1.2.0/24
- 「Protocols and ports」(通訊協定和通訊埠):[Allow all] (全部允許)
- Name (名稱):
- 按一下 [建立]。
- 再次按一下「Create firewall rule」(建立防火牆規則),建立允許連入 SSH 連線的規則:
- Name (名稱):
fw-allow-ssh
- Network (網路):
lb-network
- Priority (優先順序):
1000
- 「Direction of traffic」(流量方向):[ingress] (輸入)
- 「Action on match」(相符時執行的動作):[allow] (允許)
- 「Target」(目標):指定的目標標記
- 「Target tags」(目標標記):
allow-ssh
- 來源篩選器:IPv4 範圍
- Source IPv4 ranges (來源 IPv4 範圍):
0.0.0.0/0
- 「Protocols and ports」(通訊協定和通訊埠):選擇「Specified protocols and ports」(指定的通訊協定和通訊埠),然後輸入
tcp:22
。
- Name (名稱):
- 按一下 [建立]。
- 第三次按一下「Create firewall rule」(建立防火牆規則),以建立允許Google Cloud 健康檢查的規則:
- Name (名稱):
fw-allow-health-check
- Network (網路):
lb-network
- Priority (優先順序):
1000
- 「Direction of traffic」(流量方向):[ingress] (輸入)
- 「Action on match」(相符時執行的動作):[allow] (允許)
- 「Target」(目標):指定的目標標記
- 「Target tags」(目標標記):
allow-health-check
- 來源篩選器:IPv4 範圍
- Source IPv4 ranges (來源 IPv4 範圍):
130.211.0.0/22
和35.191.0.0/16
- 「Protocols and ports」(通訊協定和通訊埠):[Allow all] (全部允許)
- Name (名稱):
- 按一下 [建立]。
gcloud
建立
fw-allow-lb-access
防火牆規則,允許與子網路進行通訊:gcloud compute firewall-rules create fw-allow-lb-access \ --network=lb-network \ --action=allow \ --direction=ingress \ --source-ranges=10.1.2.0/24 \ --rules=tcp,udp,icmp
建立
fw-allow-ssh
防火牆規則,允許與具有allow-ssh
網路標記的 VM 建立 SSH 連線。若省略source-ranges
,Google Cloud 會將規則解讀為任何來源。gcloud compute firewall-rules create fw-allow-ssh \ --network=lb-network \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
建立
fw-allow-health-check
規則,允許 Google Cloud健康狀態檢查。gcloud compute firewall-rules create fw-allow-health-check \ --network=lb-network \ --action=allow \ --direction=ingress \ --target-tags=allow-health-check \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --rules=tcp,udp,icmp
建立 NEG 後端
為了示範內部直通式網路負載平衡器的區域性質,這個範例會在 us-west1-a
和 us-
west1-c
可用區中使用兩個可用區 NEG 後端 neg-a
和 neg-c
。流量會在兩個 NEG 之間,以及每個 NEG 內的端點之間進行負載平衡。
建立 VM
為了支援這個範例,四個 VM 各自會執行 Apache 網路伺服器,用於監聽下列 TCP 通訊埠:80、8008、8080、8088、443 和 8443。
每個 VM 都會獲指派 lb-subnet
中的內部 IP 位址和臨時外部 (公開) IP 位址。您可以稍後移除外部 IP 位址。
後端 VM 不需要外部 IP 位址,但在本例中,外部 IP 位址很實用,因為它們允許 VM 從網際網路下載 Apache,並且讓您透過 SSH 進行連線。根據預設,Apache 會設定為繫結至任何 IP 位址。內部直通式網路負載平衡器會透過保留目的地 IP 來傳遞封包。
請確認在 VM 上執行的伺服器軟體正在監聽負載平衡器內部轉送規則的 IP 位址。
為方便說明,這些後端 VM 會執行 Debian GNU Linux 10。
主控台
建立 VM
- 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
前往「VM instances」(VM 執行個體) 頁面 - 使用下列的名稱和區域組合,重複以下步驟來建立四個 VM。
- 名稱:
vm-a1
,區域:us-west1-a
- 名稱:
vm-a2
,區域:us-west1-a
- 名稱:
vm-c1
,區域:us-west1-c
- 名稱:
vm-c2
,區域:us-west1-c
- 名稱:
- 點選「建立執行個體」。
- 按照步驟 2 指定的名稱設定「Name」(名稱)。
- 在「Region」(區域) 中選擇
us-west1
,然後選擇步驟 2 列出的「Zone」(可用區)。 - 在「Boot disk」(開機磁碟) 專區中,確認已為開機磁碟選項選取「Debian GNU/Linux 12 (bookworm)」。如有需要,請按一下「Choose」(選擇),以變更圖片。
按一下「進階選項」,然後進行下列變更:
- 按一下「Networking」(網路),然後新增下列「Network tags」(網路標記):
allow-ssh
和allow-health-check
- 按一下「Network interfaces」下方的「Edit」圖示
- Network (網路):
lb-network
- Subnet (子網路):
lb-subnet
- 「Primary internal IP」(主要內部 IP):臨時 (自動)
- External IP (外部 IP):臨時
,進行下列變更,然後按一下「Done」:
- Network (網路):
按一下 [Management] (管理)。在「Startup script」(開機指令碼) 欄位中,複製並貼上下列指令碼內容。四個 VM 的指令碼內容完全相同:
#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed
- 按一下「Networking」(網路),然後新增下列「Network tags」(網路標記):
按一下 [建立]。
gcloud
使用下列四個 [VM-NAME]
和 [ZONE]
組合,透過執行以下指令四次來建立四個 VM。四個 VM 的指令碼內容完全相同。
vm-a1
的[VM-NAME]
和us-west1-a
的[ZONE]
vm-a2
的[VM-NAME]
和us-west1-a
的[ZONE]
vm-c1
的[VM-NAME]
和us-west1-c
的[ZONE]
vm-c2
的[VM-NAME]
和us-west1-c
的[ZONE]
gcloud compute instances create VM-NAME \ --zone=ZONE \ --image-family=debian-12 \ --image-project=debian-cloud \ --tags=allow-ssh,allow-health-check \ --subnet=lb-subnet \ --metadata=startup-script='#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed'
建立 GCE_VM_IP
可用區 NEG
NEG (neg-a
和 neg-c
) 必須與在前一個步驟中建立的 VM 位於相同區域。
主控台
如何建立可用區網路端點群組:
- 前往 Google Cloud 控制台的「Network Endpoint Groups」(網路端點群組) 頁面。
前往「Network Endpoint Groups」(網路端點群組) 頁面 - 按一下「建立網路端點群組」。
- 輸入可用區性 NEG 的「名稱」:
neg-a
。 - 選取「網路端點群組類型」:「網路端點群組 (區域性)」。
- 選取「Network」(網路):lb-network
- 選取「子網路」:lb-subnet
- 選取「Zone」(區域):us-west1-a
- 按一下 [建立]。
- 重複上述步驟,在 us-west1-c 區域中建立第二個名為
neg-c
的區域 NEG。
將端點新增至區域性 NEG:
- 前往 Google Cloud 控制台的「Network Endpoint Groups」(網路端點群組) 頁面。
前往「Network endpoint groups」(網路端點群組) - 按一下前一個步驟建立的第一個網路端點群組的「名稱」 (neg-a)。畫面上即會顯示「Network endpoint group details」(網路端點群組詳細資料) 頁面。
在「Network endpoints in this group」(這個群組中的網路端點) 區段中,按一下 [Add network endpoint] (新增網路端點]。畫面上即會出現「Add network endpoint」(新增網路端點) 頁面。
- 按一下「VM instance」(VM 執行個體),然後選取「vm-a1」,將其內部 IP 位址新增為網路端點。
- 按一下 [建立]。
- 再次按一下「Add network endpoint」(新增網路端點),然後在「VM instance」(VM 執行個體) 下方選取「vm-a2」。
- 按一下 [建立]。
按一下前一個步驟建立的第二個網路端點群組的「名稱」 (neg-c)。畫面上即會顯示「Network endpoint group details」(網路端點群組詳細資料) 頁面。
在「Network endpoints in this group」(這個群組中的網路端點) 區段中,按一下 [Add network endpoint] (新增網路端點]。畫面上即會出現「Add network endpoint」(新增網路端點) 頁面。
- 按一下「VM 執行個體」,然後選取「vm-c1」,將其內部 IP 位址新增為網路端點。
- 按一下 [建立]。
- 再次按一下「Add network endpoint」(新增網路端點),然後在「VM instance」(VM 執行個體) 下方選取「vm-c2」。
- 按一下 [建立]。
gcloud
使用
gcloud compute network-endpoint-groups create
指令,在us-west1-a
中建立名為neg-a
的GCE_VM_IP
區域 NEG:gcloud compute network-endpoint-groups create neg-a \ --network-endpoint-type=gce-vm-ip \ --zone=us-west1-a \ --network=lb-network \ --subnet=lb-subnet
新增端點至
neg-a
:gcloud compute network-endpoint-groups update neg-a \ --zone=us-west1-a \ --add-endpoint='instance=vm-a1' \ --add-endpoint='instance=vm-a2'
使用
gcloud compute network-endpoint-groups create
指令,在us-west1-c
中建立名為neg-c
的GCE_VM_IP
區域 NEG:gcloud compute network-endpoint-groups create neg-c \ --network-endpoint-type=gce-vm-ip \ --zone=us-west1-c \ --network=lb-network \ --subnet=lb-subnet
新增端點至
neg-c
:gcloud compute network-endpoint-groups update neg-c \ --zone=us-west1-c \ --add-endpoint='instance=vm-c1' \ --add-endpoint='instance=vm-c2'
設定負載平衡器元件
以下步驟會設定所有內部直通式網路負載平衡器元件:
後端服務:在這個範例中,您需要透過負載平衡器傳送 HTTP 流量。因此,您必須使用 TCP,而非 UDP。
轉送規則:這個範例會建立一個內部轉送規則。
內部 IP 位址:在這個範例中,您需要在建立轉送規則時指定內部 IP 位址
10.1.2.99
。
主控台
gcloud
建立新的區域 HTTP 健康狀態檢查。
gcloud compute health-checks create http hc-http-80 \ --region=us-west1 \ --port=80
建立後端服務:
gcloud compute backend-services create bs-ilb \ --load-balancing-scheme=internal \ --protocol=tcp \ --region=us-west1 \ --health-checks=hc-http-80 \ --health-checks-region=us-west1
將兩個區域 NEG
neg-a
和neg-c
新增至後端服務:gcloud compute backend-services add-backend bs-ilb \ --region=us-west1 \ --network-endpoint-group=neg-a \ --network-endpoint-group-zone=us-west1-a
gcloud compute backend-services add-backend bs-ilb \ --region=us-west1 \ --network-endpoint-group=neg-c \ --network-endpoint-group-zone=us-west1-c
為後端服務建立轉送規則。建立轉送規則時,請為子網路中的內部 IP 指定
10.1.2.99
。gcloud compute forwarding-rules create fr-ilb \ --region=us-west1 \ --load-balancing-scheme=internal \ --network=lb-network \ --subnet=lb-subnet \ --address=10.1.2.99 \ --ip-protocol=TCP \ --ports=80,8008,8080,8088 \ --backend-service=bs-ilb \ --backend-service-region=us-west1
測試負載平衡器
這項測試會從不同的用戶端 VM 與負載平衡器聯絡;也就是說,不是從負載平衡器的後端 VM 進行聯絡。預期的行為是要在四個後端 VM 之間分配流量,因為尚未設定工作階段相依性。
建立測試用戶端 VM
本範例會在與後端 (伺服器) VM 相同的地區中建立用戶端 VM (vm-client
)。該用戶端用於驗證負載平衡器的設定,以及示範「測試」一節中所述的預期行為。
主控台
- 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
前往「VM instances」(VM 執行個體) 頁面 - 點選「建立執行個體」。
- 將「Name」(名稱) 設為
vm-client
。 - 將「可用區」設為
us-west1-a
。 - 按一下「進階選項」,然後進行以下變更:
- 按一下「Networking」(網路),然後將
allow-ssh
新增至「Network tags」(網路標記)。 - 按一下「Network interfaces」下方的編輯按鈕,進行下列變更,然後按一下「Done」:
- Network (網路):
lb-network
- Subnet (子網路):
lb-subnet
- 「Primary internal IP」(主要內部 IP):臨時 (自動)
- 「External IP」(外部 IP):[Ephemeral] (臨時)
- Network (網路):
- 按一下「Networking」(網路),然後將
- 按一下 [建立]。
gcloud
用戶端 VM 可以位於與負載平衡器相同地區的任何區域中,也可以使用該地區中的任何子網路。在本範例中,用戶端位於 us-west1-a
區域,並使用與後端 VM 相同的子網路。
gcloud compute instances create vm-client \ --zone=us-west1-a \ --image-family=debian-12 \ --image-project=debian-cloud \ --tags=allow-ssh \ --subnet=lb-subnet
將流量傳送至負載平衡器
請按照下列步驟連線至負載平衡器。
連線至用戶端 VM 執行個體。
gcloud compute ssh vm-client --zone=us-west1-a
使用
curl
聯絡負載平衡器的 IP 位址,向負載平衡器發出網路要求。重複發出要求,系統便會顯示來自不同後端 VM 的回應。產生回應的 VM 名稱會顯示在 HTML 回應的文字中,這要歸功於每個後端 VM 上的/var/www/html/index.html
內容。預期的回應內容如下所示:Page served from: vm-a1
和Page served from: vm-a2
。curl http://10.1.2.99
轉送規則設定為用於通訊埠
80
、8008
、8080
和8088
,如要將流量傳送至其他通訊埠,請在 IP 位址後方加上冒號 (:
) 和通訊埠號碼,如下所示:curl http://10.1.2.99:8008
後續步驟
- 如要設定其他設定選項 (例如啟用全球存取權、接受所有通訊埠的流量,以及使用兩個轉送規則接受多個通訊埠的流量),請參閱「內部轉送網路負載平衡器的其他設定選項」。
- 如要瞭解重要的基礎知識,請參閱「內部直通式網路負載平衡器總覽」。
- 如需容錯移轉的重要資訊,請參閱內部直通式網路負載平衡器的容錯移轉概念一文。
- 如要瞭解如何設定內部直通式網路負載平衡器的記錄和監控功能,請參閱「內部直通式網路負載平衡器的記錄和監控」一文。
- 關於如何透過連線至虛擬私人雲端網路的對等互連網路存取內部直通式網路負載平衡器,請參閱「內部直通式網路負載平衡器和已連線網路」一文。
- 如要瞭解如何排解內部直通式網路負載平衡器的問題,請參閱「排解內部直通式網路負載平衡器問題」。