使用區域性 NEG 後端設定區域性外部 Proxy 網路負載平衡器

區域性外部 Proxy 網路負載平衡器是以 Proxy 為基礎的區域性第 4 層負載平衡器,可讓您透過外部區域 IP 位址在單一區域中執行及調度 TCP 服務流量。這些負載平衡器會將來自網際網路的外部 TCP 流量,分配給同一個地區的後端。

本指南說明如何設定區域性外部 Proxy 網路負載平衡器,並搭配區域性網路端點群組 (NEG) 後端。

開始前,請先詳閱下列文件:

在本例中,我們會使用負載平衡器,在區域 A 的兩個區域 NEG 中,將 TCP 流量分配給後端 VM。這個範例使用一組設為透過通訊埠 80 回應要求的 Apache 伺服器來提供服務。

在本例中,您會設定下圖所示的部署作業。

區域性外部 Proxy 網路負載平衡器示例設定,其中包含可用區 NEG 後端。
區域性外部 Proxy 網路負載平衡器示例設定,其中包含可用區 NEG 後端。

這是區域性負載平衡器。所有負載平衡器元件 (後端執行個體群組、後端服務、目標 Proxy 和轉送規則) 都必須位於同一個區域。

權限

如要依照本指南的說明操作,您必須能在專案中建立執行個體與修改網路。您必須是專案擁有者或編輯者,或是必須具有以下所有 Compute Engine 身分與存取權管理角色

工作 必要角色
建立網路、子網路和負載平衡器元件 Compute 網路管理員 (roles/compute.networkAdmin)
新增與移除防火牆規則 Compute 安全管理員 (roles/compute.securityAdmin)
建立執行個體 Compute 執行個體管理員 (roles/compute.instanceAdmin)

詳情請參閱下列指南:

設定網路和子網路

您需要具有兩個子網路的虛擬私有雲網路:一個用於負載平衡器的後端,另一個用於負載平衡器的 Proxy。這是區域性負載平衡器。如果流量來源位於與負載平衡器相同地區的子網路中,虛擬私人雲端網路內的流量會轉送至負載平衡器。

這個範例會使用以下虛擬私人雲端網路、地區和子網路:

  • 網路:名為 lb-network自訂模式虛擬私有雲網路

  • 後端的子網路:區域 A 中名為 backend-subnet 的子網路,使用 10.1.2.0/24 做為主要 IP 位址範圍

  • Proxy 的子網路:區域 A 中名為 proxy-only-subnet 的子網路,使用 10.129.0.0/23 做為主要 IP 位址範圍

為後端建立網路和子網路

主控台

  1. 在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 按一下「建立虛擬私有雲網路」

  3. 在「Name」(名稱) 中輸入 lb-network

  4. 在「Subnets」(子網路) 區段中,執行下列操作:

    1. 將「Subnet creation mode」(子網路建立模式) 設為 [Custom] (自訂)
    2. 在「New subnet」(新的子網路) 區段中,輸入以下資訊:
      • Name (名稱):backend-subnet
      • Region (區域):REGION_A
      • IP address range (IP 位址範圍):10.1.2.0/24
    3. 按一下 [完成]
  5. 按一下 [建立]。

gcloud

  1. 如要建立自訂虛擬私人雲端網路,請使用 gcloud compute networks create 指令

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 如要在 REGION_A 地區的 lb-network 網路中建立子網路,請使用 gcloud compute networks subnets create 指令

    gcloud compute networks subnets create backend-subnet \
       --network=lb-network \
       --range=10.1.2.0/24 \
       --region=REGION_A
    

建立僅限 Proxy 的子網路

僅限 Proxy 子網路會提供一組 IP 位址,供 Google 代表您執行 Envoy Proxy。Proxy 會終止來自用戶端的連線,並建立連至後端的新連線。

這個僅限 Proxy 的子網路,會由 lb-network 虛擬私有雲網路的區域 A 中,所有 Envoy 型負載平衡器使用。

主控台

如果您使用的是 Google Cloud 主控台,可以等之後再於「負載平衡」頁面中建立僅限 Proxy 的子網路。

如果您現在想建立僅限 Proxy 的子網路,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 按一下共用虛擬私有雲網路名稱:lb-network

  3. 按一下 [新增子網路]

  4. 在「Name」(名稱) 中輸入 proxy-only-subnet

  5. 在「Region」(區域) 中選取 REGION_A

  6. 將「用途」設為「區域受管理 Proxy」

  7. 在「IP address range」(IP 位址範圍) 中,輸入 10.129.0.0/23

  8. 按一下「新增」。

gcloud

如要建立僅限 Proxy 的子網路,請使用 gcloud compute networks subnets create 指令

gcloud compute networks subnets create proxy-only-subnet \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=REGION_A \
    --network=lb-network \
    --range=10.129.0.0/23

建立防火牆規則

在此範例中,您會建立下列防火牆規則:

  • fw-allow-health-check:輸入規則,適用於要進行負載平衡的 Google Cloud執行個體,可允許來自負載平衡器和Google Cloud 健康狀態檢查系統 (130.211.0.0/2235.191.0.0/16) 的流量。這個範例會使用目標標記 allow-health-check 來辨識應套用此規則的後端 VM。
  • fw-allow-ssh:輸入規則,允許在 TCP 通訊埠 22 上來自任何位址的連入 SSH 連線。您可以為這項規則選擇較嚴格的來源 IP 範圍;例如,您可以僅指定要從其中啟動 SSH 工作階段之系統的 IP 範圍。本範例會使用目標標記 allow-ssh 來識別應套用此規則的 VM。
  • fw-allow-proxy-only-subnet:僅限 Proxy 子網路的輸入 allow 防火牆規則,可讓負載平衡器與 TCP 通訊埠 80 上的後端執行個體通訊。本範例會使用目標標記 allow-proxy-only-subnet 來識別應套用此規則的後端 VM。

主控台

  1. 在 Google Cloud 控制台中,前往「Firewall policies」(防火牆政策) 頁面。

    前往「防火牆政策」

  2. 按一下「建立防火牆規則」,然後填入下列欄位:

    • Name (名稱):fw-allow-health-check
    • Network (網路):lb-network
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-health-check
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):130.211.0.0/2235.191.0.0/16
    • 通訊協定和通訊埠
      • 選擇「Specified protocols and ports」
      • 勾選「TCP」TCP核取方塊,然後輸入 80 做為「Port number」(通訊埠編號)。
  3. 按一下 [建立]。

  4. 再次按一下「Create firewall rule」(建立防火牆規則),建立允許連入 SSH 連線的規則:

    • Name (名稱):fw-allow-ssh
    • Network (網路):lb-network
    • Priority (優先順序):1000
    • Direction of traffic (流量方向):「Ingress」(輸入)
    • 「Action on match」(相符時執行的動作)「允許」
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-ssh
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):0.0.0.0/0
    • 通訊協定和通訊埠
      • 選擇「Specified protocols and ports」
      • 勾選「TCP」TCP核取方塊,然後輸入 22 做為「Port number」(通訊埠編號)。
  5. 按一下 [建立]。

  6. 第三次按一下「Create firewall rule」(建立防火牆規則),以建立允許來自僅限 Proxy 子網路的連線連入 Google Cloud後端的規則:

    • Name (名稱):fw-allow-proxy-only-subnet
    • Network (網路):lb-network
    • Priority (優先順序):1000
    • Direction of traffic (流量方向):「Ingress」(輸入)
    • 「Action on match」(相符時執行的動作)「允許」
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-proxy-only-subnet
    • Source filter (來源篩選器):IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):10.129.0.0/23
    • 通訊協定和通訊埠
      • 選擇「Specified protocols and ports」
      • 勾選「TCP」TCP核取方塊,然後輸入 80 做為「Port number」(通訊埠編號)。
  7. 按一下 [建立]。

gcloud

  1. 建立 fw-allow-health-check 規則,允許 Google Cloud 健康檢查在 TCP 通訊埠 80 上存取後端執行個體:

    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:80
    
  2. 建立 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
    
  3. 為僅限 Proxy 的子網路建立允許輸入的防火牆規則,以便負載平衡器與 TCP 通訊埠 80 上的後端執行個體通訊:

    gcloud compute firewall-rules create fw-allow-proxy-only-subnet \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-proxy-only-subnet \
        --source-ranges=10.129.0.0/23 \
        --rules=tcp:80
    

保留負載平衡器的 IP 位址

主控台

  1. 在 Google Cloud 控制台,前往「Reserve a static address」(預約靜態位址) 頁面。

    前往「保留靜態位址」

  2. 選擇新位址的名稱。

  3. 在「Network Service Tier」中,選取「Standard」

  4. 在「IP 版本」部分,選取「IPv4」。系統不支援 IPv6 位址。

  5. 在「Type」(類型) 中,選取「Regional」(區域)

  6. 在「Region」(區域) 中選取 REGION_A

  7. 將「Attached to」(連接至) 選項設為「None」(無)。建立負載平衡器後,這個 IP 位址會附加至負載平衡器的轉送規則。

  8. 按一下「保留」,即可預留 IP 位址。

gcloud

  1. 如要保留靜態外部 IP 位址,請使用 gcloud compute addresses create 指令

    gcloud compute addresses create ADDRESS_NAME  \
       --region=REGION_A \
       --network-tier=STANDARD
    

    ADDRESS_NAME 替換為您要稱呼此位址的名稱。

  2. 如要查看結果,請使用 gcloud compute addresses describe 指令

    gcloud compute addresses describe ADDRESS_NAME
    

設定可用區 NEG

在區域 A 中,設定含有 GCE_VM_IP_PORT 類型端點的可用區性 NEG。請先建立 VM,然後建立區域 NEG,並將 VM 的網路端點新增至 NEG。

建立 VM

主控台

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 點選「建立執行個體」

  3. 將「Name」(名稱) 設定為 vm-a1

  4. 在「Region」(區域) 中選取 REGION_A

  5. 在「Zone」(可用區) 中選取 ZONE_A

  6. 在「Boot disk」(開機磁碟) 專區中,確認已為開機磁碟選項選取「Debian GNU/Linux 12 (bookworm)」。如有需要,請按一下「Choose」(選擇),以變更圖片。

  7. 點選「進階選項」

  8. 按一下「網路」,然後設定下列欄位:

    1. 在「網路標記」中輸入 allow-sshallow-health-checkallow-proxy-only-subnet
    2. 在「網路介面」中,選取下列項目:
      • Network (網路):lb-network
      • Subnet (子網路):backend-subnet
  9. 按一下 [Management] (管理)。在「Startup script」(開機指令碼) 欄位中輸入下列指令碼:

    #! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    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
    systemctl restart apache2
    
  10. 按一下 [建立]。

  11. 重複執行上述步驟,建立另外三個 VM。使用下列名稱和區域組合:

    • 名稱:vm-a2 | 區域:ZONE_A
    • 名稱:vm-b1 | 區域:ZONE_B
    • 名稱:vm-b2 | 區域:ZONE_B

gcloud

如要建立 VM,請使用 gcloud compute instances create 指令兩次。請針對 VM_NAMEZONE 使用下列組合。兩個 VM 的指令碼內容皆相同:

  • VM_NAMEvm-a1ZONEZONE_A
  • VM_NAMEvm-a2ZONEZONE_A
  • VM_NAMEvm-b1ZONEZONE_B
  • VM_NAMEvm-b2ZONEZONE_B
 gcloud compute instances create VM_NAME \
     --zone=ZONE \
     --image-family=debian-12 \
     --image-project=debian-cloud \
     --tags=allow-ssh,allow-health-check,allow-proxy-only-subnet \
     --subnet=backend-subnet \
     --metadata=startup-script='#! /bin/bash
       apt-get update
       apt-get install apache2 -y
       a2ensite default-ssl
       a2enmod ssl
       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
       systemctl restart apache2'

建立可用區 NEG

主控台

建立區域性網路端點群組

  1. 在 Google Cloud 控制台中,前往「Network endpoint groups」(網路端點群組) 頁面。

    前往網路端點群組

  2. 按一下「建立網路端點群組」

  3. 在「Name」(名稱) 中輸入 zonal-neg-a

  4. 在「網路端點群組類型」部分,選取「網路端點群組 (區域性)」

  5. 在「Network」(網路) 中選取 lb-network

  6. 在「子網路」中,選取 backend-subnet

  7. 在「Zone」(可用區) 中選取 ZONE_A

  8. 在「Default port」(預設通訊埠) 中輸入 80

  9. 按一下 [建立]。

  10. 重複本節中的所有步驟,建立第二個區域 NEG,並在設定中進行以下變更:

    • Name (名稱):zonal-neg-b
    • Zone (可用區):ZONE_B

將端點新增至區域性 NEG

  1. 在 Google Cloud 控制台中,前往「Network endpoint groups」(網路端點群組) 頁面。

    前往網路端點群組

  2. 按一下您在前一個步驟建立的網路端點群組名稱 (例如 zonal-neg-a)。

  3. 在「Network endpoint group details」(網路端點群組詳細資料) 頁面的「Network endpoints in this group」(這個群組中的網路端點) 區段中,按一下「Add network endpoint」(新增網路端點)

  4. 選取 VM 執行個體 (例如 vm-a1)。

  5. 在「Network interface」部分,系統會顯示 VM 名稱、區域和子網路。

    1. 在「IP 位址」中,輸入新網路端點的 IP 位址。如要取得 IP 位址,請按一下「顯示 nic0 中的主要 IP 位址和別名 IP 範圍」
    2. 在「Port type」中,選取「Default」。端點會使用網路端點群組中所有端點的預設通訊埠 80。這對我們的範例來說已足夠,因為 Apache 伺服器會透過 80 通訊埠提供要求。
    3. 按一下 [建立]。
  6. 按一下「新增網路端點」。選取第二個 VM 執行個體 vm-a2,然後重複上述步驟,將其端點新增至 zonal-neg-a

  7. 重複執行本節中的所有步驟,將端點從 vm-b1vm-b2 新增至 zonal-neg-b

gcloud

  1. ZONE_A 區域中使用 GCE_VM_IP_PORT 端點建立可用區性 NEG:

    gcloud compute network-endpoint-groups create zonal-neg-a \
        --network-endpoint-type=GCE_VM_IP_PORT \
        --zone=ZONE_A \
        --network=lb-network \
        --subnet=backend-subnet
    

    您可以在建立 NEG 時指定 --default-port,或是為每個端點指定通訊埠號碼,如下一個步驟所示。

  2. 將端點新增至區域性 NEG:

    gcloud compute network-endpoint-groups update zonal-neg-a \
        --zone=ZONE_A \
        --add-endpoint='instance=vm-a1,port=80' \
        --add-endpoint='instance=vm-a2,port=80'
    
  3. ZONE_B 區域中使用 GCE_VM_IP_PORT 端點建立可用區性 NEG:

    gcloud compute network-endpoint-groups create zonal-neg-b \
        --network-endpoint-type=GCE_VM_IP_PORT \
        --zone=ZONE_B \
        --network=lb-network \
        --subnet=backend-subnet
    

    您可以在建立 NEG 時指定 --default-port,或是為每個端點指定通訊埠號碼,如下一個步驟所示。

  4. 將端點新增至區域性 NEG:

    gcloud compute network-endpoint-groups update zonal-neg-b \
        --zone=ZONE_B \
        --add-endpoint='instance=vm-b1,port=80' \
        --add-endpoint='instance=vm-b2,port=80'
    

設定負載平衡器

主控台

開始設定

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡)頁面。

    前往「Load balancing」(負載平衡) 頁面

  2. 點選「建立負載平衡器」
  3. 在「負載平衡器類型」部分,選取「網路負載平衡器 (TCP/UDP/SSL)」,然後點選「下一步」
  4. 在「直通或使用 Proxy」部分,選取「Proxy load balancer」,然後點選「Next」
  5. 在「公開或內部」部分,選取「公開 (外部)」,然後點選「下一步」
  6. 在「全域或單一區域部署」部分,選取「最適合區域工作負載」,然後點選「Next」
  7. 按一下 [設定]

基本設定

  1. 在「Name」(名稱) 中輸入 my-ext-tcp-lb
  2. 在「Region」(區域) 中選取 REGION_A
  3. 在「Network」(網路) 中選取 lb-network

保留僅限 Proxy 子網路

  1. 按一下「保留子網路」
  2. 在「Name」(名稱) 中輸入 proxy-only-subnet
  3. 在「IP address range」(IP 位址範圍) 中,輸入 10.129.0.0/23
  4. 按一下「新增」。

設定後端

  1. 按一下「後端設定」
  2. 在「Backend type」部分,選取「Zonal network endpoint group」
  3. 在「Protocol」中,選取「TCP」
  4. 設定第一個後端:
    1. 在「New backend」(新增後端) 中,選取區域性 NEG zonal-neg-a
    2. 保留其餘預設值,然後按一下「完成」
  5. 設定第二個後端:
    1. 點選「新增後端」
    2. 在「New backend」(新增後端) 部分,選取執行個體群組 zonal-neg-b
    3. 保留其餘預設值,然後按一下「完成」
  6. 設定健康狀態檢查:
    1. 在「健康狀態檢查」部分,選取「建立健康狀態檢查」
    2. 將健康狀態檢查名稱設為 tcp-health-check
    3. 在「Protocol」中,選取「TCP」
    4. 在「Port」(通訊埠) 欄中,輸入 80
  7. 保留剩餘的預設值,然後按一下「儲存」
  8. 在 Google Cloud 控制台中,確認「後端設定」旁有勾號。如未顯示,請重新檢查一遍,確認是否已完成所有步驟。

設定前端

  1. 按一下「前端設定」
  2. 在「Name」(名稱) 中輸入 ext-tcp-forwarding-rule
  3. 在「Network Service Tier」中,選取「Standard」
  4. 在「IP 位址」部分,選取 ext-tcp-ip-address
  5. 在「Port number」(通訊埠編號) 中輸入 9090。轉送規則只會轉送具有相符目的地通訊埠的封包。
  6. 針對「Proxy protocol」,請選取「Off」,因為 Proxy 通訊協定不適用於 Apache HTTP Server 軟體。詳情請參閱「PROXY 通訊協定」。
  7. 按一下 [完成]
  8. 在 Google Cloud 控制台中,確認「前端設定」旁有勾號。如未顯示,請重新檢查一遍,確認是否已完成上述所有步驟。

檢查並完成

  1. 按一下 [Review and finalize] (檢查並完成)
  2. 重新檢查一遍您的設定。
  3. 按一下 [建立]。

gcloud

  1. 為後端建立地區健康狀態檢查:

    gcloud compute health-checks create tcp tcp-health-check \
        --region=REGION_A \
        --use-serving-port
    
  2. 建立後端服務:

    gcloud compute backend-services create external-tcp-proxy-bs \
       --load-balancing-scheme=EXTERNAL_MANAGED \
       --protocol=TCP \
       --region=REGION_A \
       --health-checks=tcp-health-check \
       --health-checks-region=REGION_A
    
  3. ZONE_A 區域中的區域 NEG 新增至後端服務:

    gcloud compute backend-services add-backend external-tcp-proxy-bs \
       --network-endpoint-group=zonal-neg-a \
       --network-endpoint-group-zone=ZONE_A \
       --balancing-mode=CONNECTION \
       --max-connections-per-endpoint=50 \
       --region=REGION_A
    
  4. ZONE_B 區域中的區域 NEG 新增至後端服務:

    gcloud compute backend-services add-backend external-tcp-proxy-bs \
       --network-endpoint-group=zonal-neg-b \
       --network-endpoint-group-zone=ZONE_B \
       --balancing-mode=CONNECTION \
       --max-connections-per-endpoint=50 \
       --region=REGION_A
    
  5. 建立目標 TCP Proxy:

    gcloud compute target-tcp-proxies create ext-tcp-target-proxy \
       --backend-service=external-tcp-proxy-bs \
       --region=REGION_A
    
  6. 建立轉送規則。針對 --ports,請指定單一通訊埠編號,範圍為 1 至 65535。本範例使用的是通訊埠 9090。轉送規則只會轉送具有相符目的地通訊埠的封包。

    gcloud compute forwarding-rules create ext-tcp-forwarding-rule \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --network=lb-network \
      --network-tier=STANDARD \
      --address=ext-tcp-ip-address \
      --ports=9090 \
      --region=REGION_A \
      --target-tcp-proxy=ext-tcp-target-proxy \
      --target-tcp-proxy-region=REGION_A
    

測試負載平衡器

負載平衡器設定完畢後,您可以測試將流量傳送至負載平衡器的 IP 位址。

  1. 取得負載平衡器的 IP 位址。

    如要取得 IPv4 位址,請執行下列指令:

    gcloud compute addresses describe ADDRESS_NAME
    
  2. 執行下列指令,將流量傳送至負載平衡器。將 LB_IP_ADDRESS 替換為負載平衡器的 IPv4 位址。

    curl -m1 LB_IP_ADDRESS:9090
    

後續步驟