区域级外部代理网络负载均衡器是一种基于代理的区域第 4 层负载均衡器,可让您在外部区域 IP 地址后面的单个区域中运行和扩缩 TCP 服务流量。这些负载均衡器将来自互联网的外部 TCP 流量分配到同一区域中的后端。
本指南介绍如何设置具有可用区级网络端点组 (NEG) 后端的区域级外部代理网络负载均衡器。
在开始之前,请查看以下文档:
在此示例中,我们将使用负载均衡器在区域 A 的两个可用区级 NEG 中的后端虚拟机之间分配 TCP 流量。在本示例中,服务是一组配置为在端口 80
上进行响应的 Apache 服务器。
在此示例中,您将配置下图中显示的部署。
这是一个区域级负载均衡器。所有负载均衡器组件(后端实例组、后端服务、目标代理和转发规则)必须位于同一区域。
权限
若要按照本指南中的说明进行操作,您必须能够创建实例以及修改项目中的网络。您必须是项目的 Owner 或 Editor,或者必须具有以下所有 Compute Engine IAM 角色。
任务 | 所需角色 |
---|---|
创建网络、子网和负载均衡器组件 | Compute Network Admin
(roles/compute.networkAdmin ) |
添加和移除防火墙规则 | Compute Security Admin
(roles/compute.securityAdmin ) |
创建实例 | Compute Instance Admin
(roles/compute.instanceAdmin ) |
如需了解详情,请参阅以下指南:
配置网络和子网
您需要一个包含两个子网的 VPC 网络:一个用于负载均衡器的后端,另一个用于负载均衡器的代理。这是一个区域级负载均衡器。对于 VPC 网络中的流量,如果其来源所在的子网与负载均衡器位于同一区域,那么该流量会被路由到负载均衡器。
本示例使用以下 VPC 网络、区域和子网:
网络:名为
lb-network
的自定义模式 VPC 网络后端子网:区域 A 中名为
backend-subnet
的子网,其主要 IP 地址范围使用10.1.2.0/24
代理子网:区域 A 中名为
proxy-only-subnet
的子网,其主要 IP 地址范围使用10.129.0.0/23
为后端创建网络和子网
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击创建 VPC 网络。
对于名称,输入
lb-network
。在子网部分中,执行以下操作:
- 将子网创建模式设置为自定义。
- 在新子网部分中,输入以下信息:
- 名称:
backend-subnet
- 区域:
REGION_A
- IP 地址范围:
10.1.2.0/24
- 名称:
- 点击完成。
点击创建。
gcloud
如需创建自定义 VPC 网络,请使用
gcloud compute networks create
命令:gcloud compute networks create lb-network --subnet-mode=custom
如需在
REGION_A
区域的lb-network
网络中创建子网,请使用gcloud compute networks subnets create
命令:gcloud compute networks subnets create backend-subnet \ --network=lb-network \ --range=10.1.2.0/24 \ --region=REGION_A
创建代理专用子网
代理专用子网提供了一组 IP 地址,供 Google 用于代表您运行 Envoy 代理。代理会终结来自客户端的连接并创建与后端的新连接。
此代理专用子网供 lb-network
VPC 网络的区域 A 中所有基于 Envoy 的负载均衡器使用。
控制台
如果您使用的是 Google Cloud 控制台,则可以稍后在负载均衡页面上创建代理专用子网。
如需立即创建代理专用子网,请按以下步骤操作:
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击共享 VPC 网络的名称:
lb-network
。点击添加子网。
对于名称,输入
proxy-only-subnet
。对于区域,请选择
REGION_A
。将用途设置为区域级代管式代理。
对于 IP 地址范围,输入
10.129.0.0/23
。点击添加。
gcloud
如需创建代理专用子网,请使用 gcloud compute networks subnets
create
命令:
gcloud compute networks subnets create proxy-only-subnet \ --purpose=REGIONAL_MANAGED_PROXY \ --role=ACTIVE \ --region=REGION_A \ --network=lb-network \ --range=10.129.0.0/23
创建防火墙规则
在此示例中,您将创建以下防火墙规则:
fw-allow-health-check
:一种适用于经过负载均衡的 Google Cloud 实例的入站流量规则,允许来自负载均衡器和 Google Cloud 健康检查系统(130.211.0.0/22
和35.191.0.0/16
)的流量。此示例使用目标标记allow-health-check
来标识应该应用该规则的后端虚拟机。fw-allow-ssh
:一种入站流量规则,允许 TCP 端口22
上来自任何地址的传入 SSH 连接。您可以为此规则选择限制性更高的来源 IP 范围;例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 范围。此示例使用目标标记allow-ssh
来标识应该应用该规则的虚拟机。fw-allow-proxy-only-subnet
:用于代理专用子网的入站流量allow
防火墙规则,允许负载均衡器与 TCP 端口80
上的后端实例进行通信。此示例使用目标标记allow-proxy-only-subnet
来标识应该应用该规则的后端虚拟机。
控制台
在 Google Cloud 控制台中,转到防火墙页面。
点击创建防火墙规则,然后填写以下字段:
- 名称:
fw-allow-health-check
- 网络:
lb-network
- 目标:指定的目标标记
- 目标标记:
allow-health-check
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
130.211.0.0/22
和35.191.0.0/16
- 协议和端口:
- 选择指定的协议和端口。
- 选中 TCP 复选框,然后输入
80
作为端口号。
- 名称:
点击创建。
再次点击创建防火墙规则,创建允许传入 SSH 连接的规则:
- 名称:
fw-allow-ssh
- 网络:
lb-network
- 优先级:
1000
- 流量方向:入站
- 对匹配项执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-ssh
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
0.0.0.0/0
- 协议和端口:
- 选择指定的协议和端口。
- 选中 TCP 复选框,然后输入
22
作为端口号。
- 名称:
点击创建。
第三次点击创建防火墙规则,以创建允许从代理专用子网到 Google Cloud 后端的传入连接的规则:
- 名称:
fw-allow-proxy-only-subnet
- 网络:
lb-network
- 优先级:
1000
- 流量方向:入站
- 对匹配项执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-proxy-only-subnet
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
10.129.0.0/23
- 协议和端口:
- 选择指定的协议和端口。
- 选中 TCP 复选框,然后输入
80
作为端口号。
- 名称:
点击创建。
gcloud
创建
fw-allow-health-check
规则,以允许 Google Cloud 健康检查通过 TCP 端口80
访问后端实例:gcloud compute firewall-rules create fw-allow-health-check \ --network=lb-network \ --action=allow \ --direction=ingress \ --target-tags=allow-health-check \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --rules=tcp:80
创建
fw-allow-ssh
防火墙规则,允许通过 SSH 连接到网络标记为allow-ssh
的虚拟机。如果省略source-ranges
,Google Cloud 会将规则解释为表示所有来源。gcloud compute firewall-rules create fw-allow-ssh \ --network=lb-network \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
为代理专用子网创建入站流量允许防火墙规则,以允许负载均衡器与 TCP 端口
80
上的后端实例进行通信:gcloud compute firewall-rules create fw-allow-proxy-only-subnet \ --network=lb-network \ --action=allow \ --direction=ingress \ --target-tags=allow-proxy-only-subnet \ --source-ranges=10.129.0.0/23 \ --rules=tcp:80
预留负载均衡器的 IP 地址
控制台
在 Google Cloud 控制台中,进入预留静态地址页面。
为新地址选择一个名称。
对于网络服务层级,请选择标准。
在 IP 版本部分,选择 IPv4。系统不支持 IPv6 地址。
对于类型,请选择区域。
对于区域,请选择
REGION_A
。将附加目标选项设置为无。创建负载均衡器后,此 IP 地址会关联到负载均衡器的转发规则。
点击预留以预留该 IP 地址。
gcloud
如需预留静态外部 IP 地址,请使用
gcloud compute addresses create
命令:gcloud compute addresses create ADDRESS_NAME \ --region=REGION_A \ --network-tier=STANDARD
将
ADDRESS_NAME
替换为您要为此地址指定的名称。如需查看结果,请使用
gcloud compute addresses describe
命令:gcloud compute addresses describe ADDRESS_NAME
设置可用区级 NEG
在区域 A 中设置具有 GCE_VM_IP_PORT
类型端点的可用区级 NEG。首先创建虚拟机,然后创建可用区级 NEG 并将虚拟机的网络端点添加到此 NEG。
创建虚拟机
控制台
在 Google Cloud 控制台中,转到虚拟机实例页面。
点击创建实例。
将名称设置为
vm-a1
。对于区域,请选择
REGION_A
。对于可用区,请选择
ZONE_A
。在启动磁盘部分中,确保为启动磁盘选项选择了 Debian GNU/Linux 12 (bookworm)。如有必要,请点击选择以更改映像。
点击高级选项。
点击网络,然后配置以下字段:
- 在网络标记字段中,输入
allow-ssh
、allow-health-check
和allow-proxy-only-subnet
。 - 对于网络接口,请选择以下内容:
- 网络:
lb-network
- 子网:
backend-subnet
- 网络:
- 在网络标记字段中,输入
点击管理。将以下脚本输入到启动脚本字段中:
#! /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-a2
| 可用区:ZONE_A
- 名称:
vm-b1
| 可用区:ZONE_B
- 名称:
vm-b2
| 可用区:ZONE_B
- 名称:
gcloud
如需创建虚拟机,请使用两次 gcloud compute instances create
命令。使用以下 VM_NAME
和 ZONE
组合。两个虚拟机的脚本内容相同:
VM_NAME
:vm-a1
和ZONE
:ZONE_A
VM_NAME
:vm-a2
和ZONE
:ZONE_A
VM_NAME
:vm-b1
和ZONE
:ZONE_B
VM_NAME
:vm-b2
和ZONE
:ZONE_B
gcloud compute instances create VM_NAME \ --zone=ZONE \ --image-family=debian-12 \ --image-project=debian-cloud \ --tags=allow-ssh,allow-health-check,allow-proxy-only-subnet \ --subnet=backend-subnet \ --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'
创建可用区级 NEG
控制台
创建可用区级网络端点组
在 Google Cloud 控制台中,进入网络端点组页面。
点击创建网络端点组。
对于名称,输入
zonal-neg-a
。对于网络端点组类型,选择网络端点组(可用区级)。
对于网络,请选择
lb-network
。对于子网,请选择
backend-subnet
。对于可用区,请选择
ZONE_A
。对于默认端口,输入
80
。点击创建。
重复执行此部分中的所有步骤,以创建第二个可用区级 NEG 并对设置进行以下更改:
- 名称:
zonal-neg-b
- 可用区:
ZONE_B
- 名称:
将端点添加到可用区级 NEG
在 Google Cloud 控制台中,进入网络端点组页面。
点击您在上一步中创建的网络端点组的名称(例如
zonal-neg-a
)。在网络端点组详情页面的此组中的网络端点部分中,点击添加网络端点。
选择虚拟机实例(例如
vm-a1
)。网络接口部分会显示虚拟机名称、可用区和子网。
- 在 IP 地址字段中,输入新网络端点的 IP 地址。如需获取该 IP 地址,请点击检查 nic0 中的主要 IP 地址和别名 IP 范围。
- 在端口类型字段中,选择默认。网络端点组中的所有端点都会使用默认端口
80
。这足以满足我们的示例需求,因为 Apache 服务器是在端口80
处理请求。 - 点击创建。
点击添加网络端点。选择第二个虚拟机实例
vm-a2
,然后重复上述步骤,以将其端点添加到zonal-neg-a
。重复本部分中的所有步骤,以将
vm-b1
和vm-b2
中的端点添加到zonal-neg-b
。
gcloud
在
ZONE_A
可用区中创建具有GCE_VM_IP_PORT
端点的可用区级 NEG:gcloud compute network-endpoint-groups create zonal-neg-a \ --network-endpoint-type=GCE_VM_IP_PORT \ --zone=ZONE_A \ --network=lb-network \ --subnet=backend-subnet
您可以在创建 NEG 时指定
--default-port
,也可以为每个端点指定端口号,如下一步所示。将端点添加到可用区级 NEG:
gcloud compute network-endpoint-groups update zonal-neg-a \ --zone=ZONE_A \ --add-endpoint='instance=vm-a1,port=80' \ --add-endpoint='instance=vm-a2,port=80'
在
ZONE_B
可用区中创建具有GCE_VM_IP_PORT
端点的可用区级 NEG:gcloud compute network-endpoint-groups create zonal-neg-b \ --network-endpoint-type=GCE_VM_IP_PORT \ --zone=ZONE_B \ --network=lb-network \ --subnet=backend-subnet
您可以在创建 NEG 时指定
--default-port
,也可以为每个端点指定端口号,如下一步所示。将端点添加到可用区级 NEG:
gcloud compute network-endpoint-groups update zonal-neg-b \ --zone=ZONE_B \ --add-endpoint='instance=vm-b1,port=80' \ --add-endpoint='instance=vm-b2,port=80'
配置负载均衡器
控制台
开始配置
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击创建负载均衡器。
- 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步。
- 对于代理或直通,选择代理负载均衡器,然后点击下一步。
- 在公共或内部字段中,选择公共(外部),然后点击下一步。
- 对于全球或单区域部署,选择最适合区域级工作负载,然后点击下一步。
- 点击配置。
基本配置
- 对于名称,输入
my-ext-tcp-lb
。 - 对于区域,请选择
REGION_A
。 - 对于网络,请选择
lb-network
。
预留代理专用子网
- 点击预留子网。
- 对于名称,输入
proxy-only-subnet
。 - 对于 IP 地址范围,输入
10.129.0.0/23
。 - 点击添加。
配置后端
- 点击后端配置。
- 对于后端类型,选择可用区级网络端点组。
- 对于 Protocol(协议),选择 TCP。
- 配置第一个后端:
- 在新后端字段中,选择可用区级 NEG
zonal-neg-a
。 - 保留其余的默认值,然后点击完成。
- 在新后端字段中,选择可用区级 NEG
- 配置第二个后端:
- 点击添加后端。
- 在新后端字段中,选择实例组
zonal-neg-b
。 - 保留其余的默认值,然后点击完成。
- 配置健康检查:
- 在健康检查字段中,选择创建健康检查。
- 将健康检查名称设置为
tcp-health-check
。 - 对于 Protocol(协议),选择 TCP。
- 对于端口,请输入
80
。
- 保留其余的默认值,然后点击保存。
- 在 Google Cloud 控制台中,验证后端配置旁边显示了对勾标记。如果没有显示对勾标记,请仔细检查您是否已完成所有步骤。
配置前端
- 点击前端配置。
- 对于名称,输入
ext-tcp-forwarding-rule
。 - 对于子网,选择
backend-subnet
。 - 在 IP 地址字段中,选择
ext-tcp-ip-address
。 - 对于端口号,输入
9090
。转发规则仅转发具有匹配目标端口的数据包。 - 在代理协议字段中,选择关闭,因为 PROXY 协议不适用于 Apache HTTP Server 软件。如需了解详情,请参阅 PROXY 协议。
- 点击完成。
- 在 Google Cloud 控制台中,验证前端配置旁边显示了对勾标记。如果没有显示对勾标记,请仔细检查您是否已完成上述所有步骤。
检查并最终确定
- 点击检查并最终确认。
- 仔细检查您的设置。
- 点击创建。
gcloud
为后端创建区域性健康检查:
gcloud compute health-checks create tcp tcp-health-check \ --region=REGION_A \ --use-serving-port
创建后端服务:
gcloud compute backend-services create external-tcp-proxy-bs \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=TCP \ --region=REGION_A \ --health-checks=tcp-health-check \ --health-checks-region=REGION_A
将
ZONE_A
可用区中的可用区级 NEG 添加到后端服务:gcloud compute backend-services add-backend external-tcp-proxy-bs \ --network-endpoint-group=zonal-neg-a \ --network-endpoint-group-zone=ZONE_A \ --balancing-mode=CONNECTION \ --max-connections-per-endpoint=50 \ --region=REGION_A
将
ZONE_B
可用区中的可用区级 NEG 添加到后端服务:gcloud compute backend-services add-backend external-tcp-proxy-bs \ --network-endpoint-group=zonal-neg-b \ --network-endpoint-group-zone=ZONE_B \ --balancing-mode=CONNECTION \ --max-connections-per-endpoint=50 \ --region=REGION_A
创建目标 TCP 代理:
gcloud compute target-tcp-proxies create ext-tcp-target-proxy \ --backend-service=external-tcp-proxy-bs \ --region=REGION_A
创建转发规则。 对于
--ports
,请指定 1-65535 范围内的单个端口号。此示例使用端口9090
。转发规则仅转发具有匹配目标端口的数据包。gcloud compute forwarding-rules create ext-tcp-forwarding-rule \ --load-balancing-scheme=EXTERNAL_MANAGED \ --network=lb-network \ --subnet=backend-subnet \ --address=ext-tcp-ip-address \ --ports=9090 \ --region=REGION_A \ --target-tcp-proxy=ext-tcp-target-proxy \ --target-tcp-proxy-region=REGION_A
测试负载均衡器
现在您已经配置了负载均衡器,接下来可以测试向负载均衡器的 IP 地址发送流量。
获取负载均衡器的 IP 地址。
要获取 IPv4 地址,请运行以下命令:
gcloud compute addresses describe ADDRESS_NAME
通过运行以下命令将流量发送到负载均衡器。将
LB_IP_ADDRESS
替换为负载均衡器的 IPv4 地址。curl -m1 LB_IP_ADDRESS:9090