設定具備可用區 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-west1europe-west2 地區的區域 NEG 後端。如要瞭解全域外部直通式網路負載平衡器的運作方式,請參閱總覽指南中的「架構」一節。

在本範例中,設定的元件如下:

  • 四個後端 VM:

    • vm-us-1vm-us-2us-west1-a區間
    • europe-west2-a 區間的 vm-eu-1vm-eu-2
  • 兩個具有 GCE_VM_IP 端點的區域性 NEG:

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

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

設定網路和子網路

本範例使用名為 lb-network 的自訂模式虛擬私有雲網路,其中包含兩個不同區域的子網路。

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

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

負載平衡器流量類型 後端 VM 網路介面的堆疊類型 虛擬私有雲子網路的堆疊類型
僅限 IPv4 流量 IPV4_ONLY IPV4_ONLYIPV4_IPV6
IPV4_IPV6 IPV4_IPV6
僅限 IPv6 流量 IPV6_ONLY IPV6_ONLYIPV4_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
    

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

    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 流量,請使用下列指令建立僅支援 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
    

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

    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-uslb-subnet-eu) 相關聯。GCE_VM_IP 端點參照的網路介面,必須位於與區域 NEG 相關聯的相同 VPC 子網路。

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

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

gcloud

使用下列四個 VM_NAMEREGIONZONESUBNET 的組合,透過執行 gcloud compute instances create 指令四次來建立四個 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'

如要建立具有雙堆疊網路介面的後端 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

在本負載平衡範例中,您會建立兩個具有 GCE_VM_IP 端點的區域 NEG。

  • 位於 us-west1-a 可用區的可用區 NEG neg-us。區域 NEG 包含兩個網路端點:
    • vm-us-1vm-us-2nic0 附加至可用區 NEG neg-us
  • europe-west2-a 中的可用區 NEG neg-eu。區域 NEG 包含兩個網路端點:
    • vm-eu-1vm-eu-2nic0 附加至可用區 NEG neg-eu

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

gcloud

  1. us-west1-a 可用區中建立名為 neg-usGCE_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-euGCE_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 位址與 VPC 子網路完全分離。這些 IP 位址屬於 Google 擁有的全域外部 IP 位址集區,或是來自不同可用性群組的自備 IP 全域外部 IPv4 公開委派前置碼,且未與任何虛擬私有雲子網路建立關聯。

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

gcloud

IPv4 流量

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

    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. 預留第一個全域外部 IP 位址,並在可用性群組 0 中命名。lb-ipv6-ag0

    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_0IP_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.214136.124.83.205 是指派給負載平衡器轉送規則的 IP 位址。VM 本機路由表中的 local 136.124.69.214 dev ens4 proto 66 scope hostlocal 136.124.83.205 dev ens4 proto 66 scope host 行項目,可讓後端接受傳送至負載平衡器 IP 位址的封包。 Google Cloud 訪客環境負責新增這個項目。

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

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

  ip addr list

輸出內容如下所示。IP 位址 (136.124.69.214136.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

後續步驟