設定具備 VM 執行個體群組後端的全域外部直通式網路負載平衡器

本文說明如何建立全域外部直通式網路負載平衡器,在部署於多個區域的 VM 執行個體群組後端之間,達到流量負載平衡。

事前準備

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

安裝 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 區域的 VM 執行個體群組後端。

在本範例中,您會設定具有兩個全域外部 IP 位址的單一轉送規則,每個可用性群組各有一個。如要瞭解全域外部直通式網路負載平衡器的運作方式,請參閱總覽指南中的「架構」一節。

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

設定網路和子網路

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

下表摘要說明負載平衡器流量類型、後端 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

本範例使用的後端位於下列區域和子網路。雖然您可以選擇要在子網路上設定的 IPv4 位址範圍,但 Cloud de Confiance 會自動將 /64 IPv6 位址範圍指派給整個子網路。

  • 區域:us-west1

    • 子網路:lb-subnet-us,主要 IPv4 位址範圍為 10.1.2.0/24
  • 區域:europe-west2

    • 子網路:lb-subnet-eu,主要 IPv4 位址範圍為 10.1.3.0/24

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
    

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

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV6_ONLY \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --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
    

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

    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
    

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

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV6_ONLY \
        --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 執行個體

針對這個負載平衡情境,您將在 us-west1-aeurope-west2-a 區域中建立兩個 Compute Engine 區域代管執行個體群組。代管執行個體群組包含的 VM 執行個體,會代管負載平衡器的後端伺服器。為示範之用,後端會提供自己的主機名稱。

執行個體群組會參照執行個體範本,用來建立後端 VM。

下表摘要說明負載平衡器流量類型、後端 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

建立執行個體範本

在本範例中,您會在 us-west1europe-west2 區域中建立區域執行個體範本

gcloud

  1. us-west1 區域中建立執行個體範本

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

    gcloud compute instance-templates create ig-template-us \
        --region=us-west1 \
        --network=lb-network \
        --subnet=lb-subnet-us \
        --stack-type=IPV4_ONLY \
        --tags=allow-traffic \
        --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'
    

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

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

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

    gcloud compute instance-templates create ig-template-us \
        --region=us-west1 \
        --network=lb-network \
        --subnet=lb-subnet-us \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV6_ONLY \
        --tags=allow-traffic \
        --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. europe-west2 區域中建立執行個體範本

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

    gcloud compute instance-templates create ig-template-eu \
        --region=europe-west2 \
        --network=lb-network \
        --subnet=lb-subnet-eu \
        --stack-type=IPV4_ONLY \
        --tags=allow-traffic \
        --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'
    

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

    gcloud compute instance-templates create ig-template-eu \
        --region=europe-west2 \
        --network=lb-network \
        --subnet=lb-subnet-eu \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV4_IPV6 \
        --tags=allow-traffic \
        --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'
    

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

    gcloud compute instance-templates create ig-template-eu \
        --region=europe-west2 \
        --network=lb-network \
        --subnet=lb-subnet-eu \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV6_ONLY \
        --tags=allow-traffic \
        --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'
    

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

在本範例中,您將建立兩個區域代管執行個體群組,分別位於 us-west1-aeurope-west2-a 區域。

gcloud

  1. us-west1-a 可用區建立代管執行個體群組。

    gcloud compute instance-groups managed create mig-us \
      --template=ig-template-us \
      --size=2 \
      --zone=us-west1-a
    
  2. europe-west2-a 可用區建立代管執行個體群組。

    gcloud compute instance-groups managed create mig-eu \
      --template=ig-template-eu \
      --size=2 \
      --zone=europe-west2-a
    

預留全域外部 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. 將執行個體群組新增至後端服務,做為後端。

    us-west1-a區域中的執行個體群組新增至後端服務。

    gcloud beta compute backend-services add-backend lb-backend-service \
        --instance-group=mig-us \
        --instance-group-zone=us-west1-a \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.7 \
        --global
    

    europe-west2-a 區域中的執行個體群組新增至後端服務。

    gcloud beta compute backend-services add-backend lb-backend-service \
        --instance-group=mig-eu \
        --instance-group-zone=europe-west2-a \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.7 \
        --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 位址的封包。 Cloud de Confiance 訪客環境負責新增這個項目。

後端 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

查看子項轉送規則

為全域外部直通式網路負載平衡器建立轉送規則時,Cloud de Confiance 會產生兩個唯讀子項轉送規則,每個可用性群組各一個,確保高可用性。

如要查看轉送規則的子項轉送規則,請執行下列指令:

  gcloud beta compute forwarding-rules list

這個指令會列出專案中的所有轉送規則。唯讀子項轉送規則的名稱會附加 -ag0-ag1

您無法使用建立的父項全域轉送規則,查詢或篩選監控指標,但可以使用子項轉送規則查詢及篩選。這是因為可用性群組中的每個子項轉送規則,都會實作負載平衡流量和健康狀態檢查。

額外設定選項

本節會擴充設定範例,提供進一步自訂全域外部直通式網路負載平衡器的操作說明。這些工作為選用項目。 您可以按任何順序執行這些工作。

設定工作階段相依性

根據預設,負載平衡器的後端服務會建立工作階段親和性值設為 NONE。本節說明如何更新後端服務,以變更負載平衡器的工作階段相依性設定。

gcloud

使用下列 gcloud beta compute backend-services update 指令更新後端服務的工作階段相依性:

gcloud beta compute backend-services update BACKEND_SERVICE \
    --global \
    --session-affinity=SESSION_AFFINITY_OPTION

更改下列內容:

  • BACKEND_SERVICE:要更新的後端服務
  • SESSION_AFFINITY_OPTION:要設定的工作階段相依性選項

變更連線持續性行為

根據預設,負載平衡器的連線持續性行為會設為 DEFAULT_FOR_PROTOCOL。本節說明如何變更負載平衡器的連線持續性行為。

gcloud

使用下列 gcloud beta compute backend-services update 指令更新連線持續性行為:

gcloud beta compute backend-services update BACKEND_SERVICE \
    --global \
    --connection-persistence-on-unhealthy-backends=CONNECTION_PERSISTENCE_BEHAVIOR

更改下列內容:

  • BACKEND_SERVICE:要更新的後端服務
  • CONNECTION_PERSISTENCE_BEHAVIOR:後端健康狀態不良時的連線持續性行為。

後續步驟