本文档介绍如何创建全球外部直通式网络负载均衡器,以在部署于多个区域的可用区级 NEG 后端之间平衡流量。
准备工作
确保您的设置符合以下前提条件。
安装 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。
设置概览
下图展示了全球外部直通式网络负载均衡器,其可用区级 NEG 后端部署在 us-west1 和 europe-west2 区域中。如需了解全球外部直通式网络负载均衡器的工作原理,请参阅概览指南中的架构部分。
在此示例中,配置了以下组件:
四个后端虚拟机:
us-west1-a可用区中的vm-us-1和vm-us-2europe-west2-a可用区中的vm-eu-1和vm-eu-2
两个具有
GCE_VM_IP端点的可用区级 NEG:- 将
vm-us-1和vm-us-2的nic0附加到us-west1-a可用区中的 NEG - 将
vm-eu-1和vm-eu-2的nic0附加到europe-west2-a可用区中的 NEG
- 将
单个全球外部直通式网络负载均衡器,用于在四个网络端点之间平衡
TCP:80流量。
设置网络和子网
此示例使用名为 lb-network 的自定义模式 VPC 网络,该网络在两个不同的区域中包含子网。
您可以配置一个全局外部直通式网络负载均衡器,使其具有GCE_VM_IP网络端点,这些端点可以引用虚拟机的网络接口,该接口的堆栈类型可以是仅限 IPv4、仅限 IPv6 或双栈。
下表总结了负载均衡器流量类型、后端虚拟机网络接口和 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 |
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如需创建仅限 IPv6 的子网,请使用以下命令:
gcloud compute networks subnets create lb-subnet-us \ --stack-type=IPV6_ONLY \ --ipv6-access-type=EXTERNAL \ --network=lb-network \ --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 的子网,请使用以下命令:
gcloud compute networks subnets create lb-subnet-eu \ --stack-type=IPV4_ONLY \ --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 \ --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
创建防火墙规则
为了安全地配置生产环境,您应创建两条单独的防火墙规则:
健康检查防火墙规则,配置为允许来自以下来源的入站流量:
- 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 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
创建后端虚拟机
在此负载均衡示例中,您将创建四个虚拟机,如设置概览部分中所述。
在此示例中,虚拟机的 nic0 接口与 lb-network VPC 网络和其中一个子网(lb-subnet-us 或 lb-subnet-eu)相关联。GCE_VM_IP 端点所引用的网络接口必须位于与可用区级 NEG 关联的同一 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 |
gcloud
使用 VM_NAME、REGION、ZONE 和 SUBNET 的下列四种组合运行 gcloud compute instances create 命令四次,创建四个虚拟机。
所有四个虚拟机的 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 网络接口的后端虚拟机,请使用以下命令。
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'
如需创建具有仅限 IPv6 网络接口的后端虚拟机,请使用以下命令。
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=IPV6_ONLY,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'
如需创建具有双栈网络接口的后端虚拟机,请使用以下命令。
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中的可用区级 NEGneg-us。可用区级 NEG 由两个网络端点组成:- 将
vm-us-1和vm-us-2的nic0附加到可用区级 NEGneg-us
- 将
europe-west2-a中的可用区级 NEGneg-eu。可用区级 NEG 由两个网络端点组成:- 将
vm-eu-1和vm-eu-2的nic0附加到可用区级 NEGneg-eu
- 将
创建具有 GCE_VM_IP 端点的新可用区级 NEG 时,您必须先将 NEG 与 VPC 子网明确关联,然后才能向 NEG 添加任何端点。负载均衡器会将数据包递送到与 NEG 关联的 VPC 子网中的网络接口。在此示例中,可用区级 NEG 的端点将指向虚拟机的 nic0。
gcloud
在
us-west1-a可用区中创建一个名为neg-us的GCE_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将端点添加到可用区级 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'在
europe-west2-a可用区中创建一个名为neg-eu的GCE_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将端点添加到可用区级 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 地址池或来自不同可用性群组的 BYOIP 全球外部 IPv4 公共委派前缀,并且未与任何 VPC 子网相关联。
配置 IPv6 转发规则时,转发规则 IP 地址会以 /96 前缀的形式分配。
gcloud
对于 IPv4 流量:
预留可用性组 0 中的第一个全球外部 IP 地址,并将其命名为
lb-ipv4-ag0。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 中的第一个全球外部 IP 地址,并将其命名为
lb-ipv6-ag0。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
配置负载平衡器
设置全球外部直通式网络负载均衡器需要创建健康检查、后端服务和转发规则。
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
将可用区级 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创建全局转发规则以处理
TCP:80流量。 您必须创建两条转发规则,以同时处理 IPv4 和 IPv6 流量。确保转发规则的 IP 版本与后端虚拟机网络接口的栈类型相匹配。
转发规则引用每个可用性组中的 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 地址称为
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
您应该会看到来自不同区域的后端虚拟机的响应,具体取决于您的位置和后端健康状况。
检查本地路由表中是否存在负载均衡器的 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 地址的数据包。 Cloud de Confiance 来宾环境负责添加此条目。
后端虚拟机上的本地路由表条目接受数据包以进行本地主机传送,其中网络堆栈将数据包传送到监听应用。然后,来自应用的响应数据包会直接发送到客户端。
请注意,负载均衡器的 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