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

區域性內部 Proxy 網路負載平衡器是以 Proxy 為基礎的區域性第 4 層負載平衡器,可讓您透過內部 IP 位址執行及擴充 TCP 服務流量,且該 IP 位址只能由相同虛擬私有雲網路中的用戶端,或連線至虛擬私有雲網路的用戶端存取。

開始之前,請先參閱「區域性內部 Proxy 網路負載平衡器總覽」。

本指南說明如何設定區域性內部 Proxy 網路負載平衡器,並搭配代管執行個體群組 (MIG) 後端。在本範例中,您將設定下列部署作業:

區域性內部 Proxy 網路負載平衡器範例設定,包含執行個體群組後端。
區域性內部 Proxy 網路負載平衡器範例設定 (含執行個體群組後端)

在本範例中,我們會使用負載平衡器,將 TCP 流量分配到 REGION_A 區域中兩個可用區代管執行個體群組的後端 VM。在本範例中,服務是一組 Apache 伺服器,設定為在通訊埠 110 上回應。許多瀏覽器不允許使用通訊埠 110,因此測試部分會使用 curl。

區域性內部 Proxy 網路負載平衡器是區域性負載平衡器。所有負載平衡器元件都必須與負載平衡器位於相同區域。

權限

如要依照本指南的說明操作,您必須能在專案中建立執行個體與修改網路。您必須是專案擁有者或編輯者,或具備下列所有 Compute Engine IAM 角色:

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

如需詳細資訊,請參閱下列指南:

設定網路和子網路

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

本範例使用下列虛擬私有雲網路、區域和子網路:

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

  • 後端子網路。REGION_A 區域中名為 backend-subnet 的子網路使用 10.1.2.0/24 做為主要 IP 範圍。

  • Proxy 子網路。REGION_A 區域中名為 proxy-only-subnet 的子網路使用 10.129.0.0/23 做為主要 IP 範圍。

為示範全域存取權,本範例也會在不同區域 (REGION_B) 建立第二個測試用戶端 VM,以及主要 IP 位址範圍為 10.3.4.0/24 的子網路。

建立網路和子網路

控制台

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

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

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

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

  4. 在「Subnets」(子網路) 區段中,將「Subnet creation mode」(子網路建立模式) 設為「Custom」(自訂)。

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

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

  7. 按一下 [新增子網路]。

  8. 建立子網路,示範全域存取權。在「New subnet」(新增子網路) 區段中,輸入下列資訊:

    • Name (名稱):test-global-access-subnet
    • Region (區域):REGION_B
    • IP address range (IP 位址範圍):10.3.4.0/24
  9. 按一下「完成」。

  10. 點選「建立」。

gcloud

  1. 使用 gcloud compute networks create 指令建立自訂虛擬私有雲網路:

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

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

    將 REGION_A 替換為目標 Google Cloud 區域的名稱。

  3. 使用 gcloud compute networks subnets create 指令 ,在 REGION_B 區域的 lb-network 網路中建立子網路:

    gcloud compute networks subnets create test-global-access-subnet \
       --network=lb-network \
       --range=10.3.4.0/24 \
       --region=REGION_B
    

    將 REGION_B 替換為要建立第二個子網路來測試全域存取權的 Google Cloud 區域。

建立僅限 Proxy 的子網路

Proxy 專用子網路提供一組 IP 位址,Google 會使用這些位址代您執行 Envoy Proxy。Proxy 會終止用戶端連線,並建立連至後端的新連線。

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

控制台

如果您使用的是 Google Cloud 控制台,可以稍後再前往「Load balancing」(負載平衡) 頁面建立僅限 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

使用 gcloud compute networks subnets create 指令建立僅限 Proxy 的子網路。

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 健康狀態檢查探測範圍的所有 TCP 流量。本範例使用目標標記 allow-health-check。

  • fw-allow-proxy-only-subnet:允許從僅限 Proxy 的子網路連線至後端的輸入規則。

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

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

控制台

  1. 前往 Google Cloud 控制台的「Firewall policies」(防火牆政策) 頁面。
    前往「Firewall policies」(防火牆政策) 頁面
  2. 按一下「Create firewall rule」(建立防火牆規則),建立允許連入 SSH 連線的規則:
    • Name (名稱):fw-allow-ssh
    • Network (網路):lb-network
    • Direction of traffic (流量方向):「Ingress」(輸入)
    • Action on match (相符時執行的動作):Allow (允許)
    • 目標:指定的目標標記
    • 「Target tags」(目標標記):allow-ssh
    • 來源篩選器:「IPv4 範圍」
    • Source IPv4 ranges (來源 IPv4 範圍):0.0.0.0/0
    • 「通訊協定和通訊埠」:
      • 選擇「指定的通訊協定和通訊埠」。
      • 勾選「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 (相符時執行的動作):Allow (允許)
    • 目標:指定的目標標記
    • 「Target tags」(目標標記):allow-health-check
    • 來源篩選器:「IPv4 範圍」
    • 來源 IPv4 範圍: 35.191.0.0/16
    • 「通訊協定和通訊埠」:
      • 選擇「指定的通訊協定和通訊埠」。
      • 勾選「TCP」TCP核取方塊,然後輸入 80 做為通訊埠編號。
        最佳做法是將這項規則限制在與健康狀態檢查所用通訊協定和通訊埠相符的範圍內。如果通訊協定和通訊埠使用 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 (相符時執行的動作):Allow (允許)
    • 目標:指定的目標標記
    • 「Target tags」(目標標記):allow-proxy-only-subnet
    • 來源篩選器:「IPv4 範圍」
    • Source IPv4 ranges (來源 IPv4 範圍):10.129.0.0/23
    • 「通訊協定和通訊埠」:
      • 選擇「指定的通訊協定和通訊埠」。
      • 勾選「TCP」TCP核取方塊,然後輸入 80 做為通訊埠編號。
  7. 點選「建立」。

gcloud

  1. 建立 fw-allow-ssh 防火牆規則,允許 SSH 連線至具有網路標記 allow-ssh 的 VM。如果省略 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=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 位址,請參閱「保留新的靜態內部 IPv4 或 IPv6 位址」。

建立代管執行個體群組

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

控制台

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

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

    1. 按一下「Create instance template」(建立執行個體範本)。
    2. 在「Name」(名稱) 中輸入 int-tcp-proxy-backend-template。
    3. 確認「開機磁碟」設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明中的指令僅適用於 Debian,例如 apt-get。
    4. 點選「進階選項」。
    5. 按一下「Networking」(網路),設定下列欄位:
      1. 在「Network tags」(網路標記) 部分,輸入 allow-ssh、allow-health-check 和 allow-proxy-only-subnet。
      2. 在「網路介面」部分,選取下列項目:
        • Network (網路):lb-network
        • Subnet (子網路):backend-subnet
    6. 按一下 [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
      
    7. 點選「建立」。

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

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

    1. 點選「建立執行個體群組」。
    2. 選取「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「無狀態或有狀態的 MIG」。
    3. 在「Name」(名稱) 中輸入 mig-a。
    4. 選取「Location」(位置) 下方的「Single zone」(單一可用區)。
    5. 在「Region」(區域) 中選取 REGION_A。
    6. 在「Zone」(可用區) 中選取 ZONE_A1。
    7. 在「Instance template」(執行個體範本) 下,選取 int-tcp-proxy-backend-template。
    8. 指定要在群組中建立的執行個體數量。

      在本範例中,請在「Autoscaling」(自動調度資源) 下方指定下列選項:

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

      • 在「Port name」(通訊埠名稱) 輸入 tcp80。
      • 在「Port number」(通訊埠編號) 輸入 80。
    10. 點選「建立」。

  3. 重複步驟 2,建立第二個代管執行個體群組,並採用下列設定:

    1. Name (名稱):mig-c
    2. 可用區:ZONE_A2 其他設定則維持不變。

gcloud

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

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

    gcloud compute instance-templates create int-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_A1 可用區建立代管執行個體群組。

    gcloud compute instance-groups managed create mig-a \
       --zone=ZONE_A1 \
       --size=2 \
       --template=int-tcp-proxy-backend-template
    

    將 ZONE_A1 替換為目標 Google Cloud 區域中的可用區名稱。

  3. 在 ZONE_A2 可用區建立代管執行個體群組。

    gcloud compute instance-groups managed create mig-c \
       --zone=ZONE_A2 \
       --size=2 \
       --template=int-tcp-proxy-backend-template
    

    將 ZONE_A2 替換為目標 Google Cloud 區域中其他可用區的名稱。

設定負載平衡器

控制台

開始設定

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

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

  2. 點選「建立負載平衡器」。
  3. 在「Type of load balancer」(負載平衡器類型) 部分,選取「Network Load Balancer (TCP/UDP/SSL)」(網路負載平衡器 (TCP/UDP/SSL)),然後點選「Next」(下一步)。
  4. 在「Proxy or passthrough」(直通或使用 Proxy) 部分,選取「Proxy load balancer」(Proxy 負載平衡器),然後點選「Next」(下一步)。
  5. 在「Public facing or internal」(公開或內部) 部分,選取「Internal」(內部),然後點選「Next」(下一步)。
  6. 在「Cross-region or single region deployment」(跨區域或單一區域部署) 部分,選取「Best for regional workloads」(最適合區域性工作負載),然後點選「Next」(下一步)。
  7. 按一下 [設定]。

基本設定

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

保留僅限 Proxy 子網路

如要預留僅限 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. 在「通訊協定」部分選取「TCP」。
  4. 在「Named port」(已命名通訊埠) 輸入 tcp80。
  5. 在「Health check」(健康狀態檢查) 清單中,按一下「Create a health check」(建立健康狀態檢查),然後輸入下列資訊:
    • Name (名稱):tcp-health-check
    • 通訊協定:TCP
    • Port (通訊埠):80
  6. 點選「建立」。
  7. 設定第一個後端:
    1. 在「New backend」(新增後端) 下方,選取執行個體群組 mig-a。
    2. 在「Port numbers」(通訊埠編號) 的部分,輸入 80。
    3. 保留其餘預設值,然後點選「完成」。
  8. 設定第二個後端:
    1. 點選「新增後端」。
    2. 在「New backend」(新增後端) 下方,選取執行個體群組 mig-c。
    3. 在「Port numbers」(通訊埠編號) 的部分,輸入 80。
    4. 保留其餘預設值,然後點選「完成」。
  9. 在 Google Cloud 控制台中,確認「Backend configuration」(後端設定) 旁有勾號。如未顯示,請重新檢查一遍,確認已完成所有步驟。

前端設定

  1. 點選「前端設定」。
  2. 在「Name」(名稱) 中輸入 int-tcp-forwarding-rule。
  3. 在「子網路」部分,選取「backend-subnet」。
  4. 在「IP address」(IP 位址) 部分,選取先前預留的 IP 位址:LB_IP_ADDRESS
  5. 在「Port number」(通訊埠編號) 部分,輸入 110。轉送規則只會轉送目的地通訊埠相符的封包。
  6. 在本範例中,請勿啟用「Proxy Protocol」,因為該通訊協定不適用於 Apache HTTP Server 伺服器軟體。詳情請參閱「Proxy 通訊協定」。
  7. 按一下「完成」。
  8. 在 Google Cloud 控制台中,確認「Frontend configuration」(前端設定) 旁有勾號。如未顯示,請重新檢查一遍,確認已完成上述所有步驟。

檢查並完成

  1. 點選「檢查並完成」。
  2. 查看負載平衡器設定。
  3. 選用:按一下「Equivalent code」(對等程式碼),即可查看用於建立負載平衡器的 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 internal-tcp-proxy-bs \
       --load-balancing-scheme=INTERNAL_MANAGED \
       --protocol=TCP \
       --region=REGION_A \
       --health-checks=tcp-health-check \
       --health-checks-region=REGION_A
    
  3. 將執行個體群組新增至後端服務。

    gcloud compute backend-services add-backend internal-tcp-proxy-bs \
       --region=REGION_A \
       --instance-group=mig-a \
       --instance-group-zone=ZONE_A1 \
       --balancing-mode=UTILIZATION \
       --max-utilization=0.8
    
    gcloud compute backend-services add-backend internal-tcp-proxy-bs \
       --region=REGION_A \
       --instance-group=mig-c \
       --instance-group-zone=ZONE_A2 \
       --balancing-mode=UTILIZATION \
       --max-utilization=0.8
    
  4. 建立內部目標 TCP Proxy。

    gcloud compute target-tcp-proxies create int-tcp-target-proxy \
       --backend-service=internal-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 int-tcp-forwarding-rule \
       --load-balancing-scheme=INTERNAL_MANAGED \
       --network=lb-network \
       --subnet=backend-subnet \
       --region=REGION_A \
       --target-tcp-proxy=int-tcp-target-proxy \
       --target-tcp-proxy-region=REGION_A \
       --address=int-tcp-ip-address \
       --ports=110
    

測試負載平衡器

如要測試負載平衡器,請在負載平衡器所在的區域建立用戶端 VM。接著,將流量從用戶端傳送至負載平衡器。

建立用戶端 VM

在負載平衡器所在的區域建立用戶端 VM (client-vm)。

控制台

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

    前往 VM 執行個體

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

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

  4. 將「可用區」設為 ZONE_A1。

  5. 點選「進階選項」。

  6. 按一下「Networking」(網路),設定下列欄位:

    1. 在「Network tags」(網路標記) 部分,輸入 allow-ssh。
    2. 在「網路介面」部分,選取下列項目:
      • Network (網路):lb-network
      • Subnet (子網路):backend-subnet
  7. 點選「建立」。

gcloud

用戶端 VM 必須與負載平衡器位於相同的虛擬私有雲網路和區域。不一定要位於相同子網路或可用區。用戶端與後端 VM 使用相同的子網路。

gcloud compute instances create client-vm \
    --zone=ZONE_A1 \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=backend-subnet

將流量傳送至負載平衡器

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

  1. 使用 SSH 連線至用戶端執行個體。

    gcloud compute ssh client-vm \
       --zone=ZONE_A1
    
  2. 確認負載平衡器是否正常提供後端主機名稱。

    1. 使用 compute addresses describe 指令查看負載平衡器的 IP 位址:

      gcloud compute addresses describe int-tcp-ip-address \
       --region=REGION_A
      

      記下 IP 位址。

    2. 將流量傳送至負載平衡器。請將 IP_ADDRESS 替換為負載平衡器的 IP 位址。

      curl IP_ADDRESS:110
      

額外設定選項

本節將進一步說明設定範例,提供其他設定選項。所有工作皆為選填。這些步驟的執行順序不拘。

建立具備 TLS 路由的負載平衡器

本節說明如何建立可使用 SNI 轉送功能的負載平衡器。Proxy 網路負載平衡器可根據 TLS 握手期間提供的伺服器名稱指示 (SNI) 主機名稱,將流量轉送至特定後端服務。

如要建立這個負載平衡器,請使用先前在本頁建立的網路、子網路和防火牆規則。您設定了下圖所示的部署作業:

區域性內部 Proxy 網路負載平衡器設定 (含 TLS 路由)。
使用 TLS 路由的區域性內部 Proxy 網路負載平衡器設定。

建立代管執行個體群組後端

本節說明如何為負載平衡器建立代管執行個體群組 (MIG) 後端。MIG 會提供 VM 執行個體,用於執行本範例的後端伺服器。

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

  1. 建立執行個體範本,並在通訊埠 443 公開「echo」HTTPS 服務。

    gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --region=REGION_A \
    --network=NETWORK \
    --subnet=SUBNET_A \
    --stack-type=IPv4_ONLY \
    --tags=allow-ssh,allow-health-check,allow-proxy-only-subnet \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --metadata=startup-script='#! /bin/bash
    sudo sed -i "s/^#DNS=.*/DNS=8.8.8.8 8.8.4.4/" /etc/systemd/resolved.conf
    sudo systemctl restart systemd-resolved
    sudo rm -rf /var/lib/apt/lists/*
    sudo apt-get -y clean
    sudo apt-get -y update
    sudo apt-get -y install ca-certificates curl gnupg software-properties-common
    sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
    sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
    sudo apt-get -y update
    sudo apt-get -y install docker-ce
    sudo which docker
    echo "{ \"registry-mirrors\": [\"https://mirror.gcr.io\"] }" | sudo tee -a /etc/docker/daemon.json
    sudo service docker restart
    sudo docker run -e HTTPS_PORT=9999 -p 443:9999 --rm -dt mendhak/http-https-echo:22'
    

    更改下列內容:

    • INSTANCE_TEMPLATE_NAME:執行個體範本的名稱。
    • REGION_A:執行個體範本的區域。
    • NETWORK:網路名稱。
    • SUBNET_A:子網路名稱。
  2. 依據執行個體範本建立代管執行個體群組:

    gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
      --zone=ZONE_A \
      --size=2 \
      --template=INSTANCE_TEMPLATE_NAME
    

    將 ZONE_A 替換為執行個體群組的可用區。

  3. 設定代管執行個體群組的服務通訊埠名稱:

    gcloud compute instance-groups managed set-named-ports INSTANCE_GROUP_NAME \
      --named-ports=PORT_NAME:PORT_NUMBER \
      --zone=ZONE_A
    

    更改下列內容:

    • PORT_NAME:服務通訊埠的名稱,例如 tcp443。
    • PORT_NUMBER:服務通訊埠的通訊埠編號,例如 443。

設定防火牆

設定防火牆規則,允許從負載平衡器和健康狀態檢查探測傳送至後端執行個體的流量。

gcloud compute firewall-rules create FIREWALL_RULE_NAME \
    --network=NETWORK \
    --action=allow \
    --direction=ingress \
    --source-ranges=35.191.0.0/16 \
    --target-tags=allow-health-check \
    --rules=tcp:443

將 FIREWALL_RULE_NAME 替換為防火牆規則名稱。

設定負載平衡器

  1. 建立 HTTPS 健康狀態檢查:

    gcloud compute health-checks create https HTTPS_HEALTH_CHECK_NAME \
        --region=REGION_A \
        --port=HC_PORT
    

    更改下列內容:

    • HTTPS_HEALTH_CHECK_NAME:健康狀態檢查的名稱。
    • HC_PORT:健康狀態檢查的通訊埠,例如 443。
    • REGION_A:健康狀態檢查的區域。
  2. 建立後端服務:

    gcloud compute backend-services create BACKEND_SERVICE_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --protocol=TCP \
        --port-name=PORT_NAME \
        --health-checks=tcp-health-check \
        --health-checks-region=REGION_A \
        --enable-logging \
        --logging-sample-rate=1.0 \
        --logging-optional=INCLUDE_ALL_OPTIONAL \
        --region=REGION_A
    

    更改下列內容:

    • BACKEND_SERVICE_NAME:後端服務的名稱。
    • PORT_NAME:後端服務的通訊埠名稱。使用在執行個體群組上設定的相同具名通訊埠,例如 tcp443。
    • HTTPS_HEALTH_CHECK_NAME:HTTPS 健康狀態檢查的名稱。
  3. 將後端執行個體群組新增至後端服務:

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.8 \
        --instance-group=INSTANCE_GROUP_NAME \
        --instance-group-zone=ZONE_A \
        --region=REGION_A
      

    更改下列內容:

    • INSTANCE_GROUP_NAME:後端執行個體群組的名稱。
    • ZONE_A:執行個體群組的可用區。
  4. 建立目標 TCP Proxy。

    gcloud beta compute target-tcp-proxies create TARGET_TCP_PROXY_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --proxy-header=NONE \
        --region=REGION_A
    

    將 TARGET_TCP_PROXY_NAME 替換為目標 TCP Proxy 的名稱。

  5. 建立 TLS 路由規格,並儲存至 YAML 檔案。

    cat <<EOF | tee YAML_FILE_NAME
    name: TLS_ROUTE_NAME
    targetProxies:
    - projects/PROJECT_NUMBER/locations/REGION_A/targetTcpProxies/TARGET_TCP_PROXY_NAME
    rules:
    - matches:
      - sniHost:
        - example.com
      action:
        destinations:
        - serviceName: projects/PROJECT_NUMBER/locations/REGION_A/backendServices/BACKEND_SERVICE_NAME
    EOF
    

    更改下列內容:

    • YAML_FILE_NAME:YAML 檔案的名稱,例如 tls-route.yaml。
    • TLS_ROUTE_NAME:TLS 路由的名稱。
    • PROJECT_NUMBER:專案編號。
  6. 使用 YAML 規格檔案建立 TLS 路由資源。

    gcloud network-services tls-routes import TLS_ROUTE_NAME \
      --source=YAML_FILE_NAME \
      --location=REGION_A
    
  7. 建立轉送規則。

    gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_A \
      --region=REGION_A \
      --target-tcp-proxy=TARGET_TCP_PROXY_NAME \
      --target-tcp-proxy-region=REGION_A \
      --address=IP_ADDRESS \
      --ports=PORT_NUMBER
    

    更改下列內容:

    • FORWARDING_RULE_NAME:轉送規則的名稱。
    • NETWORK:網路名稱。
    • SUBNET_A:子網路名稱,須與負載平衡器位於相同區域。
    • IP_ADDRESS:負載平衡器的 IP 位址。
    • PORT_NUMBER:轉送規則使用的通訊埠,例如 443。

測試負載平衡器

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

  1. 確認您可以透過負載平衡器存取 HTTPS 服務。

    curl https://example.com --resolve example.com:443:IP_ADDRESS -k
    

    您會看到指令傳回代管執行個體群組中其中一個 VM 的回應,並在控制台輸出下列內容。

    "path": "/",
    "headers": {
      "host": "example.com",
      "user-agent": "curl/7.81.0",
      "accept": "*/*"
    },
    "method": "GET",
    "body": "",
    "fresh": false,
    "hostname": "example.com",
    "ip": "::ffff:10.142.0.2",
    "ips": [],
    "protocol": "https",
    "query": {},
    "subdomains": [],
    "xhr": false,
    "os": {
      "hostname": "0cd3aec9b351"
    },
    "connection": {
      "servername": "example.com"
    }
    

    您可以進一步驗證,如果提供的 SNI 主機名稱與 TLS 路由不符,或根本未提供 SNI 主機名稱,系統就會捨棄要求。

    • 使用與 example.com 不符的 SNI 主機名稱執行測試,確保連線遭到拒絕。
    curl https://unknown.com --resolve unknown.com:443:IP_ADDRESS -k
    
    • 使用不含 TLS 的純文字連線執行測試,確保連線遭到拒絕。
    curl example.com:443 --resolve example.com:443:IP_ADDRESS -k
    

    這些指令會傳回下列錯誤。

    curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection
    

    當負載平衡器拒絕這類無效連線時,您會在 proxyStatus 記錄中看到 connection_refused 錯誤代碼。

啟用全域存取權

您可以為負載平衡器啟用全域存取權,讓所有區域的用戶端都能存取。範例負載平衡器的後端仍須位於單一區域 (REGION_A)。

啟用全域存取權的區域性內部 Proxy 網路負載平衡器
啟用全域存取權的區域性內部 Proxy 網路負載平衡器 (按一下可放大)

您無法修改現有的區域轉送規則來啟用全域存取權。您必須為此建立新的轉送規則。此外,建立啟用全域存取權的轉送規則後,即無法修改。如要停用全域存取權,您必須建立新的區域存取權轉送規則,並刪除先前的全域存取權轉送規則。

如要設定全域存取權,請進行下列設定變更。

控制台

為負載平衡器建立新的轉送規則:

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

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

  2. 在「Name」(名稱) 欄中,按一下負載平衡器。

  3. 點選「前端設定」。

  4. 按一下 [Add frontend IP and port] (新增前端 IP 和通訊埠)。

  5. 輸入新轉送規則的名稱和子網路詳細資料。

  6. 在「子網路」部分,選取「backend-subnet」。

  7. 在「IP address」(IP 位址) 部分,您可以選取與現有轉送規則相同的 IP 位址、保留新的 IP 位址,或使用臨時 IP 位址。如要在多個轉送規則中共用同一個 IP 位址,您必須在建立 IP 位址時,將 IP 位址 --purpose 旗標設為 SHARED_LOADBALANCER_VIP。

  8. 在「Port number」(通訊埠編號) 輸入 110。

  9. 在「全域存取權」部分,選取「啟用」。

  10. 按一下「完成」。

  11. 按一下「Update」。

gcloud

  1. 使用 --allow-global-access 旗標,為負載平衡器建立新的轉送規則。

    gcloud compute forwarding-rules create int-tcp-forwarding-rule-global-access \
       --load-balancing-scheme=INTERNAL_MANAGED \
       --network=lb-network \
       --subnet=backend-subnet \
       --region=REGION_A \
       --target-tcp-proxy=int-tcp-target-proxy \
       --target-tcp-proxy-region=REGION_A \
       --address=int-tcp-ip-address \
       --ports=110 \
       --allow-global-access
    
  2. 您可以使用 gcloud compute forwarding-rules describe 指令,判斷轉送規則是否已啟用全域存取權。例如:

    gcloud compute forwarding-rules describe int-tcp-forwarding-rule-global-access \
       --region=REGION_A \
       --format="get(name,region,allowGlobalAccess)"
    

    啟用全域存取權後,輸出內容中轉送規則的名稱和區域後方會顯示 True。

建立用戶端 VM 以測試全域存取權

控制台

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

    前往 VM 執行個體

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

  3. 將「Name」(名稱) 設定為 test-global-access-vm。

  4. 將「可用區」設為 ZONE_B1。

  5. 點選「進階選項」。

  6. 按一下「Networking」(網路),設定下列欄位:

    1. 在「Network tags」(網路標記) 部分,輸入 allow-ssh。
    2. 在「網路介面」部分,選取下列項目:
      • Network (網路):lb-network
      • Subnet (子網路):test-global-access-subnet
  7. 點選「建立」。

gcloud

在 ZONE_B1 可用區建立用戶端 VM。

gcloud compute instances create test-global-access-vm \
    --zone=ZONE_B1 \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=test-global-access-subnet

將 ZONE_B1 替換為 REGION_B 區域中的可用區名稱。

連線至用戶端 VM 並測試連線能力

  1. 使用 ssh 連線至用戶端執行個體:

    gcloud compute ssh test-global-access-vm \
        --zone=ZONE_B1
    
  2. 使用 gcloud compute addresses describe 指令取得負載平衡器的 IP 位址:

    gcloud compute addresses describe int-tcp-ip-address \
        --region=REGION_A
    

    記下 IP 位址。

  3. 將流量傳送至負載平衡器;請將 IP_ADDRESS 替換為負載平衡器的 IP 位址:

    curl IP_ADDRESS:110
    

保留用戶端連線資訊的 Proxy 通訊協定

Proxy 網路負載平衡器會終止來自用戶端的 TCP 連線,並建立連至執行個體的新連線。根據預設,系統不會保留原本的用戶端 IP 和通訊埠資訊。

如要保留原始連線資訊並傳送至執行個體,請啟用 PROXY 通訊協定第 1 版。這個通訊協定會將另一個標頭 (當中包含來源 IP 位址、目的地 IP 位址和通訊埠編號) 做為要求的一部分傳送給執行個體。

請確認 Proxy 網路負載平衡器的後端執行個體,執行的伺服器支援 PROXY 通訊協定標頭。如果伺服器未設為支援 PROXY 通訊協定標頭,後端執行個體會傳回空白回應。

如果您為使用者流量設定 PROXY 通訊協定,也可以為健康狀態檢查設定該通訊協定。如果您在同一個通訊埠上檢查健康狀態並提供內容,請將健康狀態檢查的 --proxy-header 設為與負載平衡器設定相符。

PROXY 通訊協定標頭通常是單行使用者可讀取的文字,格式如下:

PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n

以下範例顯示 PROXY 通訊協定:

PROXY TCP4 192.0.2.1 198.51.100.1 15221 110\r\n

在上述範例中,用戶端 IP 為 192.0.2.1、負載平衡 IP 為 198.51.100.1、用戶端通訊埠為 15221,目的地通訊埠則為 110。

如果用戶端 IP 不明,負載平衡器會以下列格式產生 PROXY 通訊協定標頭:

PROXY UNKNOWN\r\n

更新目標 Proxy 的 PROXY 通訊協定標頭

您無法更新現有目標 Proxy 中的 PROXY 通訊協定標頭。您必須建立新的目標 Proxy,並為 PROXY 通訊協定標頭套用必要設定。請按照下列步驟,建立具有必要設定的新前端:

控制台

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

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

  2. 按一下要編輯的負載平衡器名稱。
  3. 按一下負載平衡器的「Edit」(編輯)。
  4. 點選「前端設定」。
  5. 刪除舊的前端 IP 和通訊埠。
  6. 按一下「Add frontend IP and port」(新增前端 IP 和通訊埠)。
    1. 在「Name」(名稱) 中輸入 int-tcp-forwarding-rule。
    2. 在「子網路」部分,選取「backend-subnet」。
    3. 在「IP address」(IP 位址) 部分,選取先前預留的 IP 位址:LB_IP_ADDRESS
    4. 在「Port number」(通訊埠編號) 部分,輸入 110。轉送規則只會轉送目的地通訊埠相符的封包。
    5. 將「Proxy protocol」(Proxy 通訊協定) 欄位的值變更為「On」(啟用)。
    6. 按一下「完成」。
  7. 按一下 [Update] (更新),儲存您所做的變更。

gcloud

  1. 在下列指令中,編輯 --proxy-header 欄位,並依據需求設為 NONE 或 PROXY_V1。

       gcloud compute target-tcp-proxies create TARGET_PROXY_NAME \
           --backend-service=BACKEND_SERVICE \
           --proxy-header=[NONE | PROXY_V1] \
           --region=REGION
       
  2. 刪除現有的轉送規則。

       gcloud compute forwarding-rules delete int-tcp-forwarding-rule \
           --region=REGION
       
  3. 建立新的轉送規則,並與目標 Proxy 建立關聯。

       gcloud compute forwarding-rules create int-tcp-forwarding-rule \
           --load-balancing-scheme=INTERNAL_MANAGED \
           --network=lb-network \
           --subnet=backend-subnet \
           --region=REGION \
           --target-tcp-proxy=TARGET_PROXY_NAME \
           --target-tcp-proxy-region=REGION \
           --address=LB_IP_ADDRESS \
           --ports=110
       

啟用工作階段相依性

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

下列程序說明如何更新區域性內部 Proxy 網路負載平衡器範例的後端服務,讓後端服務使用用戶端 IP 相依性或已產生 Cookie 的相依性。

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

控制台

如要啟用用戶端 IP 工作階段相依性,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
    前往「Load balancing」(負載平衡)
  2. 點選「後端」。
  3. 按一下「internal-tcp-proxy-bs」(您為本範例建立的後端服務名稱),然後按一下「Edit」(編輯)。
  4. 在「Backend service details」(後端服務詳細資料) 頁面中,按一下「Advanced configuration」(進階設定)。
  5. 在「工作階段相依性」下方,選取選單中的「用戶端 IP」。
  6. 按一下「Update」。

gcloud

使用下列 Google Cloud CLI 指令更新 internal-tcp-proxy-bs 後端服務,並指定用戶端 IP 工作階段相依性:

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

啟用連線排除

您可以啟用後端服務的連線排除功能,確保提供流量的執行個體在停止運作、遭到手動移除或由自動配置器移除時,使用者經歷的干擾可降至最低程度。如要進一步瞭解連線排除,請參閱「啟用連線排除」說明文件。

後續步驟