本文档介绍了如何创建全球外部直通式网络负载平衡器,以在部署在多个区域中的虚拟机实例组后端之间平衡流量。
准备工作
确保您的设置符合以下前提条件。
安装 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。
设置概览
下图展示了一个全球外部直通式网络负载平衡器,其虚拟机实例组后端部署在 us-west1 和 europe-west2 区域中。
在此示例中,您配置了一条转发规则,其中包含两个全球外部 IP 地址,每个可用性组各一个。如需了解全球外部直通式网络负载平衡器的工作原理,请参阅概览指南中的架构部分。
设置网络和子网
此示例使用名为 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 地址范围,但 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
创建 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
配置防火墙规则
为了安全地配置生产环境,您应创建两条单独的防火墙规则:
健康检查防火墙规则,配置为允许来自以下范围的入站流量:
- 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
创建后端虚拟机实例
对于此负载均衡场景,您将在 us-west1-a 和 europe-west2-a 可用区中创建两个 Compute Engine 可用区代管式实例组。代管式实例组由托管负载均衡器后端服务器的虚拟机实例组成。出于演示目的,后端会传送其各自的主机名。
实例组引用一个实例模板,该模板用于创建后端虚拟机。
下表总结了负载均衡器流量类型、后端虚拟机网络接口和 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 \ --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'如需创建具有双栈网络接口的后端虚拟机,请使用以下命令。
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 网络接口的后端虚拟机,请使用以下命令。
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 的网络接口的后端虚拟机,请使用以下命令。
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'如需创建具有双栈网络接口的后端虚拟机,请使用以下命令。
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 网络接口的后端虚拟机,请使用以下命令。
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 地址池或来自不同可用性群组的 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
配置负载平衡器
设置全球外部直通式网络负载平衡器需要创建健康检查、后端服务和转发规则。
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 版本与后端虚拟机网络接口的堆栈类型相匹配。
转发规则引用每个可用性组中的 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 地址
后端虚拟机的本地路由表包含全局外部直通式网络负载平衡器的 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
查看子转发规则
为全球外部直通式网络负载平衡器创建转发规则时,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:后端运行状况不佳时的连接持久性行为。