本文說明如何建立全域外部直通式網路負載平衡器,以平衡 TCP、UDP、ESP、GRE、ICMP 和 ICMPv6 流量。
您可以透過這類設定執行下列操作:
平衡使用 TCP 或 UDP 以外 IP 通訊協定的流量。
使用單一負載平衡器提供多個通訊協定。舉例來說,IPsec 服務通常會處理 ESP 和以 UDP 為基礎的 IKE 與 NAT-T 流量組合。
事前準備
請確認設定符合下列必要條件。
安裝 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 條件」。
設定總覽
下圖顯示兩個全域外部直通式網路負載平衡器,使用相同的 IP 位址配對,但各自服務不同的 IP 通訊協定和通訊埠。如要瞭解全域外部直通式網路負載平衡器的運作方式,請參閱總覽指南中的「架構」一節。
通訊埠 80 上的
TCP負載平衡器這個負載平衡器的轉送規則已設定為僅擷取抵達通訊埠
80的TCP流量。- 封包抵達轉送規則 IP 位址時,Google Cloud 會先檢查封包是否為
TCP封包,以及目的地通訊埠是否為80。 - 如果符合這些條件,這個封包就會由這個特定
TCP轉送規則擷取,並根據參照的後端服務轉送至後端。
- 封包抵達轉送規則 IP 位址時,Google Cloud 會先檢查封包是否為
L3_DEFAULT負載平衡器,用於TCP:8080和UDP流量這個負載平衡器的轉送規則使用
L3_DEFAULT通訊協定,並設定為接受 所有通訊埠的流量。在這個設定中,這項規則會做為萬用規則,處理第一個轉送規則未處理的流量 (例如 UDP、ICMP 和通訊埠 80 以外的所有 TCP 流量)。- 如果封包傳送至轉送規則 IP 位址,但與通訊埠 80 規則上傳入的特定 TCP 流量不符 (例如 UDP 流量、ICMP ping,或通訊埠 8080 或 443 上的 TCP 流量),則此封包會由
L3_DEFAULT轉送規則擷取。 - 新增防火牆規則,只允許
TCP:8080和UDP流量傳送至後端 VM 執行個體。因此,即使L3_DEFAULT轉送規則會擷取所有通訊埠上的所有 IP 通訊協定流量,防火牆規則仍會將負載平衡流量限制為TCP:8080和UDP流量。 - 然後,系統會根據參照的後端服務,將封包轉送至後端。
Google Cloud 會優先處理通訊埠
80上較明確的TCP規則,再讓其餘流量流向相同 IP 位址的L3_DEFAULT規則。- 如果封包傳送至轉送規則 IP 位址,但與通訊埠 80 規則上傳入的特定 TCP 流量不符 (例如 UDP 流量、ICMP ping,或通訊埠 8080 或 443 上的 TCP 流量),則此封包會由
設定網路和子網路
本範例使用名為 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 位址範圍,但 Google Cloud 會自動將 /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
預留全域外部 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
設定通訊埠 80 的 TCP 流量負載平衡器
按照本節中的步驟,設定全域外部直通式網路負載平衡器,擷取通訊埠 80 上的 TCP 流量。
建立防火牆規則,只允許 TCP:80 流量
如要安全地設定正式環境,您應建立兩個不同的防火牆規則:
健康狀態檢查防火牆規則,設定為允許來自下列來源的輸入流量:
- 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 allow-traffic-tcp-80-ipv4 \ --network=lb-network \ --target-tags=allow-traffic-tcp-80 \ --allow=tcp:80 \ --source-ranges=0.0.0.0/0如要允許所有 IPv6 流量,請執行下列指令:
gcloud compute firewall-rules create allow-traffic-tcp-80-ipv6 \ --network=lb-network \ --target-tags=allow-traffic-tcp-80 \ --allow=tcp:80 \ --source-ranges=::/0
建立後端 VM 執行個體
在本負載平衡範例中,請在 us-west1-a 和 europe-west2-a 區域中建立代管執行個體群組。代管執行個體群組包含 VM 執行個體,這些執行個體會代管負載平衡器的後端伺服器。為示範用途,後端會在通訊埠 80 上執行 Apache 伺服器。回應用戶端要求時,會提供自己的主機名稱。
執行個體群組會參照執行個體範本,用來建立後端 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-tcp-80 \ --region=us-west1 \ --network=lb-network \ --subnet=lb-subnet-us \ --stack-type=IPV4_ONLY \ --tags=allow-traffic-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'如要建立具有雙堆疊網路介面的後端 VM,請使用下列指令。
gcloud compute instance-templates create ig-template-us-tcp-80 \ --region=us-west1 \ --network=lb-network \ --subnet=lb-subnet-us \ --ipv6-network-tier=PREMIUM \ --stack-type=IPV4_IPV6 \ --tags=allow-traffic-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'如要建立具有「僅限 IPv6」網路介面的後端 VM,請使用下列指令。
gcloud compute instance-templates create ig-template-us-tcp-80 \ --region=us-west1 \ --network=lb-network \ --subnet=lb-subnet-us \ --ipv6-network-tier=PREMIUM \ --stack-type=IPV6_ONLY \ --tags=allow-traffic-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'在
europe-west2區域中建立執行個體範本。如要建立具有僅支援 IPv4 網路介面的後端 VM,請使用下列指令。
gcloud compute instance-templates create ig-template-eu-tcp-80 \ --region=europe-west2 \ --network=lb-network \ --subnet=lb-subnet-eu \ --stack-type=IPV4_ONLY \ --tags=allow-traffic-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'如要建立具有雙堆疊網路介面的後端 VM,請使用下列指令。
gcloud compute instance-templates create ig-template-eu-tcp-80 \ --region=europe-west2 \ --network=lb-network \ --subnet=lb-subnet-eu \ --ipv6-network-tier=PREMIUM \ --stack-type=IPV4_IPV6 \ --tags=allow-traffic-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'如要建立具有「僅限 IPv6」網路介面的後端 VM,請使用下列指令。
gcloud compute instance-templates create ig-template-eu-tcp-80 \ --region=europe-west2 \ --network=lb-network \ --subnet=lb-subnet-eu \ --ipv6-network-tier=PREMIUM \ --stack-type=IPV6_ONLY \ --tags=allow-traffic-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'
建立區域代管執行個體群組
在本範例中,您將建立兩個區域代管執行個體群組,分別位於 us-west1-a 區域和 europe-west2-a 區域。
gcloud
在
us-west1-a可用區建立代管執行個體群組。gcloud compute instance-groups managed create ig-us-tcp-80 \ --template=ig-template-us-tcp-80 \ --size=2 \ --zone=us-west1-a
在
europe-west2-a可用區建立代管執行個體群組。gcloud compute instance-groups managed create ig-eu-tcp-80 \ --template=ig-template-eu-tcp-80 \ --size=2 \ --zone=europe-west2-a
建立 Cloud Load Balancing 元件
如要建立全域外部直通式網路負載平衡器的 Cloud Load Balancing 元件,請按照下列步驟操作。
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-tcp-80 \ --load-balancing-scheme=EXTERNAL_PASSTHROUGH \ --health-checks=hc-tcp-80 \ --global
將執行個體群組新增至後端服務,做為後端。
將
us-west1-a區域中的執行個體群組新增至後端服務。gcloud beta compute backend-services add-backend lb-backend-service-tcp-80 \ --instance-group=ig-us-tcp-80 \ --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-tcp-80 \ --instance-group=ig-eu-tcp-80 \ --instance-group-zone=europe-west2-a \ --balancing-mode=UTILIZATION \ --max-utilization=0.7 \ --global建立通用轉送規則,以便處理
TCP:80流量。請確認轉送規則的 IP 版本與後端 VM 網路介面的堆疊類型相符。
轉送規則會參照每個可用性群組的 IP 位址。
IPv4 流量:
gcloud beta compute forwarding-rules create lb-forwarding-rule-tcp-80-ipv4 \ --load-balancing-scheme=EXTERNAL_PASSTHROUGH \ --ip-protocol=TCP \ --ports=80 \ --backend-service=lb-backend-service-tcp-80 \ --global \ --ip-addresses=lb-ipv4-ag0,lb-ipv4-ag1
IPv6 流量:
gcloud beta compute forwarding-rules create lb-forwarding-rule-tcp-80-ipv6 \ --load-balancing-scheme=EXTERNAL_PASSTHROUGH \ --ip-protocol=TCP \ --ports=80 \ --backend-service=lb-backend-service-tcp-80 \ --global \ --ip-addresses=lb-ipv6-ag0,lb-ipv6-ag1
設定 TCP:8080 和 UDP 流量的負載平衡器
請按照本節的步驟,設定全域外部直通式網路負載平衡器,以處理 TCP:8080 和 UDP 流量。
建立防火牆規則,只允許 TCP:8080 和 UDP 流量
如要安全地設定正式環境,您應建立兩個不同的防火牆規則:
健康狀態檢查防火牆規則,設定為允許來自下列來源的輸入流量:
- Google 的健康狀態檢查 IP 範圍,以及
- 健康狀態檢查中設定的 IP 通訊協定和通訊埠
使用者流量防火牆規則,設定為允許來自下列來源的輸入流量:
- 需要存取負載平衡器的特定用戶端來源 IP 範圍,以及
- 轉送規則中設定的 IP 通訊協定和通訊埠
注意事項:
如果您的應用程式向所有網際網路使用者提供服務,且沒有任何限制,請為 IPv4 流量設定來源 IP 範圍
0.0.0.0/0,並為 IPv6 流量設定來源 IP 範圍::/0。如果您已將健康狀態檢查設定為探測負載平衡 IP 通訊協定和通訊埠,可以合併健康狀態檢查和使用者流量防火牆規則,設定單一防火牆規則。
gcloud
建立防火牆規則,允許來自所有來源範圍的 TCP:8080 和 UDP 流量傳送至後端 VM 執行個體。這些通訊協定用於負載平衡,而 TCP 通訊埠 8080 也用於健康狀態檢查。
如要允許 IPv4 流量傳送至
ig-us-l3-default和ig-eu-l3-default執行個體群組中的後端,請建立下列防火牆規則。gcloud compute firewall-rules create allow-traffic-l3-default-ipv4 \ --network=lb-network \ --target-tags=allow-traffic-l3-default \ --allow=tcp:8080,udp \ --source-ranges=0.0.0.0/0如要允許 IPv6 流量傳送至
ig-us-l3-default和ig-eu-l3-default執行個體群組中的後端,請建立下列防火牆規則。gcloud compute firewall-rules create allow-traffic-l3-default-ipv6 \ --network=lb-network \ --target-tags=allow-traffic-l3-default \ --allow=tcp:8080,udp \ --source-ranges=::/0
建立後端 VM 執行個體
在本負載平衡範例中,請在 us-west1-a 和 europe-west2-a 區域中建立代管執行個體群組。代管執行個體群組包含 VM 執行個體,這些執行個體會代管負載平衡器的後端伺服器。為示範之用,後端會提供自己的主機名稱。開機指令碼也會將 Apache 伺服器設定為監聽通訊埠 8080,而非通訊埠 80。
執行個體群組會參照執行個體範本,用來建立後端 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-l3-default \ --region=us-west1 \ --network=lb-network \ --subnet=lb-subnet-us \ --stack-type=IPV4_ONLY \ --tags=allow-traffic-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'如要建立具有雙堆疊網路介面的後端 VM,請使用下列指令。
gcloud compute instance-templates create ig-template-us-l3-default \ --region=us-west1 \ --network=lb-network \ --subnet=lb-subnet-us \ --ipv6-network-tier=PREMIUM \ --stack-type=IPV4_IPV6 \ --tags=allow-traffic-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'如要建立具有「僅限 IPv6」網路介面的後端 VM,請使用下列指令。
gcloud compute instance-templates create ig-template-us-l3-default \ --region=us-west1 \ --network=lb-network \ --subnet=lb-subnet-us \ --ipv6-network-tier=PREMIUM \ --stack-type=IPV6_ONLY \ --tags=allow-traffic-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'在
europe-west2區域中建立執行個體範本。如要建立具有僅支援 IPv4 網路介面的後端 VM,請使用下列指令。
gcloud compute instance-templates create ig-template-eu-l3-default \ --region=europe-west2 \ --network=lb-network \ --subnet=lb-subnet-eu \ --stack-type=IPV4_ONLY \ --tags=allow-traffic-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'如要建立具有雙堆疊網路介面的後端 VM,請使用下列指令。
gcloud compute instance-templates create ig-template-eu-l3-default \ --region=europe-west2 \ --network=lb-network \ --subnet=lb-subnet-eu \ --ipv6-network-tier=PREMIUM \ --stack-type=IPV4_IPV6 \ --tags=allow-traffic-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'如要建立具有「僅限 IPv6」網路介面的後端 VM,請使用下列指令。
gcloud compute instance-templates create ig-template-eu-l3-default \ --region=europe-west2 \ --network=lb-network \ --subnet=lb-subnet-eu \ --ipv6-network-tier=PREMIUM \ --stack-type=IPV6_ONLY \ --tags=allow-traffic-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'
建立區域代管執行個體群組
在本範例中,您將建立兩個區域代管執行個體群組,分別位於 us-west1-a 區域和 europe-west2-a 區域。
gcloud
在
us-west1-a可用區建立代管執行個體群組。gcloud compute instance-groups managed create ig-us-l3-default \ --template=ig-template-us-l3-default \ --size=2 \ --zone=us-west1-a
在
europe-west2-a可用區建立代管執行個體群組。gcloud compute instance-groups managed create ig-eu-l3-default \ --template=ig-template-eu-l3-default \ --size=2 \ --zone=europe-west2-a
建立 Cloud Load Balancing 元件
如要建立全域外部直通式網路負載平衡器的 Cloud Load Balancing 元件,請按照下列步驟操作。
gcloud
建立設定為產生
TCP:8080探測器的 TCP 健康狀態檢查。gcloud compute health-checks create tcp hc-tcp-8080 \ --global \ --port=8080
使用
EXTERNAL_PASSTHROUGH負載平衡機制建立全域後端服務。gcloud beta compute backend-services create lb-backend-service-l3-default \ --load-balancing-scheme=EXTERNAL_PASSTHROUGH \ --health-checks=hc-tcp-8080 \ --global
將執行個體群組新增至後端服務,做為後端。
將
us-west1-a區域中的執行個體群組新增至後端服務。gcloud beta compute backend-services add-backend lb-backend-service-l3-default \ --instance-group=ig-us-l3-default \ --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-l3-default \ --instance-group=ig-eu-l3-default \ --instance-group-zone=europe-west2-a \ --balancing-mode=UTILIZATION \ --max-utilization=0.7 \ --global建立
ip-protocol欄位設為L3_DEFAULT的通用轉送規則,處理所有 IP 通訊協定流量 (通訊埠 80 以外的 TCP 流量、UDP、ESP 和 ICMP)。您必須建立兩個轉送規則,才能同時處理 IPv4 和 IPv6 流量。請確認轉送規則的 IP 版本與後端 VM 網路介面的堆疊類型相符。
轉送規則會參照每個可用性群組的 IP 位址。
IPv4 流量:
gcloud beta compute forwarding-rules create lb-forwarding-rule-l3-default-ipv4 \ --load-balancing-scheme=EXTERNAL_PASSTHROUGH \ --ip-protocol=L3_DEFAULT \ --ports=all \ --backend-service=lb-backend-service-l3-default \ --global \ --ip-addresses=lb-ipv4-ag0,lb-ipv4-ag1
IPv6 流量:
gcloud beta compute forwarding-rules create lb-forwarding-rule-l3-default-ipv6 \ --load-balancing-scheme=EXTERNAL_PASSTHROUGH \ --ip-protocol=L3_DEFAULT \ --ports=all \ --backend-service=lb-backend-service-l3-default \ --global \ --ip-addresses=lb-ipv6-ag0,lb-ipv6-ag1
測試負載平衡器
負載平衡服務設定完成後,即可開始將流量傳送至負載平衡器的外部 IP 位址,並觀察流量是否分散到後端執行個體。
取得負載平衡器的外部 IP 位址
取得附加至轉送規則的保留 IP 位址。 兩個負載平衡器的轉送規則使用相同的 IP 位址配對,因此您可以使用
lb-forwarding-rule-tcp-80-ipv4或lb-forwarding-rule-l3-default-ipv4查看外部 IP 位址。gcloud compute forwarding-rules describe lb-forwarding-rule-tcp-80-ipv4 \ --global這會傳回兩個 IP 位址,每個可用性群組各一個。在後續步驟中,這些 IP 位址會稱為
IP_ADDRESS_AVAILABILITY_GROUP_0和IP_ADDRESS_AVAILABILITY_GROUP_1。
將流量傳送至負載平衡器
這個程序會將外部流量傳送至負載平衡器。執行下列測試,確認通訊埠 80 上的 TCP 流量是由 ig-us-tcp-80 或 ig-eu-tcp-80 執行個體群組進行負載平衡,而所有其他流量 (TCP:8080 和 UDP) 則是由 ig-us-l3-default 或 ig-eu-l3-default 執行個體群組進行負載平衡。
透過通訊埠 80 上的 TCP 要求驗證行為
使用
curl聯絡負載平衡器的 IP 位址,向負載平衡器發出網路要求 (透過通訊埠 80 上的 TCP)。在具備 IPv4 連線的用戶端上,執行下列指令:
while true; do curl -m1 IP_ADDRESS_AVAILABILITY_GROUP_0; done
請注意
curl指令傳回的文字。這段文字會顯示產生回應的後端 VM 名稱,例如Page served from: VM_NAME。回應只會來自ig-us-tcp-80或ig-eu-tcp-80執行個體群組中的執行個體。這表示傳送至負載平衡器 IP 位址 (通訊埠 80) 的 TCP 流量,是由
TCP轉送規則處理。
透過通訊埠 8080 上的 TCP 要求驗證行為
使用 curl 聯絡負載平衡器的 IP 位址,向負載平衡器發出網路要求 (透過通訊埠 8080 上的 TCP)。
在具備 IPv4 連線的用戶端上,執行下列指令:
while true; do curl -m1 IP_ADDRESS_AVAILABILITY_GROUP_0:8080; done
請注意
curl指令傳回的文字。回應只會來自ig-us-l3-default或ig-eu-l3-default執行個體群組中的執行個體。這表示傳送到負載平衡器 IP 位址的 TCP 流量 (通訊埠 8080) 會由
L3_DEFAULT轉送規則處理。
檢查負載平衡器的 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 位址的封包。 Google Cloud 訪客環境負責新增這個項目。
後端 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