使用 VM 執行個體群組後端設定傳統版 Proxy 網路負載平衡器 (TCP Proxy)

Google Cloud 傳統 Proxy 網路負載平衡器可讓您使用單一 IP 位址,為世界各地的使用者提供服務。傳統版 Proxy 網路負載平衡器會自動將流量轉送至最接近使用者的後端執行個體。

本頁說明如何設定具備目標 TCP Proxy 和 VM 執行個體群組後端的傳統 Proxy 網路負載平衡器。開始之前,請先參閱「外部 Proxy 網路負載平衡器總覽」,詳細瞭解這類負載平衡器的運作方式。

設定總覽

這個範例說明如何為同時存在於區域 A 和區域 B 的服務設定外部 Proxy 網路負載平衡器。這個範例使用一組設為透過通訊埠 110 回應要求的 Apache 伺服器來提供服務。許多瀏覽器都不接受通訊埠 110,因此測試部分使用 curl

在這個範例中,您將進行以下設定:

  1. 分布在兩個地區之間的四個執行個體
  2. 執行個體群組 (其中包含執行個體)
  3. 確認執行個體健康狀態的檢查
  4. 後端服務,可監控執行個體並避免用量超過設定值
  5. 目標 TCP Proxy
  6. 外部靜態 IPv4 位址,以及將使用者流量傳送至 Proxy 的轉送規則
  7. 外部靜態 IPv6 位址,以及將使用者流量傳送至 Proxy 的轉送規則
  8. 允許流量從負載平衡器和健康狀態檢查工具傳送至執行個體的防火牆規則

負載平衡器設定完成後,即可測試設定。

權限

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

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

詳情請參閱下列指南:

設定執行個體群組後端

本節說明如何建立基本執行個體群組,為群組新增執行個體,然後再將這些執行個體新增至已通過健康狀態檢查的後端服務。正式上線的系統通常會依據執行個體範本使用代管執行個體群組,但上述設定方式可讓您在更短時間內完成初始測試。

設定執行個體

為進行測試,請在四個執行個體中安裝 Apache (兩個執行個體群組中各有兩個執行個體)。外部 Proxy 網路負載平衡器通常不會用於 HTTP 流量,但 Apache 軟體常用於測試。

在此範例中,執行個體是使用 tcp-lb 標記建立。此標記將在防火牆規則部分用到。

主控台

建立執行個體

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

    前往 VM 執行個體

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

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

  4. 將「區域」設為 REGION_A

  5. 將「Zone」(區域) 設為 ZONE_A

  6. 點選「進階選項」

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

    • 在「網路標記」部分,輸入 tcp-lballow-health-check-ipv6
  • 按一下 [Management] (管理)。在「Startup script」(開機指令碼) 欄位中輸入下列指令碼。

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | sudo tee /var/www/html/index.html
  • 點選「建立」

  • 以相同的設定值建立 vm-a2,不過請將「Startup script」(開機指令碼) 設為:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | sudo tee /var/www/html/index.html

  • 以相同的設定值建立 vm-b1,不過請將「Region」(地區) 設為 REGION_B,以及將「Zone」(區域) 設為 ZONE_B。 在「Startup script」(開機指令碼) 欄位中,輸入下列指令碼:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | sudo tee /var/www/html/index.html

  • 以相同的設定值建立 vm-b2,不過請將「Region」(地區) 設為 REGION_B,以及將「Zone」(區域) 設為 ZONE_B。 在「Startup script」(開機指令碼) 欄位中,輸入下列指令碼:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | sudo tee /var/www/html/index.html

  • gcloud

    1. 在可用區「ZONE_A」中建立「vm-a1

      gcloud compute instances create vm-a1 \
         --image-family debian-12 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_A \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      
    2. 在可用區「ZONE_A」中建立「vm-a2

      gcloud compute instances create vm-a2 \
         --image-family debian-12 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_A \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      
    3. 在可用區「ZONE_B」中建立「vm-b1

      gcloud compute instances create vm-b1 \
         --image-family debian-12 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_B \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      
    4. 在可用區「ZONE_B」中建立「vm-b2

      gcloud compute instances create vm-b2 \
         --image-family debian-12 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_B \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      

    建立執行個體群組

    在本節中,您將在每個區域中建立執行個體群組,並新增執行個體。

    主控台

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

      前往執行個體群組

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

    3. 按一下「新增非代管執行個體群組」

    4. 將「Name」(名稱) 設為 instance-group-a

    5. 將「Zone」(區域) 設為 ZONE_A

    6. 在「Port mapping」(通訊埠對應) 下方,按一下「Add port」(新增通訊埠)。 負載平衡器會透過具名通訊埠將流量傳送至執行個體群組。建立已命名的通訊埠,將連入流量對應至特定通訊埠編號。

      1. 將「Port name」(通訊埠名稱) 設為 tcp110
      2. 將「Port numbers」(通訊埠編號) 設為 110
    7. 在「VM instances」(VM 執行個體) 之下,選取 vm-a1vm-a2

    8. 保留其他欄位的設定值。

    9. 點選「建立」

    10. 重複執行上述步驟,但為以下欄位設定不同的值:

      • Name (名稱):instance-group-b
      • Region (區域):REGION_B
      • Zone (可用區):ZONE_B
      • 「Port name」(通訊埠名稱)tcp110
      • 「Port numbers」(通訊埠編號)110
      • 「Instances」(執行個體)vm-b1vm-b2

    gcloud

    1. 建立 instance-group-a 執行個體群組。

      gcloud compute instance-groups unmanaged create instance-group-a \
         --zone ZONE_A
      
    2. 為執行個體群組建立命名通訊埠。

      gcloud compute instance-groups set-named-ports instance-group-a \
         --named-ports tcp110:110 \
         --zone ZONE_A
      
    3. vm-a1vm-a2 新增至 instance-group-a

      gcloud compute instance-groups unmanaged add-instances instance-group-a \
         --instances vm-a1,vm-a2 \
         --zone ZONE_A
      
    4. 建立 us-ig2 執行個體群組。

      gcloud compute instance-groups unmanaged create instance-group-b \
         --zone ZONE_B
      
    5. 為執行個體群組建立命名通訊埠。

      gcloud compute instance-groups set-named-ports instance-group-b \
         --named-ports tcp110:110 \
         --zone ZONE_B
      
    6. vm-b1vm-b2 新增至 instance-group-b

      gcloud compute instance-groups unmanaged add-instances instance-group-b \
         --instances vm-b1,vm-b2 \
         --zone ZONE_B
      

    現在您在每個地區都有一個執行個體群組。每個執行個體群組各有兩個 VM 執行個體。

    為外部 Proxy 網路負載平衡器建立防火牆規則

    設定防火牆,允許流量從負載平衡器和健康狀態檢查工具傳送至執行個體。為此,我們必須開啟 TCP 通訊埠 110。健康狀態檢查將使用同個通訊埠進行。由於負載平衡器與執行個體之間的流量使用 IPv4,因此只需要開啟 IPv4 範圍即可。

    主控台

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

      前往「防火牆政策」頁面

    2. 按一下「Create firewall rule」(建立防火牆規則)

    3. 在「Name」(名稱) 欄位中輸入 allow-tcp-lb-and-health

    4. 請選取網路。

    5. 在「Targets」(目標) 下方,選取 [Specified target tags] (指定的目標標記)

    6. 將「目標標記」設為 tcp-lb

    7. 將「Source filter」(來源篩選器) 設為「IPv4 ranges」(IPv4 範圍)

    8. 將「Source IPv4 ranges」(來源 IPv4 範圍) 設為 130.211.0.0/2235.191.0.0/16

    9. 在「Protocols and ports」(通訊協定和通訊埠) 下,將「Specified protocols and ports」(指定的通訊協定和通訊埠) 設為 tcp:110

    10. 點選「建立」

    gcloud

    gcloud compute firewall-rules create allow-tcp-lb-and-health \
       --source-ranges 130.211.0.0/22,35.191.0.0/16 \
       --target-tags tcp-lb \
       --allow tcp:110
    

    設定負載平衡器

    控制台

    開始設定

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

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

    2. 點選「建立負載平衡器」
    3. 在「負載平衡器類型」部分,選取「網路負載平衡器 (TCP/UDP/SSL)」,然後點選「下一步」
    4. 在「Proxy or passthrough」(直通或使用 Proxy) 部分,選取「Proxy load balancer」(Proxy 負載平衡器),然後點選「Next」(下一步)
    5. 在「公開或內部」部分選取「公開 (外部)」,接著點選「下一步」
    6. 在「Global or single region deployment」(全域或單一區域部署) 部分,選取「Best for global workloads」(最適合全域工作負載),然後點選「Next」(下一步)
    7. 在「Load balancer generation」(負載平衡器代別) 部分,選取「Classic proxy Network Load Balancer」(傳統版 Proxy 網路負載平衡器),然後點選「Next」(下一步)
    8. 按一下「Configure」(設定)

    基本設定

    將「Name」(名稱) 設為 my-tcp-lb

    後端設定

    1. 按一下「後端設定」
    2. 在「Backend type」(後端類型) 清單中,選取「Instance groups」(執行個體群組)
    3. 在「通訊協定」清單中,選取「TCP」
    4. 設定健康狀態檢查:
      • 在「健康狀態檢查」清單中,選取「建立健康狀態檢查」
      • 在「Name」(名稱) 欄位中輸入 my-tcp-health-check
      • 在「通訊協定」清單中,選取「TCP」
      • 在「Port」(通訊埠) 欄位中輸入 110
      • 保留其餘預設值。
      • 點選「建立」
    5. 設定第一個後端:
      1. 在「New backend」(新增後端) 下方,選取執行個體群組 instance-group-a
      2. 保留其餘預設值。
    6. 設定第二個後端:
      1. 點選「新增後端」
      2. 選取執行個體群組 instance-group-b
      3. 在「通訊埠編號」下方,刪除 80 並新增 110
    7. 在 Google Cloud 控制台中,確認「後端設定」旁顯示勾號。如未顯示,請重新檢查一遍,確認是否已完成所有步驟。

    前端設定

    1. 按一下「前端設定」
    2. 新增第一條轉送規則:
      1. 輸入 my-tcp-lb-forwarding-rule 的「Name」(名稱)
      2. 在「通訊協定」下方,選取「TCP」
      3. 在「IP address」(IP 位址) 下方,選取「Create IP address」(建立 IP 位址)
        1. 輸入 tcp-lb-static-ip 的「Name」(名稱)
        2. 按一下「保留」
      4. 將「Port」(通訊埠) 設為 110
      5. 在本範例中,請勿啟用「Proxy 通訊協定」,因為這項通訊協定不適用於 Apache HTTP Server 軟體。詳情請參閱「Proxy 通訊協定」。
      6. 按一下 [完成]
    3. 新增第二個轉送規則:
      1. 按一下 [Add frontend IP and port] (新增前端 IP 和通訊埠)
      2. 輸入 my-tcp-lb-ipv6-forwarding-rule 的「Name」(名稱)
      3. 在「通訊協定」下方,選取「TCP」
      4. 將「IP version」(IP 版本) 設為 IPv6
      5. 在「IP address」(IP 位址) 下方,按一下「Create IP address」(建立 IP 位址)
        1. 輸入 tcp-lb-ipv6-static-ip 名稱。
        2. 按一下「保留」
      6. 將「Port」(通訊埠) 設為 110
      7. 在本範例中,請勿啟用「Proxy 通訊協定」,因為這項通訊協定不適用於 Apache HTTP Server 軟體。詳情請參閱「Proxy 通訊協定」。
      8. 按一下 [完成]
    4. 在 Google Cloud 控制台中,確認「Frontend configuration」(前端設定) 旁顯示勾號。如未顯示,請重新檢查一遍,確認是否已完成所有先前的步驟。

    檢查並完成

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

    gcloud

    1. 建立健康狀態檢查。
          gcloud compute health-checks create tcp my-tcp-health-check --port 110
          
    2. 建立後端服務。
          gcloud compute backend-services create my-tcp-lb \
              --load-balancing-scheme EXTERNAL \
              --global-health-checks \
              --global \
              --protocol TCP \
              --health-checks my-tcp-health-check \
              --timeout 5m \
              --port-name tcp110
          
    3. 將執行個體群組新增至後端服務。
          gcloud compute backend-services add-backend my-tcp-lb \
              --global \
              --instance-group instance-group-a \
              --instance-group-zone ZONE_A \
              --balancing-mode UTILIZATION \
              --max-utilization 0.8
          
          gcloud compute backend-services add-backend my-tcp-lb \
              --global \
              --instance-group instance-group-b \
              --instance-group-zone ZONE_B \
              --balancing-mode UTILIZATION \
              --max-utilization 0.8
          
    4. 設定目標 TCP Proxy。如要啟用 Proxy 標頭,請將其設為 PROXY_V1 (而非 NONE)。
          gcloud compute target-tcp-proxies create my-tcp-lb-target-proxy \
              --backend-service my-tcp-lb \
              --proxy-header NONE
          
    5. 保留全域靜態 IPv4 和 IPv6 位址。

      您的客戶會使用這些 IP 位址來存取已平衡工作負載的服務。

          gcloud compute addresses create tcp-lb-static-ipv4 \
              --ip-version=IPV4 \
              --global
          
          gcloud compute addresses create tcp-lb-static-ipv6 \
              --ip-version=IPV6 \
              --global
          
    6. 設定兩個位址的全域轉送規則。
          gcloud compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \
              --load-balancing-scheme EXTERNAL \
              --global \
              --target-tcp-proxy my-tcp-lb-target-proxy \
              --address tcp-lb-static-ipv4 \
              --ports 110
          
          gcloud compute forwarding-rules create my-tcp-lb-ipv6-forwarding-rule \
              --load-balancing-scheme EXTERNAL \
              --global \
              --target-tcp-proxy my-tcp-lb-target-proxy \
              --address tcp-lb-static-ipv6 \
              --ports 110
          

    測試負載平衡器

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

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

      gcloud compute addresses describe tcp-lb-static-ipv4
      

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

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

      curl -m1 LB_IP_ADDRESS:110
      

      舉例來說,如果指派的 IPv6 位址為 [2001:db8:1:1:1:1:1:1/96]:110,指令應如下所示:

      curl -m1 http://[2001:db8:1:1:1:1:1:1]: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. 按一下所需負載平衡器的「Edit」(編輯)
    3. 按一下「前端設定」
    4. 將「Proxy protocol」(Proxy 通訊協定) 欄位的值變更為「On」(開啟)
    5. 按一下 [Update] (更新),儲存您所做的變更。

    gcloud

    在下列指令中,編輯 --proxy-header 欄位,並根據需求將其設為 NONEPROXY_V1

    gcloud compute target-tcp-proxies update TARGET_PROXY_NAME \
        --proxy-header=[NONE | PROXY_V1]
    

    設定工作階段相依性

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

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

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

    控制台

    如何啟用用戶端 IP 工作階段相依性:

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

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

    2. 點選「後端」

    3. 按一下「my-tcp-lb」 (您為本範例建立的後端服務名稱),然後按一下「編輯」

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

    5. 在「工作階段相依性」下方,從選單中選取「用戶端 IP」

    6. 按一下「Update」

    gcloud

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

    gcloud compute backend-services update my-tcp-lb \
        --global \
        --session-affinity=CLIENT_IP
    

    API

    如要設定用戶端 IP 工作階段相依性,請對 backendServices/patch 方法提出 PATCH 要求。

    PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/us-west1/backendServices/my-tcp-lb
    {
      "sessionAffinity": "CLIENT_IP"
    }
    

    啟用連線排除功能

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

    後續步驟