本文說明如何建立全域外部直通式網路負載平衡器,在部署於多個區域的 VM 執行個體群組後端之間,達到流量負載平衡。
事前準備
請確認設定符合下列必要條件。
安裝 Google Cloud CLI
本指南中的操作說明使用 Google Cloud CLI 設定全域外部直通式網路負載平衡器。如要安裝,請參閱「安裝 gcloud CLI」。
必要的角色
如果您是專案建立者,系統會授予您擁有者角色 (roles/owner)。根據預設,擁有者角色 (roles/owner) 或編輯者角色 (roles/editor) 包含遵循本文件所需的權限。
如果您不是專案建立者,必須在專案中將必要權限授予適當的主體。舉例來說,主體可以是 Google 帳戶 (適用於使用者) 或服務帳戶。
如要取得設定具備 VM 執行個體群組後端的全域外部直通式網路負載平衡器所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
-
建立虛擬私有雲網路、子網路和負載平衡元件:
Compute Network Admin 角色 (
roles/compute.networkAdmin) -
建立防火牆規則:
Compute 安全管理員角色 (
roles/compute.securityAdmin) -
建立 VM 執行個體:
Compute 執行個體管理員角色 (
roles/compute.instanceAdmin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
如要進一步瞭解 Cloud Load Balancing 的角色和權限,請參閱「角色和權限」。如要進一步瞭解如何定義 IAM 政策,並為轉送規則設定條件式授權,請參閱「轉送規則的 IAM 條件」。
設定總覽
下圖顯示全域外部直通式網路負載平衡器,以及部署在 us-west1 和 europe-west2 區域的 VM 執行個體群組後端。
在本範例中,您會設定具有兩個全域外部 IP 位址的單一轉送規則,每個可用性群組各有一個。如要瞭解全域外部直通式網路負載平衡器的運作方式,請參閱總覽指南中的「架構」一節。
設定網路和子網路
本範例使用名為 lb-network 的自訂模式虛擬私有雲網路,其中包含兩個不同區域的子網路。
下表摘要說明負載平衡器流量類型、後端 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 |
本範例使用的後端位於下列區域和子網路。雖然您可以選擇要在子網路上設定的 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
建立虛擬私有雲網路。在本範例中,虛擬私有雲網路名為
lb-network。gcloud compute networks create lb-network \ --subnet-mode=custom在虛擬私有雲網路 (
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
設定防火牆規則
如要安全地設定正式環境,您應建立兩個不同的防火牆規則:
健康狀態檢查防火牆規則,設定為允許來自下列來源的輸入流量:
- Google 的健康狀態檢查 IP 範圍,以及
- 健康狀態檢查中設定的 IP 通訊協定和通訊埠
使用者流量防火牆規則,設定為允許來自下列來源的輸入流量:
- 需要存取負載平衡器的特定用戶端來源 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-a 和 europe-west2-a 區域中建立兩個 Compute Engine 區域代管執行個體群組。代管執行個體群組包含的 VM 執行個體,會代管負載平衡器的後端伺服器。為示範之用,後端會提供自己的主機名稱。
執行個體群組會參照執行個體範本,用來建立後端 VM。
下表摘要說明負載平衡器流量類型、後端 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 |
建立執行個體範本
在本範例中,您會在 us-west1 和 europe-west2 區域中建立區域執行個體範本。
gcloud
在
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'在
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-a 和 europe-west2-a 區域。
gcloud
在
us-west1-a可用區建立代管執行個體群組。gcloud compute instance-groups managed create mig-us \ --template=ig-template-us \ --size=2 \ --zone=us-west1-a
在
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 流量:
預留第一個全域外部 IP 位址,並在可用性群組 0 中命名。
lb-ipv4-ag0gcloud beta compute addresses create lb-ipv4-ag0 \ --global \ --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \ --ip-version=IPV4在可用性群組 1 中預留第二個全域外部 IP 位址
lb-ipv4-ag1。gcloud beta compute addresses create lb-ipv4-ag1 \ --global \ --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \ --ip-version=IPV4
IPv6 流量:
預留第一個全域外部 IP 位址,並在可用性群組 0 中命名。
lb-ipv6-ag0gcloud beta compute addresses create lb-ipv6-ag0 \ --global \ --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \ --ip-version=IPV6在可用性群組 1 中預留第二個全域外部 IP 位址
lb-ipv6-ag1。gcloud beta compute addresses create lb-ipv6-ag1 \ --global \ --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \ --ip-version=IPV6
設定負載平衡器
設定全球外部直通式網路負載平衡器時,需要建立健康狀態檢查、後端服務和轉送規則。
gcloud
建立設定為產生
TCP:80探測器的 TCP 健康狀態檢查。gcloud compute health-checks create tcp hc-tcp-80 \ --global \ --port=80
使用
EXTERNAL_PASSTHROUGH負載平衡機制建立全域後端服務。gcloud beta compute backend-services create lb-backend-service \ --load-balancing-scheme=EXTERNAL_PASSTHROUGH \ --health-checks=hc-tcp-80 \ --global
將執行個體群組新增至後端服務,做為後端。
將
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建立通用轉送規則,以提供
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
測試負載平衡器
取得附加至轉送規則的保留 IP 位址。
gcloud beta compute forwarding-rules describe lb-forwarding-rule-ipv4 \ --global這會傳回兩個 IP 位址,每個可用性群組各一個。這些 IP 位址稱為
IP_ADDRESS_AVAILABILITY_GROUP_0和IP_ADDRESS_AVAILABILITY_GROUP_1。將流量傳送至任一 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
查看子項轉送規則
為全域外部直通式網路負載平衡器建立轉送規則時,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:後端健康狀態不良時的連線持續性行為。