設定具備可用區 NEG 後端的全域外部直通式網路負載平衡器

本文說明如何建立全域外部直通式網路負載平衡器,在多個區域部署的區域 NEG 後端之間平衡流量。

事前準備

請確認設定符合下列必要條件。

安裝 Google Cloud CLI

本指南中的操作說明使用 Google Cloud CLI 設定全域外部直通式網路負載平衡器。如要安裝,請參閱「安裝 gcloud CLI」。

必要的角色

如果您是專案建立者,系統會授予您擁有者角色 (roles/owner)。根據預設,擁有者角色 (roles/owner) 或編輯者角色 (roles/editor) 具備遵循本文的必要權限。

如果您不是專案建立者,必須將專案的必要權限授予適當的主體。舉例來說,主體可以是 Google 帳戶 (適用於一般使用者) 或服務帳戶。

如要取得設定具備 VM 執行個體群組後端的全域外部直通式網路負載平衡器所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

如要進一步瞭解 Cloud Load Balancing 的角色和權限,請參閱「角色和權限」。如要進一步瞭解如何定義 IAM 政策,並為轉送規則設定條件式授權,請參閱「轉送規則的 IAM 條件」。

設定總覽

下圖顯示全域外部直通式網路負載平衡器,以及部署在 us-west1 和 europe-west2 區域的區域 NEG 後端。如要瞭解全域外部直通式網路負載平衡器的運作方式,請參閱總覽指南中的「架構」一節。

在本範例中,系統會設定下列元件:

  • 四個後端 VM:

    • vm-us-1和vm-us-2在us-west1-a區間
    • vm-eu-1和vm-eu-2在europe-west2-a區間
  • 兩個可用區 NEG,各含 GCE_VM_IP 個端點:

    • 將 nic0 的 vm-us-1 和 vm-us-2 連結至 us-west1-a 區域中的 NEG
    • 將 nic0 的 vm-eu-1 和 vm-eu-2 連結至 europe-west2-a 區域中的 NEG
  • 單一全域外部直通式網路負載平衡器,可在四個網路端點之間平衡 TCP:80 流量。

全域外部直通式網路負載平衡器會將流量傳送至 `us-west1` 和 `europe-west2` 區域中部署的可用區 NEG 後端。
使用全域外部直通式網路負載平衡器,將流量分配至可用區 NEG 後端 (按一下即可放大)。

設定網路和子網路

這個範例使用名為 lb-network 的自訂模式虛擬私有雲網路,並在兩個不同區域中設有子網路。

您可以設定全域外部直通式網路負載平衡器,讓網路端點參照 VM 的網路介面,而該介面的堆疊類型可以是僅限 IPv4、僅限 IPv6 或雙堆疊。GCE_VM_IP

下表匯總負載平衡器流量類型、後端 VM 網路介面和虛擬私有雲子網路堆疊類型之間的相容性。請務必熟悉後端 VM 的網路介面與 VPC 子網路的相容性需求,這些需求已在全域外部直通式網路負載平衡器架構指南中說明。

負載平衡器流量類型 後端 VM 網路介面的堆疊類型 虛擬私有雲子網路的堆疊類型
僅限 IPv4 流量 IPV4_ONLY IPV4_ONLY或IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
僅限 IPv6 流量 IPV6_ONLY IPV6_ONLY或IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv4 和 IPv6 流量 IPV4_IPV6 IPV4_IPV6

gcloud

  1. 建立虛擬私有雲網路。在本範例中,虛擬私有雲網路名為 lb-network。

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 在虛擬私有雲網路 (lb-network) 中,於兩個區域建立子網路。

    在 us-west1 地區 為網路端點建立名為 lb-subnet-us 的子網路。

    如要建立僅限 IPv4 的子網路,請使用下列指令:

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV4_ONLY \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

    如要建立僅支援 IPv6 的子網路,請使用下列指令:

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV6_ONLY \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --region=us-west1
    

    如要建立雙堆疊子網路,請使用下列指令:

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

    在 europe-west2 地區為網路端點 建立名為 lb-subnet-eu 的子網路。

    如要建立僅限 IPv4 的子網路,請使用下列指令:

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV4_ONLY \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

    如要建立僅支援 IPv6 的子網路,請使用下列指令:

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV6_ONLY \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --region=europe-west2
    

    如要建立雙堆疊子網路,請使用下列指令:

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

建立防火牆規則

如要安全地設定正式環境,請建立兩項不同的防火牆規則:

  • 健康狀態檢查防火牆規則,設定為允許來自下列來源的輸入流量:

  • 使用者流量防火牆規則,設定為允許來自下列來源的輸入流量:

    • 需要存取負載平衡器的特定用戶端來源 IP 範圍,以及
    • 轉送規則中設定的 IP 通訊協定和通訊埠

注意事項:

  • 如果應用程式要為所有網際網路使用者提供服務,請為 IPv4 流量設定來源 IP 範圍 0.0.0.0/0,並為 IPv6 流量設定來源 IP 範圍 ::/0。

  • 如果您已將健康狀態檢查設定為探測負載平衡 IP 通訊協定和通訊埠,可以合併健康狀態檢查和使用者流量防火牆規則,設定單一防火牆規則。

gcloud

  • 建立防火牆規則,允許來自所有來源範圍的 TCP 流量,透過通訊埠 80 傳送至後端 VM 執行個體。這個通訊埠和通訊協定會用於負載平衡和健康狀態檢查。

    • 如要允許所有 IPv4 流量,請執行下列指令:

      gcloud compute firewall-rules create firewall-allow-traffic-ipv4 \
          --network=lb-network \
          --target-tags=allow-traffic \
          --allow=tcp:80 \
          --source-ranges=0.0.0.0/0
      
    • 如要允許所有 IPv6 流量,請執行下列指令:

      gcloud compute firewall-rules create firewall-allow-traffic-ipv6 \
          --network=lb-network \
          --target-tags=allow-traffic \
          --allow=tcp:80 \
          --source-ranges=::/0
      

建立後端 VM

在本負載平衡範例中,您會建立四部 VM,如「設定總覽」一節所示。

在本範例中,VM 的 nic0 介面會與 lb-network 虛擬私有雲網路和其中一個子網路 (lb-subnet-us 或 lb-subnet-eu) 建立關聯。GCE_VM_IP 端點參照的網路介面必須位於與區域 NEG 相關聯的相同虛擬私有雲子網路中。

下表匯總負載平衡器流量類型、後端 VM 網路介面和虛擬私有雲子網路堆疊類型之間的相容性。請務必熟悉後端 VM 的網路介面與 VPC 子網路的相容性需求,這些需求已在全域外部直通式網路負載平衡器架構指南中說明。

負載平衡器流量類型 後端 VM 網路介面的堆疊類型 虛擬私有雲子網路的堆疊類型
僅限 IPv4 流量 IPV4_ONLY IPV4_ONLY或IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
僅限 IPv6 流量 IPV6_ONLY IPV6_ONLY或IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv4 和 IPv6 流量 IPV4_IPV6 IPV4_IPV6

gcloud

執行 gcloud compute instances create 指令四次,並使用下列四種 VM_NAME、REGION、ZONE 和 SUBNET 組合,建立四個 VM。四個 VM 皆使用相同 Bash 指令碼。

VM_NAME REGION ZONE SUBNET
vm-us-1 us-west1 us-west1-a lb-subnet-us
vm-us-2 us-west1 us-west1-a lb-subnet-us
vm-eu-1 europe-west2 europe-west2-a lb-subnet-eu
vm-eu-2 europe-west2 europe-west2-a lb-subnet-eu

如要建立具有「僅限 IPv4」網路介面的後端 VM,請使用下列指令。

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-traffic \
    --network-interface=network=lb-network,subnet=SUBNET,stack-type=IPV4_ONLY \
    --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'

如要建立具有「僅限 IPv6」網路介面的後端 VM,請使用下列指令。

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-traffic \
    --network-interface=network=lb-network,subnet=SUBNET,stack-type=IPV6_ONLY,ipv6-network-tier=PREMIUM \
    --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'

如要建立具有雙重堆疊網路介面的後端 VM,請使用下列指令。

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-traffic \
    --network-interface=network=lb-network,subnet=SUBNET,stack-type=IPV4_IPV6,ipv6-network-tier=PREMIUM \
    --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'

使用 GCE_VM_IP 端點建立可用區性 NEG

在本負載平衡範例中,您會建立兩個區域 NEG,並使用 GCE_VM_IP 端點。

  • 區域性 NEG neg-us (us-west1-a 區域)。區域 NEG 包含兩個網路端點:
    • 將 nic0 的 vm-us-1 和 vm-us-2 附加至區域 NEG neg-us
  • 可用區 NEG neg-eu in europe-west2-a。區域 NEG 包含兩個網路端點:
    • 將 nic0 的 vm-eu-1 和 vm-eu-2 附加至區域 NEG neg-eu

使用 GCE_VM_IP 端點建立新的區域 NEG 時,必須先將 NEG 與虛擬私有雲子網路建立關聯,才能將任何端點新增至 NEG。負載平衡器會將封包傳送至與 NEG 相關聯的虛擬私有雲子網路中的網路介面。在本範例中,可用區 NEG 的端點會指向 VM 的 nic0。

gcloud

  1. 在 us-west1-a 可用區中建立名為 neg-us 的 GCE_VM_IP 可用區 NEG。

    gcloud compute network-endpoint-groups create neg-us \
        --network-endpoint-type=gce-vm-ip \
        --zone=us-west1-a \
        --network=lb-network \
        --subnet=lb-subnet-us
    
  2. 將端點新增至可用區 NEG neg-us。

    gcloud compute network-endpoint-groups update neg-us \
        --zone=us-west1-a \
        --add-endpoint='instance=vm-us-1' \
        --add-endpoint='instance=vm-us-2'
    
  3. 在 europe-west2-a 可用區中建立名為 neg-eu 的 GCE_VM_IP 可用區 NEG。

    gcloud compute network-endpoint-groups create neg-eu \
        --network-endpoint-type=gce-vm-ip \
        --zone=europe-west2-a \
        --network=lb-network \
        --subnet=lb-subnet-eu
    
  4. 將端點新增至可用區 NEG neg-eu。

    gcloud compute network-endpoint-groups update neg-eu \
        --zone=europe-west2-a \
        --add-endpoint='instance=vm-eu-1' \
        --add-endpoint='instance=vm-eu-2'
    

預留全域外部 IP 位址

全域外部直通式網路負載平衡器需要兩個全域外部 IP 位址,每個可用性群組各一個。這兩個 IP 位址隨後會附加至負載平衡器的轉送規則。

如果是全域外部直通式網路負載平衡器,轉送規則 IP 位址會完全與虛擬私有雲子網路分離。這些 IP 位址屬於 Google 擁有的全域外部 IP 位址集區,或是來自不同可用性群組的 BYOIP 全域外部 IPv4 公開委派前置碼,且未與任何 VPC 子網路建立關聯。

設定 IPv6 轉送規則時,系統會以 /96 前置字元的形式分配轉送規則 IP 位址。

gcloud

IPv4 流量:

  1. 預留可用性群組 0 中第一個名為 lb-ipv4-ag0 的全域外部 IP 位址。

    gcloud beta compute addresses create lb-ipv4-ag0 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \
        --ip-version=IPV4
    
  2. 在可用性群組 1 中,預留第二個全域外部 IP 位址。lb-ipv4-ag1

    gcloud beta compute addresses create lb-ipv4-ag1 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \
        --ip-version=IPV4
    

IPv6 流量:

  1. 預留可用性群組 0 中第一個名為 lb-ipv6-ag0 的全域外部 IP 位址。

    gcloud beta compute addresses create lb-ipv6-ag0 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \
        --ip-version=IPV6
    
  2. 在可用性群組 1 中,預留第二個全域外部 IP 位址。lb-ipv6-ag1

    gcloud beta compute addresses create lb-ipv6-ag1 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \
        --ip-version=IPV6
    

設定負載平衡器

設定全域外部直通式網路負載平衡器時,需要建立健康狀態檢查、後端服務和轉送規則。

gcloud

  1. 建立設定為產生 TCP:80 探測器的 TCP 健康狀態檢查

    gcloud compute health-checks create tcp hc-tcp-80 \
      --global \
      --port=80
    
  2. 使用EXTERNAL_PASSTHROUGH負載平衡機制建立全域後端服務。

    gcloud beta compute backend-services create lb-backend-service \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --health-checks=hc-tcp-80 \
      --global
    
  3. 將區域 NEG 新增至後端服務並設為後端。

    將 us-west1-a 地區中的區域 NEG 新增至後端服務。

    gcloud beta compute backend-services add-backend lb-backend-service \
        --network-endpoint-group=neg-us \
        --network-endpoint-group-zone=us-west1-a \
        --balancing-mode=RATE \
        --max-rate-per-endpoint=100000 \
        --global
    

    將 europe-west2-a 地區中的區域 NEG 新增至後端服務。

    gcloud beta compute backend-services add-backend lb-backend-service \
        --network-endpoint-group=neg-eu \
        --network-endpoint-group-zone=europe-west2-a \
        --balancing-mode=RATE \
        --max-rate-per-endpoint=100000 \
        --global
    
  4. 建立全域轉送規則,以處理 TCP:80 流量。 您必須建立兩項轉送規則,才能處理 IPv4 和 IPv6 流量。

    請確認轉送規則的 IP 版本與後端 VM 網路介面的堆疊類型相符。

    轉送規則會參照每個可用性群組的 IP 位址。

    IPv4 流量:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-ipv4 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=lb-backend-service \
      --global \
      --ip-addresses=lb-ipv4-ag0,lb-ipv4-ag1
    

    IPv6 流量:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-ipv6 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=lb-backend-service \
      --global \
      --ip-addresses=lb-ipv6-ag0,lb-ipv6-ag1
    

測試負載平衡器

  1. 取得附加至轉送規則的預留 IP 位址。

      gcloud beta compute forwarding-rules describe lb-forwarding-rule-ipv4 \
          --global
    

    系統會傳回兩個 IP 位址,每個可用性群組各一個。 這些 IP 位址分別稱為 IP_ADDRESS_AVAILABILITY_GROUP_0 和 IP_ADDRESS_AVAILABILITY_GROUP_1。

  2. 將流量傳送至任一 IP 位址。

      curl http://IP_ADDRESS_AVAILABILITY_GROUP_0
    
      curl http://IP_ADDRESS_AVAILABILITY_GROUP_1
    

視您的位置和後端健康狀態而定,您應該會看到來自不同區域後端 VM 的回應。

檢查負載平衡器 IP 位址的本機路由表

後端 VM 的本機路由表包含全域外部直通式網路負載平衡器的 IP 位址。

如要檢查後端 VM 上的本機路徑,請使用 SSH 連線至後端 VM,然後執行下列指令:

  ip route list table local

輸出內容如下所示:

local 10.1.2.5 dev ens4 proto kernel scope host src 10.1.2.5
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 136.124.69.214 dev ens4 proto 66 scope host
local 136.124.83.205 dev ens4 proto 66 scope host

在上述範例中,136.124.69.214 和 136.124.83.205 是指派給負載平衡器轉送規則的 IP 位址。VM 本機路由表中的 local 136.124.69.214 dev ens4 proto 66 scope host 和 local 136.124.83.205 dev ens4 proto 66 scope host 行項目,可讓後端接受傳送至負載平衡器 IP 位址的封包。 Cloud de Confiance 訪客環境負責新增這個項目。

後端 VM 上的本機路由表項目會接受封包,以供本機主機傳送,網路堆疊會將封包傳送至接聽應用程式。應用程式的回應封包隨即會直接傳送至用戶端。

請注意,負載平衡器的 IP 位址實際上並未在 VM 的網路介面上設定。如要驗證這一點,請執行下列指令:

  ip addr list

輸出內容如下所示。IP 位址 (136.124.69.214 和 136.124.83.205) 會顯示在區域路由表中,但不會在網路介面上設定。

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens4:  mtu 1460 qdisc fq_codel state UP group default qlen 1000
    link/ether 42:01:0a:01:02:0d brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    inet 10.1.2.13/32 metric 100 scope global dynamic ens4
       valid_lft 84283sec preferred_lft 84283sec
    inet6 fe80::4001:aff:fe01:20d/64 scope link
       valid_lft forever preferred_lft forever

後續步驟