針對多個 IP 通訊協定設定外部直通式網路負載平衡器

本指南提供操作說明,協助您建立以後端服務為基礎的外部直通式網路負載平衡器,對 TCP、UDP、ESP、GRE、ICMP 和 ICMPv6 流量進行負載平衡。您可以使用這類設定,對使用 TCP 或 UDP 以外 IP 通訊協定的流量進行負載平衡。目標集區型外部直通式網路負載平衡器不支援這項功能。

如要為 TCP 或 UDP 以外的 IP 通訊協定設定外部直通網路負載平衡器,請建立轉送規則,並將通訊協定設為 L3_DEFAULT。這項轉送規則會指向通訊協定設為 UNSPECIFIED後端服務。

在本範例中,我們使用兩個外部直通網路負載平衡器,將流量分配到 us-central1 區域中兩個區域性代管執行個體群組的後端 VM。兩個負載平衡器都會在同一個外部 IP 位址接收流量。

一個負載平衡器的轉送規則使用 TCP 通訊協定和通訊埠 80,另一個負載平衡器的轉送規則使用 L3_DEFAULT 通訊協定。抵達通訊埠 80 上 IP 位址的 TCP 流量,會由TCP轉送規則處理。所有不符合 TCP 專屬轉送規則的其他流量,都會由 L3_DEFAULT 轉送規則處理。

外部直通式網路負載平衡器,搭配可用區代管執行個體群組。
外部直通式網路負載平衡器,搭配可用區受管理執行個體群組 (按一下可放大)。

這個情境會將流量分散至各個健康狀態良好的執行個體中。為支援這項功能,請建立 TCP 健康狀態檢查,確保流量只會傳送至健康狀態良好的執行個體。

外部直通式網路負載平衡器是區域負載平衡器。所有負載平衡器元件都必須位於同一個區域。

事前準備

安裝 Google Cloud CLI。如需工具的完整總覽,請參閱 gcloud CLI 總覽。您可以在 API 和 gcloud 參考資料中找到與負載平衡相關的指令。

如果您先前沒有執行過 gcloud CLI,請先執行 gcloud init 指令進行驗證。

本指南假設您已熟悉 bash

設定網路和子網路

本頁面的範例使用名為 lb-network自訂模式虛擬私有雲網路。如果您只想處理 IPv4 流量,可以使用自動模式虛擬私有雲網路。不過,IPv6 流量需要自訂模式子網路

IPv6 流量也需要雙重堆疊子網路 (stack-type 設為 IPV4_IPV6)。在自訂模式虛擬私有雲網路中建立雙重堆疊子網路時,請為子網路選擇 IPv6 存取權類型。在本範例中,我們將子網路的 ipv6-access-type 參數設為 EXTERNAL。也就是說,這個子網路上的新 VM 可以同時指派外部 IPv4 位址和外部 IPv6 位址。轉送規則也可以同時指派外部 IPv4 位址和外部 IPv6 位址。

本範例使用的後端和負載平衡器元件位於這個地區和子網路:

  • 區域:us-central1
  • 子網路:lb-subnet,主要 IPv4 位址範圍為 10.1.2.0/24。雖然您可以選擇要在子網路上設定哪個 IPv4 位址範圍,但 IPv6 位址範圍是自動指派。Google 提供固定大小 (/64) 的 IPv6 CIDR 區塊。

如要建立範例網路和子網路,請按照以下步驟操作。

主控台

如要同時支援 IPv4 和 IPv6 流量,請按照下列步驟操作:

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

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

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

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

  4. 在「Subnets」(子網路) 區段中:

    • 將「Subnet creation mode」(子網路建立模式) 設為 [Custom] (自訂)
    • 在「New subnet」(新的子網路) 區段中,設定下列欄位並按一下「Done」(完成)
      • Name (名稱):lb-subnet
      • Region (區域):us-central1
      • IP stack type (IP 堆疊類型):IPv4 和 IPv6 (雙重堆疊)
      • IPv4 範圍10.1.2.0/24
        雖然您可以為子網路設定 IPv4 位址範圍,但無法選擇子網路的 IPv6 位址範圍。Google 提供固定大小 (/64) 的 IPv6 CIDR 區塊。
      • IPv6 存取權類型外部
  5. 點選「建立」

如要僅支援 IPv4 流量,請按照下列步驟操作:

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

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

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

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

  4. 在「Subnets」(子網路) 區段中:

    • 將「Subnet creation mode」(子網路建立模式) 設為 [Custom] (自訂)
    • 在「New subnet」(新的子網路) 區段中,設定下列欄位並按一下「Done」(完成)
      • Name (名稱):lb-subnet
      • Region (區域):us-central1
      • IP stack type (IP 堆疊類型):IPv4 (單一堆疊)
      • IPv4 範圍10.1.2.0/24
  5. 點選「建立」

gcloud

  1. 建立自訂模式虛擬私有雲網路:

    gcloud compute networks create lb-network \
        --subnet-mode=custom
    
  2. lb-network 網路中,為 us-central1 地區的後端建立子網路。

    如要同時處理 IPv4 和 IPv6 流量,請使用下列指令建立雙重堆疊子網路:

    gcloud compute networks subnets create lb-subnet \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-central1
    

    如要只允許 IPv4 流量,請使用下列指令:

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

建立區域代管執行個體群組

在這個負載平衡情境中,您將建立兩個 Compute Engine 區域代管執行個體群組,並在每個執行個體上安裝 Apache 網路伺服器。

如要同時處理 IPv4 和 IPv6 流量,請將後端 VM 設定為雙重堆疊。將 VM 的 stack-type 設為 IPV4_IPV6。VM 也會從子網路沿用 ipv6-access-type 設定 (在本例中為 EXTERNAL)。如要進一步瞭解 IPv6 需求,請參閱「外部直通式網路負載平衡器總覽:轉送規則」。

如要將現有 VM 做為後端,請使用 gcloud compute instances network-interfaces update 指令,將 VM 更新為雙堆疊。

做為外部直通式網路負載平衡器的後端 VM 的執行個體,必須執行適當的 Linux 訪客環境Windows 訪客環境或其他提供等效功能的處理程序。

建立執行個體群組,以處理通訊埠 80 的 TCP 流量

主控台

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

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

    1. 點選「建立執行個體範本」
    2. 在「Name」(名稱) 中輸入 ig-us-template-tcp-80
    3. 確認將開機磁碟設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明使用僅在 Debian 上可用的指令,例如 apt-get
    4. 展開「Advanced options」(進階選項) 區段。
    5. 展開「管理」部分,然後將下列指令碼複製到「開機指令碼」欄位。

      #! /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
      
    6. 展開「Networking」(網路) 區段,然後指定下列項目:

      1. 在「網路標記」部分,新增 network-lb-tcp-80
      2. 在「網路介面」部分,點選「預設」介面,然後設定下列欄位:
        1. Network (網路):lb-network
        2. Subnetwork (子網路):lb-subnet
    7. 點選「建立」

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

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

    1. 點選「建立執行個體群組」
    2. 選取「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「無狀態或有狀態的 MIG」。
    3. 在「Name」中輸入 ig-us-tcp-80
    4. 在「Location」(位置) 底下,選取 [Single zone] (單一區域)。
    5. 在「區域」部分,選取「us-central1」。
    6. 在「可用區」部分,選取 us-central1-a
    7. 在「Instance template」(執行個體範本) 下,選取 ig-us-template-tcp-80
    8. 指定要在群組中建立的執行個體數量。

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

      • 針對「Autoscaling mode」(自動調度資源模式),選取 Off:do not autoscale
      • 在「Maximum number of instances」(執行個體數量上限) 中輸入 2
    9. 點選「建立」

gcloud

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

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

    如要同時處理 IPv4 和 IPv6 流量,請使用下列指令。

      gcloud compute instance-templates create ig-us-template-tcp-80 \
          --region=us-central1 \
          --network=lb-network \
          --subnet=lb-subnet \
          --ipv6-network-tier=PREMIUM \
          --stack-type=IPV4_IPV6 \
          --tags=network-lb-tcp-80 \
          --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'
    

    如要僅處理 IPv4 流量,請使用下列指令。

      gcloud compute instance-templates create ig-us-template-tcp-80 \
          --region=us-central1 \
          --network=lb-network \
          --subnet=lb-subnet \
          --tags=network-lb-tcp-80 \
          --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" \
                  ://metadata.google.internal/computeMetadata/v1/instance/name)"
          echo "Page served from: $vm_hostname" | \
          tee /var/www/html/index.html
          systemctl restart apache2'
    
  2. 使用 gcloud compute instance-groups managed create 指令,在區域中建立代管執行個體群組。

      gcloud compute instance-groups managed create ig-us-tcp-80 \
          --zone us-central1-a \
          --size 2 \
          --template ig-us-template-tcp-80
    

在通訊埠 8080 上為 TCP、UDP、ESP 和 ICMP 流量建立執行個體群組

主控台

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

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

    1. 點選「建立執行個體範本」
    2. 在「Name」中輸入 ig-us-template-l3-default
    3. 確認將開機磁碟設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明使用僅在 Debian 上可用的指令,例如 apt-get
    4. 展開「Advanced options」(進階選項) 區段。
    5. 展開「管理」區段,然後將下列指令碼複製到「開機指令碼」欄位。開機指令碼也會將 Apache 伺服器設定為監聽通訊埠 8080,而非通訊埠 80。

      #! /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
      sed -ire 's/^Listen 80$/Listen 8080/g' /etc/apache2/ports.conf
      systemctl restart apache2
      
    6. 展開「Networking」(網路) 區段,然後指定下列項目:

      1. 在「網路標記」部分,新增 network-lb-l3-default
      2. 在「網路介面」部分,點選「預設」介面,然後設定下列欄位:
        1. Network (網路):lb-network
        2. Subnetwork (子網路):lb-subnet
    7. 點選「建立」

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

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

    1. 點選「建立執行個體群組」
    2. 選擇「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「無狀態或有狀態的 MIG」。
    3. 在「Name」中輸入 ig-us-l3-default
    4. 在「Location」(位置) 底下,選取 [Single zone] (單一區域)。
    5. 在「區域」部分,選取「us-central1」。
    6. 在「可用區」部分,選取 us-central1-c
    7. 在「Instance template」(執行個體範本) 下,選取 ig-us-template-l3-default
    8. 指定要在群組中建立的執行個體數量。

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

      • 針對「Autoscaling mode」(自動調度資源模式),選取 Off:do not autoscale
      • 在「Maximum number of instances」(執行個體數量上限) 中輸入 2
    9. 點選「建立」

gcloud

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

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

    開機指令碼也會將 Apache 伺服器設定為監聽通訊埠 8080,而非通訊埠 80。

    如要同時處理 IPv4 和 IPv6 流量,請使用下列指令。

      gcloud compute instance-templates create ig-us-template-l3-default \
          --region=us-central1 \
          --network=lb-network \
          --subnet=lb-subnet \
          --ipv6-network-tier=PREMIUM \
          --stack-type=IPV4_IPV6 \
          --tags=network-lb-l3-default \
          --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
          sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
          systemctl restart apache2'
    

    或者,如果您只想處理 IPv4 流量,請使用下列指令。

      gcloud compute instance-templates create ig-us-template-l3-default \
          --region=us-central1 \
          --network=lb-network \
          --subnet=lb-subnet \
          --tags=network-lb-l3-default \
          --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
          sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
          systemctl restart apache2'
    
  2. 使用 gcloud compute instance-groups managed create 指令,在區域中建立代管執行個體群組。

      gcloud compute instance-groups managed create ig-us-l3-default \
          --zone us-central1-c \
          --size 2 \
          --template ig-us-template-l3-default
    

設定防火牆規則

建立下列防火牆規則:

  • 防火牆規則,允許外部 TCP 流量透過通訊埠 80 抵達ig-us-tcp-80執行個體群組中的後端執行個體 (使用目標標記 network-lb-tcp-80)。請建立個別的防火牆規則,允許 IPv4 和 IPv6 流量。
  • 防火牆規則,允許其他外部流量 (通訊埠 8080 上的 TCP、UDP、ESP 和 ICMP) 傳送至ig-us-l3-default執行個體群組中的後端執行個體 (使用目標標記 network-lb-l3-default)。請建立個別的防火牆規則,允許 IPv4 和 IPv6 流量。

這個範例會建立防火牆規則,允許所有來源範圍的流量,透過設定的通訊埠傳送至後端執行個體。如要專為健康狀態檢查探測器建立個別的防火牆規則,請使用「健康狀態檢查總覽:探測器 IP 範圍和防火牆規則」一文中所述的來源 IP 位址範圍。

主控台

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

    前往「防火牆政策」頁面

  2. 如要允許 IPv4 TCP 流量進入 ig-us-tcp-80 執行個體群組中的後端,請建立下列防火牆規則。

    1. 點按「建立防火牆規則」
    2. 輸入 allow-network-lb-tcp-80-ipv4 的「Name」(名稱)
    3. 選取要套用防火牆規則的網路 (預設)。
    4. 在「Targets」(目標) 下方,選取 [Specified target tags] (指定的目標標記)
    5. 在「Target tags」(目標標記) 欄位中輸入 network-lb-tcp-80
    6. 將「Source filter」(來源篩選器) 設為「IPv4 ranges」(IPv4 範圍)
    7. 將「Source IPv4 ranges」(來源 IPv4 範圍) 設為 0.0.0.0/0,允許來自任何來源的流量。這樣一來,外部流量和健康狀態檢查探測器都能連上後端執行個體。
    8. 在「Protocols and ports」(通訊協定與通訊埠) 下方,選取「Specified protocols and ports」(指定的通訊協定與通訊埠)。然後勾選「TCP」TCP核取方塊,並輸入 80
    9. 按一下「建立」,新的防火牆規則可能需要一些時間才會顯示在主控台中,或者您可能需要按一下「重新整理」才能看到規則。
  3. 如要允許 IPv4 UDP、ESP 和 ICMP 流量傳送至 ig-us-l3-default 執行個體群組中的後端,請建立下列防火牆規則。

    1. 點按「建立防火牆規則」
    2. 輸入 allow-network-lb-l3-default-ipv4 的「Name」(名稱)
    3. 選取要套用防火牆規則的網路 (預設)。
    4. 在「Targets」(目標) 下方,選取 [Specified target tags] (指定的目標標記)
    5. 在「Target tags」(目標標記) 欄位中輸入 network-lb-l3-default
    6. 將「Source filter」(來源篩選器) 設為「IPv4 ranges」(IPv4 範圍)
    7. 將「Source IPv4 ranges」(來源 IPv4 範圍) 設為 0.0.0.0/0,允許來自任何來源的流量。這樣一來,外部流量和健康狀態檢查探測器都能連上後端執行個體。
    8. 在「Protocols and ports」(通訊協定與通訊埠) 下方,選取「Specified protocols and ports」(指定的通訊協定與通訊埠)
      1. 勾選「TCP」TCP核取方塊,然後輸入 8080
      2. 勾選「UDP」核取方塊。
      3. 選取「其他」核取方塊,然後輸入 esp, icmp
    9. 按一下「建立」,新的防火牆規則可能需要一些時間才會顯示在主控台中,或者您可能需要按一下「重新整理」才能看到規則。
  4. 如要允許 IPv6 TCP 流量進入 ig-us-tcp-80 執行個體群組中的後端,請建立下列防火牆規則。

    1. 點按「建立防火牆規則」
    2. 輸入 allow-network-lb-tcp-80-ipv6 的「Name」(名稱)
    3. 選取要套用防火牆規則的網路 (預設)。
    4. 在「Targets」(目標) 下方,選取 [Specified target tags] (指定的目標標記)
    5. 在「Target tags」(目標標記) 欄位中輸入 network-lb-tcp-80
    6. 將「Source filter」(來源篩選器) 設為「IPv6 ranges」(IPv6 範圍)
    7. 將「Source IPv6 ranges」(來源 IPv6 範圍) 設為 ::/0,允許來自任何來源的流量。這樣一來,外部流量和健康狀態檢查探測器都能連上後端執行個體。
    8. 在「Protocols and ports」(通訊協定與通訊埠) 下方,選取「Specified protocols and ports」(指定的通訊協定與通訊埠)。勾選「TCP」TCP旁邊的核取方塊,然後輸入 80
    9. 按一下「建立」,新的防火牆規則可能需要一些時間才會顯示在主控台中,或者您可能需要按一下「重新整理」才能看到規則。
  5. 如要允許 IPv6 UDP、ESP 和 ICMPv6 流量抵達 ig-us-l3-default 執行個體群組中的後端,請建立下列防火牆規則。這項防火牆規則也允許 TCP 健康狀態檢查探測器連線至通訊埠 8080 上的執行個體。

    1. 點按「建立防火牆規則」
    2. 輸入 allow-network-lb-l3-default-ipv6 的「Name」(名稱)
    3. 選取要套用防火牆規則的網路 (預設)。
    4. 在「Targets」(目標) 下方,選取 [Specified target tags] (指定的目標標記)
    5. 在「Target tags」(目標標記) 欄位中輸入 network-lb-l3-default
    6. 將「Source filter」(來源篩選器) 設為「IPv6 ranges」(IPv6 範圍)
    7. 將「Source IPv6 ranges」(來源 IPv6 範圍) 設為 ::/0,允許來自任何來源的流量。這樣一來,外部流量和健康狀態檢查探測器都能連上後端執行個體。
    8. 在「Protocols and ports」(通訊協定與通訊埠) 下方,選取「Specified protocols and ports」(指定的通訊協定與通訊埠)
      1. 勾選「TCP」TCP旁邊的核取方塊,然後輸入 8080
      2. 勾選「UDP」旁邊的核取方塊。
      3. 勾選「其他」旁邊的核取方塊,然後輸入 esp, 58
    9. 按一下「建立」,新的防火牆規則可能需要一些時間才會顯示在主控台中,或者您可能需要按一下「重新整理」才能看到規則。

gcloud

  1. 如要允許 IPv4 TCP 流量進入 ig-us-tcp-80 執行個體群組中的後端,請建立下列防火牆規則。

    gcloud compute firewall-rules create allow-network-lb-tcp-80-ipv4 \
        --network=lb-network \
        --target-tags network-lb-tcp-80 \
        --allow tcp:80 \
        --source-ranges=0.0.0.0/0
    
  2. 如要允許 IPv4 UDP、ESP 和 ICMP 流量傳送至 ig-us-l3-default 執行個體群組中的後端,請建立下列防火牆規則。這項防火牆規則也允許 TCP 健康狀態檢查探測器連線至通訊埠 8080 上的執行個體。

    gcloud compute firewall-rules create allow-network-lb-l3-default-ipv4 \
        --network=lb-network \
        --target-tags network-lb-l3-default \
        --allow tcp:8080,udp,esp,icmp \
        --source-ranges=0.0.0.0/0
    
  3. 如要允許 IPv6 TCP 流量進入 ig-us-tcp-80 執行個體群組中的後端,請建立下列防火牆規則。

    gcloud compute firewall-rules create allow-network-lb-tcp-80-ipv6 \
        --network=lb-network \
        --target-tags network-lb-tcp-80 \
        --allow tcp:80 \
        --source-ranges=::/0
    
  4. 如要允許 IPv6 UDP、ESP 和 ICMPv6 流量抵達 ig-us-l3-default 執行個體群組中的後端,請建立下列防火牆規則。這項防火牆規則也允許 TCP 健康狀態檢查探測器連線至通訊埠 8080 上的執行個體。

    gcloud compute firewall-rules create allow-network-lb-l3-default-ipv6 \
        --network=lb-network \
        --target-tags network-lb-l3-default \
        --allow tcp:8080,udp,esp,58 \
        --source-ranges=::/0
    

設定負載平衡器

接著,請設定兩個負載平衡器。將兩個負載平衡器都設定為使用相同的外部 IP 位址,以用於轉送規則。其中一個負載平衡器會處理通訊埠 80 上的 TCP 流量,另一個則會處理通訊埠 8080 上的 TCP、UDP、ESP 和 ICMP 流量。

設定負載平衡器時,後端 VM 執行個體會收到封包。這些封包會傳送至您設定的靜態外部 IP 位址。如果您是使用 Compute Engine 提供的映像檔,則會將執行個體自動設定為處理這個 IP 位址。如果您是使用任何其他映像檔,則必須將這個位址設定為 eth0 上的別名或每個執行個體上的回送。

如要設定兩個負載平衡器,請按照下列操作說明操作。

主控台

開始設定

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

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

  2. 點選「建立負載平衡器」
  3. 在「負載平衡器類型」部分,選取「網路負載平衡器 (TCP/UDP/SSL)」,然後點選「下一步」
  4. 在「直通或使用 Proxy」部分,選取「直通式負載平衡器」,然後點選「下一步」
  5. 在「公開或內部」部分,選取「公開 (外部)」,然後點選「下一步」
  6. 按一下 [設定]

基本設定

  1. 在「Name」(名稱) 欄位中,輸入新負載平衡器的名稱 backend-service-tcp-80
  2. 在「Region」(區域) 清單中選取「us-central1」。

後端設定

  1. 按一下「後端設定」
  2. 在「Backend configuration」(後端設定) 頁面中,進行下列變更:
    1. 在「New Backend」(新增後端) 區段中,選取「IP stack type」(IP 堆疊類型)。 如果您建立雙重堆疊後端來處理 IPv4 和 IPv6 流量,請選取「IPv4 和 IPv6 (雙重堆疊)」。如要僅處理 IPv4 流量,請選取「IPv4 (單一堆疊)」
    2. 在「Instance group」(執行個體群組) 清單中,選取 ig-us-tcp-80,然後按一下「Done」(完成)
    3. 在「健康狀態檢查」清單中,按一下「建立健康狀態檢查」,然後輸入下列資訊:
      • Name (名稱):tcp-health-check-80
      • Protocol (通訊協定):TCP
      • Port (通訊埠):80
    4. 按一下 [儲存]
  3. 繼續操作之前,請先驗證「Backend configuration」(後端設定) 旁是否有藍色勾號。

前端設定

  1. 按一下「前端設定」
  2. 在「Name」(名稱) 欄位中輸入 forwarding-rule-tcp-80
  3. 如要處理 IPv4 流量,請按照下列步驟操作:
    1. 在「IP version」(IP 版本) 部分,選取「IPv4」
    2. 在「Internal IP purpose」(內部 IP 用途) 區段中,選取「IP address」(IP 位址) 清單中的「Create IP address」(建立 IP 位址)
      1. 在「Name」(名稱) 欄位中輸入 network-lb-ipv4
      2. 按一下「保留」
    3. 在「Ports」(通訊埠) 部分,選擇「Single」(單個)。在「Port number」(通訊埠編號) 欄位中,輸入 80
    4. 按一下 [完成]
  4. 如要處理 IPv6 流量,請按照下列步驟操作:

    1. 在「IP version」(IP 版本) 部分,選取「IPv6」
    2. 在「Subnetwork」(子網路) 中,選取「lb-subnet」
    3. 在「IPv6 range」(IPv6 範圍) 清單中,選取「Create IP address」(建立 IP 位址)
      1. 在「Name」(名稱) 欄位中輸入 network-lb-ipv6
      2. 按一下「保留」
    4. 在「Ports」(通訊埠) 部分,選擇「Single」(單個)。在「Port number」(通訊埠編號) 欄位中,輸入 80
    5. 按一下 [完成]

    如果「Frontend configuration」(前端設定) 左邊顯示具有勾號的藍色圓圈,即表示設定成功。

檢閱設定

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

    在「Load balancing」(負載平衡) 頁面的新負載平衡器「Backend」(後端) 欄下方,您會看到綠色勾號,表示新負載平衡器健康狀態良好。

建立第二個負載平衡器

開始設定

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

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

  2. 點選「建立負載平衡器」
  3. 在「負載平衡器類型」部分,選取「網路負載平衡器 (TCP/UDP/SSL)」,然後點選「下一步」
  4. 在「直通或使用 Proxy」部分,選取「直通式負載平衡器」,然後點選「下一步」
  5. 在「公開或內部」部分,選取「公開 (外部)」,然後點選「下一步」
  6. 按一下 [設定]

基本設定

  1. 在「Name」(名稱) 欄位中,輸入新負載平衡器的名稱 backend-service-l3-default
  2. 在「Region」(區域) 清單中選取「us-central1」。

後端設定

  1. 按一下「後端設定」
  2. 在「Backend configuration」(後端設定) 頁面中,進行下列變更:
    1. 在「New Backend」(新增後端) 區段中,選取「IP stack type」(IP 堆疊類型)。 如果您建立雙重堆疊後端來處理 IPv4 和 IPv6 流量,請選取「IPv4 和 IPv6 (雙重堆疊)」。如要僅處理 IPv4 流量,請選取「IPv4 (單一堆疊)」
    2. 在「Instance group」(執行個體群組) 清單中,選取 ig-us-l3-default,然後按一下「Done」(完成)
    3. 在「通訊協定」清單中,選取「L3 (多項通訊協定)」
    4. 在「健康狀態檢查」清單中,按一下「建立健康狀態檢查」,然後輸入下列資訊:
      • Name (名稱):tcp-health-check-8080
      • Protocol (通訊協定):TCP
      • Port (通訊埠):8080
    5. 按一下 [儲存]
  3. 繼續操作之前,請先驗證「Backend configuration」(後端設定) 旁是否有藍色勾號。

前端設定

  1. 按一下「前端設定」
  2. 在「Name」(名稱) 欄位中輸入 forwarding-rule-l3-default
  3. 如要處理 IPv4 流量,請按照下列步驟操作:
    1. 在「IP version」(IP 版本) 部分,選取「IPv4」
    2. 在「Internal IP purpose」(內部 IP 用途) 區段中,選取「IP address」(IP 位址) 清單中的「Create IP address」(建立 IP 位址)
      1. 在「Name」(名稱) 欄位中輸入 network-lb-ipv4
      2. 按一下「保留」
    3. 在「通訊協定」清單中,選取「L3 (多項通訊協定)」
    4. 在「通訊埠」部分,選擇「全部」
    5. 按一下 [完成]
  4. 如要處理 IPv6 流量,請按照下列步驟操作:

    1. 在「IP version」(IP 版本) 部分,選取「IPv6」
    2. 在「Subnetwork」(子網路) 中,選取「lb-subnet」
    3. 在「IPv6 range」(IPv6 範圍) 清單中,選取「Create IP address」(建立 IP 位址)
      1. 在「Name」(名稱) 欄位中輸入 network-lb-ipv6
      2. 按一下「保留」
    4. 在「Protocol」(通訊協定) 欄位中,選取「L3 (Multiple protocols)」(L3 (多項通訊協定))
    5. 在「通訊埠」部分,選取「全部」
    6. 按一下 [完成]

    如果「Frontend configuration」(前端設定) 左邊顯示具有勾號的藍色圓圈,即表示設定成功。

檢閱設定

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

    在「Load balancing」(負載平衡) 頁面的新負載平衡器「Backend」(後端) 欄下方,您會看到綠色勾號,表示新負載平衡器健康狀態良好。

gcloud

  1. 保留靜態外部 IP 位址。

    IPv4 流量:為負載平衡器建立靜態外部 IP 位址

    gcloud compute addresses create network-lb-ipv4 \
        --region us-central1
    

    IPv6 流量:為負載平衡器建立靜態外部 IPv6 位址範圍。使用的子網路必須是雙重堆疊子網路,且具有外部 IPv6 子網路範圍。

    gcloud compute addresses create network-lb-ipv6 \
        --region us-central1 \
        --subnet lb-subnet \
        --ip-version IPV6 \
        --endpoint-type NETLB
    
  2. 為通訊埠 80 建立 TCP 健康狀態檢查。這項健康狀態檢查用於驗證 ig-us-tcp-80 執行個體群組中後端的健康狀態。

    gcloud compute health-checks create tcp tcp-health-check-80 \
        --region us-central1 \
        --port 80
    
  3. 為通訊埠 8080 建立 TCP 健康狀態檢查。這項健康狀態檢查用於驗證 ig-us-l3-default 執行個體群組中後端的健康狀態。

    gcloud compute health-checks create tcp tcp-health-check-8080 \
        --region us-central1 \
        --port 8080
    
  4. 建立第一個負載平衡器,處理通訊埠 80 上的 TCP 流量。

    1. 建立後端服務,並將通訊協定設為 TCP

      gcloud compute backend-services create backend-service-tcp-80 \
          --protocol TCP \
          --health-checks tcp-health-check-80 \
          --health-checks-region us-central1 \
          --region us-central1
      
    2. 將後端執行個體群組新增至後端服務。

      gcloud compute backend-services add-backend backend-service-tcp-80 \
          --instance-group ig-us-tcp-80 \
          --instance-group-zone us-central1-a \
          --region us-central1
      
    3. IPv4 流量:建立轉送規則,將通訊埠 80 的連入 TCP 流量轉送至後端服務。TCP 是預設的轉送規則通訊協定,不需要明確設定。

      將步驟 1 中保留的 IP 位址做為負載平衡器的靜態外部 IP 位址。

      gcloud compute forwarding-rules create forwarding-rule-tcp-80 \
          --load-balancing-scheme external \
          --region us-central1 \
          --ports 80 \
          --address network-lb-ipv4 \
          --backend-service backend-service-tcp-80
      
    4. IPv6 流量:建立轉送規則,將通訊埠 80 上的連入 TCP 流量轉送至後端服務。TCP 是預設的轉送規則通訊協定,不需要明確設定。

      使用在步驟 1 中保留的 IPv6 位址範圍,做為負載平衡器的靜態外部 IP 位址。使用的子網路必須是具有外部 IPv6 子網路範圍的雙重堆疊子網路。

      gcloud compute forwarding-rules create forwarding-rule-tcp-80 \
          --load-balancing-scheme external \
          --region us-central1 \
          --network-tier PREMIUM \
          --ip-version IPV6 \
          --subnet lb-subnet \
          --address network-lb-ipv6 \
          --ports 80 \
          --backend-service backend-service-tcp-80
      
  5. 為通訊埠 8080 上的 TCP、UDP、ESP 和 ICMP 流量建立第二個負載平衡器。

    1. 建立後端服務,並將通訊協定設為 UNSPECIFIED

      gcloud compute backend-services create backend-service-l3-default \
          --protocol UNSPECIFIED \
          --health-checks tcp-health-check-8080 \
          --health-checks-region us-central1 \
          --region us-central1
      
    2. 將後端執行個體群組新增至後端服務。

      gcloud compute backend-services add-backend backend-service-l3-default \
          --instance-group ig-us-l3-default \
          --instance-group-zone us-central1-c \
          --region us-central1
      
    3. IPv4 流量:建立轉送規則,將通訊協定設為 L3_DEFAULT,以處理所有剩餘的支援 IP 通訊協定流量 (通訊埠 8080 上的 TCP、UDP、ESP 和 ICMP)。所有通訊埠都必須設定 L3_DEFAULT 轉送規則。

      使用先前負載平衡器所用的外部 IPv4 位址。

      gcloud compute forwarding-rules create forwarding-rule-l3-default \
          --load-balancing-scheme external \
          --region us-central1 \
          --ports all \
          --ip-protocol L3_DEFAULT \
          --address network-lb-ipv4 \
          --backend-service backend-service-l3-default
      
    4. IPv6 流量:建立轉送規則,將通訊協定設為 L3_DEFAULT,以處理所有其餘支援的 IP 通訊協定流量 (通訊埠 8080 上的 TCP、UDP、ESP 和 ICMP)。所有通訊埠都必須設定 L3_DEFAULT 轉送規則。

      使用在步驟 1 中保留的 IPv6 位址範圍,做為負載平衡器的靜態外部 IP 位址。使用的子網路必須是具有外部 IPv6 子網路範圍的雙重堆疊子網路。

      gcloud compute forwarding-rules create forwarding-rule-l3-default \
          --load-balancing-scheme external \
          --region us-central1 \
          --network-tier PREMIUM \
          --ip-version IPV6 \
          --subnet lb-subnet \
          --address network-lb-ipv6 \
          --ports all \
          --ip-protocol L3_DEFAULT \
          --backend-service backend-service-l3-default
      

測試負載平衡器

負載平衡服務已設定完成,您現在可以開始將流量傳送至負載平衡器的外部 IP 位址,並觀察流量是否分散到後端執行個體。

查詢負載平衡器的外部 IP 位址

主控台

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

    前往「負載平衡元件」

  2. 在「Forwarding Rules」(轉送規則) 分頁中,找出負載平衡器使用的轉送規則。

  3. 在「IP Address」(IP 位址) 欄中,請注意為每個 IPv4 和 IPv6 轉送規則列出的外部 IP 位址。

gcloud:IPv4

輸入下列指令,查看負載平衡器所用轉送規則的外部 IP 位址。

gcloud compute forwarding-rules describe forwarding-rule-tcp-80 \
    --region us-central1

這個範例的兩個 IPv4 轉送規則使用相同的 IP 位址,因此使用 forwarding-rule-l3-default 也沒問題。

gcloud:IPv6

輸入下列指令,查看負載平衡器所用 forwarding-rule-tcp-80 轉送規則的外部 IPv6 位址。

gcloud compute forwarding-rules describe forwarding-rule-tcp-80 \
    --region us-central1

這個範例的 IPv6 轉送規則使用相同的 IP 位址,因此使用 forwarding-rule-l3-default 也沒問題。

將流量傳送至負載平衡器

這個程序會將外部流量傳送至負載平衡器。執行下列測試,確保通訊埠 80 上的 TCP 流量由 ig-us-tcp-80 執行個體群組進行負載平衡,而所有其他流量 (通訊埠 8080 上的 TCP、UDP、ESP 和 ICMP) 則由 ig-us-l3-default 執行個體群組處理。

透過通訊埠 80 上的 TCP 要求驗證行為

  1. 使用 curl 聯絡負載平衡器的 IP 位址,向負載平衡器發出網路要求 (透過通訊埠 80 上的 TCP)。

    • 在具備 IPv4 連線的用戶端上,執行下列指令:

      while true; do curl -m1 IP_ADDRESS; done
      
    • 在具備 IPv6 連線的用戶端上,執行下列指令:

      while true; do curl -m1 http://IPV6_ADDRESS; done
      

      舉例來說,如果指派的 IPv6 位址為 [2001:db8:1:1:1:1:1:1/96],則指令類似於下列指令:

      while true; do curl -m1 http://[2001:db8:1:1:1:1:1:1]; done
      
  2. 請注意 curl 指令傳回的文字。產生回應的後端 VM 名稱會顯示在該文字中,例如 Page served from: VM_NAME。回應只會來自 ig-us-tcp-80 執行個體群組中的執行個體。

    如果一開始的回應失敗,在您重試之前,可能需要等候大約 30 秒,設定才會完整載入且執行個體才會標示為健康狀態良好。

使用通訊埠 8080 上的 TCP 要求驗證行為

使用 curl 聯絡負載平衡器的 IP 位址,向負載平衡器發出網路要求 (透過通訊埠 8080 上的 TCP)。

  • 在具備 IPv4 連線的用戶端上,執行下列指令:

    while true; do curl -m1 IPV4_ADDRESS:8080; done
    
  • 在具備 IPv6 連線的用戶端上,執行下列指令:

    while true; do curl -m1 http://IPV6_ADDRESS; done
    

    舉例來說,如果指派的 IPv6 位址是 [2001:db8:1:1:1:1:1:1/96],則指令類似於下列指令:

    while true; do curl -m1 http://[2001:db8:1:1:1:1:1:1]:8080; done
    

請注意 curl 指令傳回的文字。回應只會來自 ig-us-l3-default 執行個體群組中的執行個體。

這表示傳送至負載平衡器 IP 位址 (通訊埠 8080) 的任何流量,都只會由 ig-us-l3-default 執行個體群組中的後端處理。

使用 ICMP 要求驗證行為

如要驗證 ICMP 流量的行為,請擷取 tcpdump 指令的輸出內容,確認只有 ig-us-l3-default 執行個體群組中的後端 VM 會處理傳送至負載平衡器的 ICMP 要求。

  1. 使用 SSH 連線至後端 VM。

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

      前往 VM 執行個體頁面

    2. 在虛擬機器 (VM) 執行個體清單中,找到您要連線的執行個體,然後在該列中按一下「SSH」SSH

  2. 執行下列指令,使用 tcpdump 開始監聽 ICMP 流量。

    sudo tcpdump icmp -w ~/icmpcapture.pcap -s0 -c 10000
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    

    不要關閉 SSH 視窗。

  3. 針對所有四個後端 VM 重複執行步驟 1 和 2。

  4. 向負載平衡器發出 ICMP 要求。

    如要測試 IPv4 回應,請使用 ping 聯絡負載平衡器的 IPv4 位址。

    ping IPV4_ADDRESS
    

    如要測試 IPv6 回應,請使用 ping6 聯絡負載平衡器的 IPv6 位址。

    ping6 IPV6_ADDRESS
    

    舉例來說,如果指派的 IPv6 位址是 [2001:db8:1:1:1:1:1:1/96],則指令類似於下列指令:

    ping6 2001:db8:1:1:1:1:1:1
    
  5. 返回每個 VM 開啟的 SSH 視窗,停止 tcpdump 擷取 指令。你可以使用 Ctrl+C 鍵執行這項操作。

  6. 針對每個 VM,檢查 icmpcapture.pcap 檔案中 tcpdump 指令的輸出內容。

    sudo tcpdump -r ~/icmpcapture.pcap -n
    

    如果是 ig-us-l3-default 執行個體群組中的後端 VM,您會看到類似下列的檔案項目:

    reading from file /home/[user-directory]/icmpcapture.pcap, link-type EN10MB (Ethernet)
    22:13:07.814486 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 1, length 64
    22:13:07.814513 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 1, length 64
    22:13:08.816150 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 2, length 64
    22:13:08.816175 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 2, length 64
    22:13:09.817536 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 3, length 64
    22:13:09.817560 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 3, length 64
    ...
    

    對於 ig-us-tcp-80 執行個體群組中的後端 VM,您會看到未收到任何封包,且檔案空白:

    reading from file /home/[user-directory]/icmpcapture.pcap, link-type EN10MB (Ethernet)
    

額外設定選項

使用 BYOIP 建立 IPv6 轉送規則

先前步驟中建立的負載平衡器已設定轉送規則,並將 IP version 設為 IPv4IPv6。本節提供操作說明,協助您使用自備 IP (BYOIP) 位址建立 IPv6 轉送規則。

自備 IP 位址可讓您為 Google Cloud 資源佈建及使用自己的公開 IPv6 位址。詳情請參閱「自備 IP 位址」。

使用 BYOIP 位址設定 IPv6 轉送規則前,請先完成下列步驟:

  1. 建立公開宣傳的 IPv6 前置碼
  2. 建立公開委派前置字串
  3. 建立 IPv6 子前置碼
  4. 公布前置字串

如要建立新的轉送規則,請按照下列步驟操作:

控制台

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

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

  2. 按一下要修改的負載平衡器名稱。
  3. 按一下「編輯」
  4. 按一下「前端設定」
  5. 按一下 [Add frontend IP and port] (新增前端 IP 和通訊埠)
  6. 在「New Frontend IP and port」(新增的前端 IP 和通訊埠) 區段中,指定下列項目:
    1. 選取所需的「Protocol」(通訊協定)
    2. 在「IP version」(IP 版本) 欄位中,選取「IPv6」
    3. 在「IPv6 範圍來源」欄位中,選取「BYOIP」
    4. 在「IP collection」(IP 集合) 清單中,選取您在先前步驟中建立的子前置字串,並啟用轉送規則選項。
    5. 在「IPv6 range」(IPv6 範圍) 欄位中,輸入 IPv6 位址範圍。IPv6 位址範圍的前置字串必須與 相關聯子前置字串指定的可分配前置字串長度相符。
    6. 在「Ports」(通訊埠) 欄位中輸入通訊埠號碼。
    7. 按一下 [完成]
  7. 按一下「更新」

gcloud

使用 gcloud compute forwarding-rules create 指令建立轉送規則:

gcloud compute forwarding-rules create FWD_RULE_NAME \
    --load-balancing-scheme EXTERNAL \
    --ip-protocol PROTOCOL \
    --ports ALL \
    --ip-version IPV6 \
    --region REGION_A \
    --address IPV6_CIDR_RANGE  \
    --backend-service BACKEND_SERVICE \
    --ip-collection PDP_NAME

更改下列內容:

  • FWD_RULE_NAME:轉送規則的名稱
  • PROTOCOL:轉送規則的 IP 通訊協定。預設值為 TCP。在本範例中,IP 通訊協定可以是 TCPL3_DEFAULT
  • REGION_A:轉送規則的區域
  • IPV6_CIDR_RANGE:轉送規則服務的 IPv6 位址範圍。IPv6 位址範圍的前置字串必須與 相關聯子前置字串指定的可分配前置字串長度相符。
  • BACKEND_SERVICE:後端服務的名稱
  • PDP_NAME:公開委派前置碼的名稱。PDP 必須是 EXTERNAL_IPV6_FORWARDING_RULE_CREATION 模式中的子前置字元

後續步驟