本文档介绍如何创建全球外部直通式网络负载平衡器,以平衡部署在多个区域中的可用区级 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 或双栈。
下表总结了负载均衡器流量类型、后端虚拟机网络接口和 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如需创建双栈子网,请使用以下命令:
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 流量,请使用以下命令创建仅限 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对于 IPv4 和 IPv6 流量,请使用以下命令 创建双栈子网:
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'
如需创建具有双栈网络接口的后端虚拟机,请使用以下命令。
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_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 地址
后端虚拟机的本地路由表包含 全球外部直通式网络负载平衡器。
如需检查后端虚拟机上的本地路由,请使用 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