本文档介绍如何创建全球外部直通式网络负载平衡器,以对 TCP、UDP、ESP、GRE、ICMP 和 ICMPv6 流量进行负载均衡。
您可以使用此类配置来执行以下操作:
对使用 TCP 或 UDP 以外的 IP 协议的流量进行负载均衡。
使用单个负载均衡器提供多种协议的服务。 例如,IPsec 服务通常会处理 ESP 和基于 UDP 的 IKE 和 NAT-T 流量的某些组合。
准备工作
确保您的设置符合以下前提条件。
安装 Google Cloud CLI
本指南中的说明使用 Google Cloud CLI 来配置全球外部直通网络负载平衡器。如需安装,请参阅安装 gcloud CLI。
所需的角色
如果您是项目创建者,则会被授予 Owner 角色 (roles/owner)。默认情况下,Owner 角色 (roles/owner) 或 Editor 角色 (roles/editor) 可提供遵循本文档所需的权限。
如果您不是项目创建者,则必须向相应的主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号。
如需获得配置具有虚拟机实例组后端的全球外部直通网络负载平衡器所需的权限,请让管理员为您授予项目的以下 IAM 角色:
-
创建 VPC 网络、子网和负载均衡组件:Compute Network Admin 角色 (
roles/compute.networkAdmin) -
创建防火墙规则:Compute Security Admin 角色 (
roles/compute.securityAdmin) -
创建虚拟机实例:Compute Instance Admin 角色 (
roles/compute.instanceAdmin)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
如需详细了解 Cloud Load Balancing 的角色和权限,请参阅角色和权限。如需详细了解如何定义 IAM 政策以针对转发规则授予有条件授权,请参阅适用于转发规则的 IAM Conditions。
设置概览
下图展示了两个全球外部直通式网络负载平衡器,它们具有相同的 IP 地址对,但各自服务于不同的 IP 协议和端口组合。如需了解全球外部直通式网络负载平衡器的工作原理,请参阅概览指南中的架构部分。
端口 80 上的
TCP负载均衡器此负载均衡器的转发规则配置为仅捕获专门到达端口
80的TCP流量。- 当数据包到达转发规则 IP 地址时,Google Cloud 首先检查该数据包是否为
TCP数据包,以及其目标端口是否正好为80。 - 如果满足这些条件,则此数据包会被此特定
TCP转发规则捕获,并根据引用的后端服务路由到后端。
- 当数据包到达转发规则 IP 地址时,Google Cloud 首先检查该数据包是否为
用于
TCP:8080和UDP流量的L3_DEFAULT负载均衡器此负载均衡器的转发规则使用
L3_DEFAULT协议,并配置为接受所有端口上的流量。在此设置中,它充当全方位规则,用于处理第一个转发规则未处理的流量(例如 UDP、ICMP 和除端口 80 之外的所有 TCP 流量)。- 如果数据包到达的转发规则 IP 地址与到达端口 80 的特定 TCP 流量规则不匹配(例如,如果是 UDP 流量、ICMP ping 或端口 8080 或 443 上的 TCP 流量),则该数据包会被
L3_DEFAULT转发规则捕获。 - 添加防火墙规则,以仅允许
TCP:8080和UDP流量到达后端虚拟机实例。 因此,即使L3_DEFAULT转发规则捕获所有端口上的所有 IP 协议流量,防火墙规则也会将负载均衡的流量限制为TCP:8080和UDP流量。 - 然后,系统会根据引用的后端服务将数据包路由到后端。
Google Cloud 会优先处理端口
80上更具体的TCP规则,然后再让剩余流量流向同一 IP 地址上的L3_DEFAULT规则。- 如果数据包到达的转发规则 IP 地址与到达端口 80 的特定 TCP 流量规则不匹配(例如,如果是 UDP 流量、ICMP ping 或端口 8080 或 443 上的 TCP 流量),则该数据包会被
设置网络和子网
此示例使用名为 lb-network 的自定义模式 VPC 网络,该网络在两个不同的区域中具有子网。
下表总结了负载均衡器流量类型、后端虚拟机网络接口和 VPC 子网堆栈类型之间的兼容性。请务必熟悉全球外部直通网络负载平衡器架构指南中概述的后端虚拟机的网络接口与 VPC 子网的兼容性要求。
| 负载平衡器流量类型 | 后端虚拟机网络接口的堆栈类型 | VPC 子网的栈类型 |
|---|---|---|
| 仅限 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
创建 VPC 网络。在此示例中,VPC 网络名为
lb-network。gcloud compute networks create lb-network --subnet-mode=custom
在 VPC 网络 (
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 地址池或来自不同可用性群组的 BYOIP 全球外部 IPv4 公开委派前缀,并且未与任何 VPC 子网相关联。
配置 IPv6 转发规则时,转发规则 IP 地址会分配为 /96 前缀。
gcloud
对于 IPv4 流量:
预留可用性组 0 中的第一个名为
lb-ipv4-ag0的全球外部 IP 地址。gcloud 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 流量:
预留可用性组 0 中的第一个名为
lb-ipv6-ag0的全球外部 IP 地址。gcloud 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 上的后端虚拟机实例。此端口和协议同时用于负载均衡和健康检查。
如需允许所有 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
创建后端虚拟机实例
在此负载均衡示例中,请在 us-west1-a 和 europe-west2-a 可用区中创建托管实例组。代管式实例组由托管负载均衡器后端服务器的虚拟机实例组成。为了演示,后端在端口 80 上运行 Apache 服务器。响应客户端请求,传送其自己的主机名。
实例组引用一个实例模板,该模板用于创建后端虚拟机。
下表总结了负载均衡器流量类型、后端虚拟机网络接口和 VPC 子网堆栈类型之间的兼容性。请务必熟悉全球外部直通网络负载平衡器架构指南中概述的后端虚拟机的网络接口与 VPC 子网的兼容性要求。
| 负载平衡器流量类型 | 后端虚拟机网络接口的堆栈类型 | VPC 子网的栈类型 |
|---|---|---|
| 仅限 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 的网络接口的后端虚拟机,请使用以下命令。
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'如需创建具有双栈网络接口的后端虚拟机,请使用以下命令。
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 网络接口的后端虚拟机,请使用以下命令。
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 的网络接口的后端虚拟机,请使用以下命令。
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'如需创建具有双栈网络接口的后端虚拟机,请使用以下命令。
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 网络接口的后端虚拟机,请使用以下命令。
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 版本与后端虚拟机网络接口的堆栈类型相匹配。
转发规则引用每个可用性组中的 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 流量到达您的后端虚拟机实例。
这些协议用于负载均衡,而 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
创建后端虚拟机实例
在此负载均衡示例中,请在 us-west1-a 和 europe-west2-a 可用区中创建托管实例组。代管式实例组由托管负载均衡器后端服务器的虚拟机实例组成。出于演示目的,后端会传送其各自的主机名。启动脚本还会将 Apache 服务器配置为监听端口 8080,而不是端口 80。
实例组引用一个实例模板,该模板用于创建后端虚拟机。
下表总结了负载均衡器流量类型、后端虚拟机网络接口和 VPC 子网堆栈类型之间的兼容性。请务必熟悉全球外部直通网络负载平衡器架构指南中概述的后端虚拟机的网络接口与 VPC 子网的兼容性要求。
| 负载平衡器流量类型 | 后端虚拟机网络接口的堆栈类型 | VPC 子网的栈类型 |
|---|---|---|
| 仅限 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 的网络接口的后端虚拟机,请使用以下命令。
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'如需创建具有双栈网络接口的后端虚拟机,请使用以下命令。
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 网络接口的后端虚拟机,请使用以下命令。
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 的网络接口的后端虚拟机,请使用以下命令。
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'如需创建具有双栈网络接口的后端虚拟机,请使用以下命令。
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 网络接口的后端虚拟机,请使用以下命令。
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 版本与后端虚拟机网络接口的堆栈类型相匹配。
转发规则引用每个可用性组中的 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。
将流量发送到负载均衡器
此过程会将外部流量发送到负载均衡器。运行以下测试以检查 ig-us-tcp-80 或 ig-eu-tcp-80 实例组是否对端口 80 上的 TCP 流量进行负载均衡,而所有其他流量(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命令返回的结果。该文本中显示了生成响应的后端虚拟机的名称,例如:Page served from: VM_NAME。响应仅来自ig-us-tcp-80或ig-eu-tcp-80实例组中的实例。这表明发送到端口 80 上的负载均衡器的 IP 地址的 TCP 流量由
TCP转发规则处理。
在端口 8080 上使用 TCP 请求验证行为
使用 curl 向负载均衡器发出 Web 请求(通过端口 8080 上的 TCP)以联系其 IP 地址。
从具有 IPv4 连接的客户端,运行以下命令:
while true; do curl -m1 IP_ADDRESS_AVAILABILITY_GROUP_0:8080; done
请注意
curl命令返回的结果。响应仅来自ig-us-l3-default或ig-eu-l3-default实例组中的实例。这表明发送到端口 8080 上的负载均衡器的 IP 地址的 TCP 流量由
L3_DEFAULT转发规则处理。
检查本地路由表中是否有负载均衡器的 IP 地址
后端虚拟机的本地路由表包含全局外部直通式网络负载平衡器的 IP 地址。
如需检查后端虚拟机上的本地路由,请使用 SSH 连接到后端虚拟机,然后运行以下命令:
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 地址。虚拟机本地路由表中的 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 来宾环境负责添加此条目。
后端虚拟机上的本地路由表条目接受数据包以进行本地主机传送,其中网络堆栈将数据包传送到监听应用。然后,来自应用的响应数据包直接发送到客户端。
请注意,负载均衡器的 IP 地址实际上并未在虚拟机的网络接口上配置。如需验证这一点,请运行以下命令:
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