使用 VM 執行個體群組後端設定區域性外部 Proxy 網路負載平衡器

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

本指南說明如何設定區域性外部 Proxy 網路負載平衡器,並搭配使用代管執行個體群組 (MIG) 後端。

在開始之前,請先參閱外部 Proxy 網路負載平衡器總覽

在本例中,我們會使用負載平衡器,在區域 A 的兩個區域代管執行個體群組中,將 TCP 流量分配給後端 VM。這個範例使用一組設為透過通訊埠 110 回應要求的 Apache 伺服器來提供服務。許多瀏覽器都不接受通訊埠 110,因此測試部分使用 curl

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

外部 Proxy 網路負載平衡器範例設定,其中包含執行個體群組後端。
外部 Proxy 網路負載平衡器範例設定,其中包含執行個體群組後端

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

權限

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

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

詳情請參閱下列指南:

設定網路和子網路

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

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

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

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

  • Proxy 的子網路:Region B 中名為 proxy-only-subnet 的子網路,其主要 IP 位址範圍為 10.129.0.0/23

建立網路和子網路

主控台

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

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

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

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

  4. 在「子網路」部分,將「子網路建立模式」設為「自訂」

  5. 為負載平衡器的後端建立子網路。在「New subnet」(新的子網路) 區段中,輸入以下資訊:

    • Name (名稱):backend-subnet
    • Region (區域):REGION_A
    • IP address range (IP 位址範圍):10.1.2.0/24
  6. 按一下 [完成]

  7. 按一下 [建立]。

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-ssh:輸入規則,適用於要進行負載平衡的執行個體,可在 TCP 通訊埠 22 上允許來自任何位址的連入 SSH 連線。您可以為這項規則選擇較嚴格的來源 IP 範圍;例如,您可以僅指定要從其中啟動 SSH 工作階段之系統的 IP 範圍。本範例使用目標標記 allow-ssh

  • fw-allow-health-check:輸入規則,適用於要進行負載平衡的執行個體,可允許來自 Google Cloud健康狀態檢查系統 (在 130.211.0.0/2235.191.0.0/16 中) 的所有 TCP 流量。這個範例使用目標標記 allow-health-check

  • fw-allow-proxy-only-subnet 輸入規則,允許來自僅限 Proxy 子網路的連線傳送至後端。

如果沒有這些防火牆規則,預設拒絕輸入規則將會封鎖傳入至後端執行個體的流量。

目標代碼定義後端執行個體。如未指定目標標記,防火牆規則會套用至 VPC 網路中的所有後端執行個體。建立後端 VM 時,請務必加入指定的目標標記,如「建立代管執行個體群組」一節所示。

主控台

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

    前往「防火牆政策」

  2. 按一下「Create firewall rule」,建立允許連入 SSH 連線的規則。填寫下列欄位:

    • Name (名稱):fw-allow-ssh
    • Network (網路):lb-network
    • 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」核取方塊,然後輸入 22 做為「Port number」(通訊埠編號)。
  3. 按一下 [建立]。

  4. 再次按一下「Create firewall rule」(建立防火牆規則),建立允許Google Cloud 健康狀態檢查的規則:

    • Name (名稱):fw-allow-health-check
    • Network (網路):lb-network
    • Direction of traffic (流量方向):「Ingress」(輸入)
    • 「Action on match」(相符時執行的動作)「允許」
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-health-check
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):130.211.0.0/2235.191.0.0/16
    • 通訊協定和通訊埠

      • 選擇「Specified protocols and ports」
      • 勾選「TCP」核取方塊,然後輸入 80 做為「Port number」(通訊埠編號)。

      最佳做法是將此規則限制為與健康檢查所使用的通訊協定和通訊埠相符。如果您將 tcp:80 用於通訊協定和通訊埠, Google Cloud 可以使用通訊埠 80 的 HTTP 與 VM 聯絡,但無法使用通訊埠 443 的 HTTPS 與 VM 聯絡。

  5. 按一下 [建立]。

  6. 第三次按一下「Create firewall rule」(建立防火牆規則),以建立允許負載平衡器 Proxy 伺服器連結後端的規則:

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

gcloud

  1. 建立 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
    
  2. 建立 fw-allow-health-check 規則,允許 Google Cloud健康狀態檢查。這個範例可允許來自健康狀態檢查探測器的所有 TCP 流量,但您可以根據自己的需求設定一組較少的通訊埠。

    gcloud compute firewall-rules create fw-allow-health-check \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --target-tags=allow-health-check \
        --rules=tcp:80
    
  3. 建立 fw-allow-proxy-only-subnet 規則,允許該區域的 Envoy Proxy 連結後端。將 --source-ranges 設為僅限 Proxy 子網路的已分配範圍,在本例中為 10.129.0.0/23

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

保留負載平衡器的 IP 位址

為負載平衡器保留靜態 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
    

建立代管執行個體群組

本節說明如何在 A 區建立兩個負載平衡器的代管執行個體群組 (MIG) 後端。在這個範例中,MIG 會提供執行後端 Apache 伺服器的 VM 執行個體。一般來說,地區性外部 Proxy 網路負載平衡器不會用於 HTTP 流量,但 Apache 軟體通常用於測試。

主控台

建立執行個體範本

  1. 前往 Google Cloud 控制台的「Instance Templates」(執行個體範本) 頁面。

    前往「Instance templates」(執行個體範本) 頁面

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

  3. 在「Name」(名稱) 中輸入 ext-reg-tcp-proxy-backend-template

  4. 確認「開機磁碟」已設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明使用僅在 Debian 上可用的指令,例如 apt-get

  5. 點選「進階選項」

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

    1. 在「網路標記」中輸入 allow-sshallow-health-checkallow-proxy-only-subnet
    2. 在「網路介面」中,選取下列項目:
      • Network (網路):lb-network
      • Subnet (子網路):backend-subnet
  7. 按一下 [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
     
  8. 按一下 [建立]。

建立代管執行個體群組

  1. 前往 Google Cloud 控制台的「Instance groups」(執行個體群組) 頁面。

    前往「Instance groups」(執行個體群組)

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

  3. 選取「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「建立具備有狀態磁碟的 MIG」。

  4. 在「Name」(名稱) 中輸入 mig-a

  5. 在「Location」(位置) 中,選取「Single zone」(單一可用區)

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

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

  8. 在「Instance template」(執行個體範本) 中選取 ext-reg-tcp-proxy-backend-template

  9. 指定要在群組中建立的執行個體數量。

    在本例中,請為「自動調度資源」指定下列選項:

    • 針對「Autoscaling mode」(自動調度資源模式),選取 Off:do not autoscale
    • 在「Maximum number of instances」(執行個體數量上限) 中輸入 2
  10. 在「Port mapping」(通訊埠對應) 部分,按一下「Add port」(新增通訊埠)

    • 在「Port name」(通訊埠名稱) 中輸入 tcp80
    • 在「Port number」(通訊埠編號) 中輸入 80
  11. 按一下 [建立]。

  12. 如要建立第二個代管執行個體群組,請重複執行建立代管執行個體群組的步驟,並使用下列設定:

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

    保留其他所有設定。

gcloud

本指南中的 Google Cloud CLI 操作說明假設您使用 Cloud Shell 或已安裝 bash 的其他環境。

  1. 如要建立含有 HTTP 伺服器的 VM 執行個體範本,請使用 gcloud compute instance-templates create 指令

    gcloud compute instance-templates create ext-reg-tcp-proxy-backend-template \
        --region=REGION_A \
        --network=lb-network \
        --subnet=backend-subnet \
        --tags=allow-ssh,allow-health-check,allow-proxy-only-subnet \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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'
    
  2. ZONE_A 區域中建立代管執行個體群組:

    gcloud compute instance-groups managed create mig-a \
        --zone=ZONE_A \
        --size=2 \
        --template=ext-reg-tcp-proxy-backend-template
    
  3. ZONE_B 區域中建立代管執行個體群組:

    gcloud compute instance-groups managed create mig-b \
        --zone=ZONE_B \
        --size=2 \
        --template=ext-reg-tcp-proxy-backend-template
    

設定負載平衡器

主控台

開始設定

  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」(後端類型) 部分,選取「Instance group」(執行個體群組)
  3. 在「Protocol」中,選取「TCP」
  4. 在「Named port」(已命名通訊埠) 輸入 tcp80
  5. 設定第一個後端:
    1. 在「New backend」(新增後端) 部分,選取執行個體群組 mig-a
    2. 在「Port numbers」(通訊埠編號) 的部分,輸入 80
    3. 保留其餘預設值,然後按一下「完成」
  6. 設定第二個後端:
    1. 點選「新增後端」
    2. 在「New backend」(新增後端) 部分,選取執行個體群組 mig-b
    3. 在「Port numbers」(通訊埠編號) 的部分,輸入 80
    4. 保留其餘預設值,然後按一下「完成」
  7. 設定健康狀態檢查:
    1. 在「健康狀態檢查」部分,選取「建立健康狀態檢查」
    2. 將健康狀態檢查名稱設為 tcp-health-check
    3. 在「Protocol」中,選取「TCP」
    4. 將「Port」(通訊埠) 設為 80
  8. 保留剩餘的預設值,然後按一下「儲存」
  9. 在 Google Cloud 控制台中,確認「後端設定」旁有勾號。如未顯示,請重新檢查一遍,確認是否已完成所有步驟。

設定前端

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

檢查並完成

  1. 按一下「檢查並完成」
  2. 查看負載平衡器設定。
  3. 選用:按一下「等效程式碼」,查看用於建立負載平衡器的 REST API 要求。
  4. 按一下 [建立]。

gcloud

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

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

    gcloud compute backend-services create ext-reg-tcp-proxy-bs \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --protocol=TCP \
        --port-name=tcp80 \
        --region=REGION_A \
        --health-checks=tcp-health-check \
        --health-checks-region=REGION_A
    
  3. 將執行個體群組新增至後端服務:

    gcloud compute backend-services add-backend ext-reg-tcp-proxy-bs \
        --region=REGION_A \
        --instance-group=mig-a \
        --instance-group-zone=ZONE_A \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.8
     
    gcloud compute backend-services add-backend ext-reg-tcp-proxy-bs \
        --region=REGION_A \
        --instance-group=mig-b \
        --instance-group-zone=ZONE_B \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.8
    
  4. 建立目標 TCP Proxy:

    gcloud compute target-tcp-proxies create ext-reg-tcp-target-proxy \
        --backend-service=ext-reg-tcp-proxy-bs \
        --proxy-header=NONE \
        --region=REGION_A
    

    如要啟用 Proxy 標頭,請將其設為 PROXY_V1 (而非 NONE)。在本例中,請勿啟用 Proxy 通訊協定,因為它無法與 Apache HTTP Server 軟體搭配運作。詳情請參閱「PROXY 通訊協定」。

  5. 建立轉送規則。針對 --ports,請指定單一通訊埠編號,範圍為 1 至 65535。本範例使用的是通訊埠 110。轉送規則只會轉送具有相符目的地通訊埠的封包。

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

測試負載平衡器

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

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

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

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

    curl -m1 LB_IP_ADDRESS:9090
    

其他設定選項

本節會延伸說明設定範例,並提供替代和其他設定選項。所有工作都是選填項目。您可以按任何順序執行這些工作。

啟用工作階段相依性

範例設定會建立沒有工作階段相依性的後端服務。

這些程序會說明如何更新先前建立的負載平衡器範例後端服務,以便後端服務使用用戶端 IP 相依性或產生的 Cookie 相依性。

啟用用戶端 IP 相依性後,負載平衡器會根據從用戶端 IP 位址和負載平衡器 IP 位址 (內部轉送規則的內部 IP 位址) 建立的雜湊,將特定用戶端的要求導向至同一個後端 VM。

如要啟用用戶端 IP 工作階段相依性,請完成下列步驟。

控制台

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

    前往「負載平衡」

  2. 點選「後端」

  3. 按一下 ext-reg-tcp-proxy-bs (您為本範例建立的後端服務名稱),然後按一下「Edit」

  4. 在「後端服務詳細資料」頁面中,按一下「進階設定」

  5. 在「Session affinity」(工作階段相依性) 部分,選取「Client IP」

  6. 按一下 [Update]

gcloud

如要更新 ext-reg-tcp-proxy-bs 後端服務並指定用戶端 IP 工作階段相依性,請使用 gcloud compute backend-services update ext-reg-tcp-proxy-bs 指令:

gcloud compute backend-services update ext-reg-tcp-proxy-bs \
    --region=REGION_A \
    --session-affinity=CLIENT_IP

後續步驟