本文档介绍如何部署具有可用区级网络端点组 (NEG) 后端的外部直通式网络负载均衡器。通过具有 GCE_VM_IP
端点的可用区级 NEG,您可以执行以下操作:
- 通过将虚拟机实例的网络接口表示为后端端点,将数据包转发到虚拟机实例的非
nic0
网络接口。 - 创建一组灵活的后端端点,其中一个端点可以挂接到多个 NEG,而每个 NEG 都可以有一组不同但可能重叠的端点。
在按照本文档进行操作之前,请先熟悉以下内容:
权限
为按照以下步骤操作,您需要创建实例并修改项目中的网络。因此,您必须具有项目 Owner 或 Editor 身份,或者必须拥有以下所有 Compute Engine IAM 角色:
任务 | 所需角色 |
---|---|
创建网络、子网和负载均衡器组件 | Network Admin |
添加和移除防火墙规则 | Security Admin |
创建实例 | Compute Instance Admin |
如需了解详情,请参阅以下页面:
设置概览
本文档介绍如何配置和测试使用 GCE_VM_IP
可用区级 NEG 后端的外部直通式网络负载均衡器。此部分中的步骤介绍了如何配置以下内容:
- 名为
lb-network
的示例 VPC 网络,其中包含自定义子网。 - 允许后端虚拟机的传入连接的防火墙规则。
- 四个虚拟机:
us-west1-a
地区中的虚拟机vm-a1
和vm-a2
us-west1-c
地区中的虚拟机vm-c1
和vm-c2
- 两个后端可用区级 NEG,可用区
us-west1-a
中的neg-a
,可用区us-west1-c
中的neg-c
。每个 NEG 都具有以下端点:neg-a
包含以下两个端点:- 虚拟机
vm-a1
的nic1
,由其主要内部 IP 地址标识 - 虚拟机
vm-a2
的nic1
,由其主要内部 IP 地址标识
- 虚拟机
neg-c
包含以下两个端点:- 虚拟机
vm-c1
的nic1
,由其主要内部 IP 地址标识 - 虚拟机
vm-c2
的nic1
,由其主要内部 IP 地址标识
- 虚拟机
us-west1-a
中用于测试连接的一个客户端虚拟机 (vm-client
)- 以下负载均衡器组件:
us-west1
区域中的外部后端服务,用于管理两个可用区级 NEG 的连接分布- 负载均衡器前端的外部转发规则和 IP 地址
外部直通式网络负载均衡器是区域级负载均衡器。所有负载均衡器组件(后端虚拟机、后端服务和转发规则)必须位于同一区域。
此示例的架构如下所示:
准备工作
安装 Google Cloud CLI。如需全面了解此工具,请参阅 gcloud CLI 概览。您可以在 API 和 gcloud 参考文档中找到与负载均衡相关的命令。
如果您之前未运行过 gcloud CLI,请先运行 gcloud init
命令进行身份验证。
本页面假定您熟悉 bash。
设置网络和子网
本页面中的示例使用名为 lb-network
的自定义模式 VPC 网络。如果您只想处理 IPv4 流量,则可以使用自动模式 VPC 网络。但是,IPv6 流量需要自定义模式子网。
IPv6 流量还需要双栈子网(stack-type
设置为 IPv4_IPv6
)。在自定义模式 VPC 网络上创建双栈子网时,您可以为子网选择 IPv6 访问类型。在此示例中,我们将子网的 ipv6-access-type
参数设置为 EXTERNAL
。这意味着此子网上的新虚拟机可以分配外部 IPv4 地址和外部 IPv6 地址。
用于此示例的后端和负载均衡器组件位于以下区域和子网中:
- 区域:
us-central1
- 子网:
lb-subnet
,其主要 IPv4 地址范围为10.1.2.0/24
。虽然您可以选择在子网上配置哪个 IPv4 地址范围,但系统会自动分配 IPv6 地址范围。Google 提供固定大小 (/64) 的 IPv6 CIDR 地址块。
如需创建示例网络和子网,请按照以下步骤操作。
控制台
如需同时支持 IPv4 和 IPv6 流量,请按照以下步骤操作:
在 Google Cloud 控制台中,转到 VPC 网络页面。
点击创建 VPC 网络。
输入
lb-network
作为名称。在子网部分中执行以下操作:
- 将子网创建模式设置为自定义。
- 在新子网部分中,配置以下字段,然后点击完成:
- 名称:
lb-subnet
- 区域:
us-central1
- IP 栈类型:IPv4 和 IPv6(双栈)
- IPv4 范围:
10.1.2.0/24
虽然您可以为子网配置 IPv4 地址范围,但您不能为子网选择 IPv6 地址范围。Google 提供固定大小 (/64) 的 IPv6 CIDR 地址块。 - IPv6 访问类型:外部
- 名称:
点击创建。
如需支持仅限 IPv4 流量,请按以下步骤操作:
在 Google Cloud 控制台中,转到 VPC 网络页面。
点击创建 VPC 网络。
输入
lb-network
作为名称。在子网部分中执行以下操作:
- 将子网创建模式设置为自定义。
- 在新子网部分中,配置以下字段,然后点击完成:
- 名称:
lb-subnet
- 区域:
us-central1
- IP 栈类型:IPv4(单栈)
- IPv4 范围:
10.1.2.0/24
- 名称:
点击创建。
gcloud
创建自定义模式 VPC 网络:
gcloud compute networks create lb-network \ --subnet-mode=custom
在
lb-network
网络中,为us-central1
区域中的后端创建子网。对于 IPv4 和 IPv6 流量,请使用以下命令创建双栈子网:
gcloud compute networks subnets create lb-subnet \ --stack-type=IPV4_IPv6 \ --ipv6-access-type=EXTERNAL \ --network=lb-network \ --range=10.1.2.0/24 \ --region=us-central1
对于仅限 IPv4 流量,请使用以下命令:
gcloud compute networks subnets create lb-subnet \ --network=lb-network \ --range=10.1.2.0/24 \ --region=us-central1
创建虚拟机和网络端点组
为了展示外部直通式网络负载均衡器的区域级性质,此示例在两个不同的可用区中使用两个可用区级 NEG 后端。流量在两个 NEG 以及每个 NEG 中的端点之间进行负载均衡。
创建虚拟机
对于此负载均衡场景,您将创建四个虚拟机并在每个实例上安装一个 Apache 网络服务器。该网络服务器监听 TCP 端口 80。默认情况下,Apache 配置为绑定到任何 IP 地址。外部直通式网络负载均衡器通过保留目标 IP 地址来传送数据包。
为便于说明,这些后端虚拟机均运行 Debian GNU Linux 10。
要同时处理 IPv4 和 IPv6 流量,请将后端虚拟机配置为双栈。将虚拟机的 stack-type
设置为 IPv4_IPv6
。虚拟机还会从子网继承 ipv6-access-type
设置(在此示例中为 EXTERNAL
)。 如需详细了解 IPv6 要求,请参阅外部直通式网络负载均衡器概览:转发规则。
如需将现有虚拟机用作后端,请使用 gcloud compute instances network-interfaces update
命令将虚拟机更新为双栈。
作为外部直通式网络负载均衡器的后端虚拟机参与的实例必须运行相应的 Linux 客机环境、Windows 客机环境或提供同等功能的其他进程。
创建的每个虚拟机都包含两个网络接口:nic0
和 nic1
。本教程使用与 lb-network
VPC 网络和 lb-subnet
子网关联的 nic1
。稍后将使用此 lb-network
网络和 lb-subnet
子网创建可用区级 NEG。
控制台
创建虚拟机
在 Google Cloud 控制台中,前往虚拟机实例页面。
使用以下名称和可用区组合重复执行以下步骤,以创建四个虚拟机:
- 名称:
vm-a1
,可用区:us-west1-a
- 名称:
vm-a2
,可用区:us-west1-a
- 名称:
vm-c1
,可用区:us-west1-c
- 名称:
vm-c2
,可用区:us-west1-c
- 名称:
点击创建实例。
按照上述说明设置名称。
对于区域,选择
us-west1
,然后按照上述说明选择一个可用区。在启动磁盘部分中,确保为启动磁盘选项选择了 Debian 操作系统和 10 (Buster) 版本。如有必要,请点击选择以更改映像。
点击高级选项并进行以下更改:
- 点击网络,并添加以下网络标记:
lb-tag
对于网络接口,请点击添加网络接口并进行以下更改:
对于 IPv4 和 IPv6 后端:
- 网络:
lb-network
- 子网:
lb-subnet
- IP 栈类型:
IPv4 and IPv6 (dual-stack)
- 主要内部 IP:临时(自动)
- 外部 IPv4 地址:临时(自动)
- 外部 IPv6 地址:自动分配
对于仅限 IPv4 的后端:
- 网络:
lb-network
- 子网:
lb-subnet
- IP 栈类型:
IPv4 (single-stack)
- 主要内部 IP:临时(自动)
- 外部 IP:临时
然后,点击完成。
- 网络:
点击管理。在启动脚本字段中,复制并粘贴以下脚本内容。所有四个虚拟机的脚本内容均相同:
#! /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
使用 [VM-NAME]
和 [ZONE]
的下列四种组合运行以下命令四次,以创建四个虚拟机。所有四个虚拟机的脚本内容均相同。
- VM_NAME:
vm-a1
和 ZONE:us-west1-a
- VM_NAME:
vm-a2
和 ZONE:us-west1-a
- VM_NAME:
vm-c1
和 ZONE:us-west1-c
- VM_NAME:
vm-c2
和 ZONE:us-west1-c
如需同时处理 IPv4 和 IPv6 流量,请使用以下命令。
gcloud compute instances create VM_NAME \ --zone=ZONE \ --image-family=debian-10 \ --image-project=debian-cloud \ --tags=lb-tag \ --network-interface=network=default,subnet=default,stack_type=IPv4_IPv6,--ipv6-network-tier=PREMIUM \ --network-interface=network=lb-network,subnet=lb-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'
要处理仅限 IPv4 流量,请使用以下命令:
gcloud compute instances create VM_NAME \ --zone=ZONE \ --image-family=debian-10 \ --image-project=debian-cloud \ --tags=lb-tag \ --network-interface=network=default,subnet=default,stack_type=IPv4_ONLY \ --network-interface=network=lb-network,subnet=lb-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'
创建具有 GCE_VM_IP
端点的可用区级 NEG
NEG 必须在上一步中创建的虚拟机所在的可用区中创建。此示例还会在与上一步中创建的虚拟机的 nic1
关联的 lb-network
VPC 网络和 lb-subnet
子网中创建 NEG。因此,NEG 的端点将位于虚拟机的 nic1
上。
控制台
如需创建可用区级网络端点组,请执行以下操作:
- 转到 Google Cloud 控制台中的“网络端点组”页面。
转到“网络端点组”页面 - 点击创建网络端点组。
- 输入可用区级 NEG 的名称:
neg-a
。 - 选择网络端点组类型:网络端点组(可用区级)。
- 选择网络:lb-network
- 选择子网:lb-subnet
- 选择可用区:us-west1-a
- 点击创建。
- 重复上述步骤,在 us-west1-c 可用区中创建名为
neg-c
的第二个可用区级 NEG。
将端点添加到可用区级 NEG:
- 转到 Google Cloud 控制台中的“网络端点组”页面。
进入“网络端点组” - 点击上一步中创建的第一个网络端点组的名称 (neg-a)。您会看到网络端点组详情页面。
在此组中的网络端点部分,点击添加网络端点。您会看到添加网络端点页面。
- 点击虚拟机实例,然后选择 vm-a1 以将其内部 IP 地址添加为网络端点。
- 点击创建。
- 再次点击添加网络端点,然后在虚拟机实例下选择 vm-a2。
- 点击创建。
点击上一步中创建的第二个网络端点组的名称 (neg-c)。您会看到网络端点组详情页面。
在此组中的网络端点部分,点击添加网络端点。您会看到添加网络端点页面。
- 点击虚拟机实例,然后选择 vm-c1 以将其内部 IP 地址添加为网络端点。
- 点击创建。
- 再次点击添加网络端点,然后在虚拟机实例下选择 vm-c2。
- 点击创建。
gcloud
使用
gcloud compute network-endpoint-groups create
命令在us-west1-a
中创建名为neg-a
的GCE_VM_IP
区域 NEG:gcloud compute network-endpoint-groups create neg-a \ --network-endpoint-type=gce-vm-ip \ --zone=us-west1-a \ --network=lb-network \ --subnet=lb-subnet
将端点添加到
neg-a
:gcloud compute network-endpoint-groups update neg-a \ --zone=us-west1-a \ --add-endpoint='instance=vm-a1' \ --add-endpoint='instance=vm-a2'
使用
gcloud compute network-endpoint-groups create
命令在us-west1-c
中创建名为neg-c
的GCE_VM_IP
区域 NEG:gcloud compute network-endpoint-groups create neg-c \ --network-endpoint-type=gce-vm-ip \ --zone=us-west1-c \ --network=lb-network \ --subnet=lb-subnet
将端点添加到
neg-c
:gcloud compute network-endpoint-groups update neg-c \ --zone=us-west1-c \ --add-endpoint='instance=vm-c1' \ --add-endpoint='instance=vm-c2'
配置防火墙规则
创建允许外部流量(包括健康检查探测)到达后端实例的防火墙规则。
此示例会创建一条防火墙规则,以允许来自所有来源范围的 TCP 流量到达端口 80 上的后端实例。如果要专门为健康检查探测创建单独的防火墙规则,请使用健康检查概览:探测 IP 范围和防火墙规则中记录的来源 IP 地址范围。
控制台
在 Google Cloud 控制台中,转到防火墙页面。
如需允许 IPv4 流量,请执行以下步骤:
- 点击创建防火墙规则。
- 输入名称:
allow-network-lb-ipv4
。 - 对于网络,选择 lb-network。
- 对于目标,选择 Specified target tags。
- 对于目标标记字段,输入
lb-tag
。 - 对于来源过滤条件,选择 IPv4 范围。
- 将来源 IPv4 范围设置为
0.0.0.0/0
。这允许来自任何来源的 IPv4 流量。这也允许 Google 的健康检查探测访问后端实例。 - 对于指定的协议和端口,选择 TCP 并输入
80
。 - 点击创建。
如需允许 IPv6 流量,请执行以下步骤:
- 再次点击创建防火墙规则。
- 输入名称:
allow-network-lb-ipv6
。 - 对于网络,选择 lb-network。
- 对于目标,选择 Specified target tags。
- 对于目标标记字段,输入
lb-tag
。 - 对于来源过滤条件,选择 IPv6 范围。
- 将来源 IPv6 范围设置为
::/0
。这允许来自任何来源的 IPv6 流量。这也允许 Google 的健康检查探测访问后端实例。 - 对于指定的协议和端口,选择 TCP 并输入
80
。 - 点击创建。
gcloud
如需允许 IPv4 流量,请运行以下命令:
gcloud compute firewall-rules create allow-network-lb-ipv4 \ --network=lb-network \ --target-tags=lb-tag \ --allow=tcp:80 \ --source-ranges=0.0.0.0/0
如需允许 IPv6 流量,请运行以下命令:
gcloud compute firewall-rules create allow-network-lb-ipv6 \ --network=lb-network \ --target-tags=lb-tag \ --allow=tcp:80 \ --source-ranges=::/0
配置负载均衡器
接下来,设置负载均衡器。
配置负载均衡器时,虚拟机将接收发往您配置的静态外部 IP 地址的数据包。如果您使用的是 Compute Engine 提供的映像,则系统会自动配置您的实例处理此 IP 地址。如果您使用任何其他映像,则必须将此地址配置为 eth1
上的别名或每个实例上的环回地址。
控制台
开始配置
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击创建负载均衡器。
- 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步。
- 对于代理或直通,选择直通式负载均衡器,然后点击下一步。
- 在公共或内部字段中,选择公共(外部),然后点击下一步。
- 点击配置。
后端配置
- 在创建外部直通式网络负载均衡器页面上,输入新负载均衡器的名称
network-lb-zonal-neg
。 - 对于区域,请选择
us-west1
。 - 在后端类型下,选择可用区级网络端点组。
- 点击后端配置。您将看到您之前输入的负载均衡器名称,但无法进行修改。
- 在后端配置页面上,进行以下更改:
- 在网络端点组列表中,选择
neg-a
,然后点击完成。 - 点击添加后端,然后重复上一步添加
neg-c
。 - 对于健康检查,请选择创建健康检查或另创建一项健康检查,然后输入以下信息:
- 名称:
tcp-health-check
- 协议:
TCP
- 端口:
80
- 名称:
- 点击保存。
- 在网络端点组列表中,选择
- 请先确认后端配置旁边是否有蓝色对勾标记,然后再继续操作。
前端配置
- 点击前端配置。
- 对于名称,输入
netlb-forwarding-rule
。 - 如需处理 IPv4 流量,请按以下步骤操作:
- 对于 IP 版本,请选择 IPv4。
- 对于 IP 地址,点击下拉菜单并选择创建 IP 地址。
- 在保留静态 IP 地址页面上,对于名称,输入
netlb-ipv4-address
。 - 点击预留。
- 在保留静态 IP 地址页面上,对于名称,输入
- 对于端口,选择单个。对于端口号,输入
80
。 - 点击完成。
如需处理 IPv6 流量,请按以下步骤操作:
- 对于 IP 版本,请选择 IPv6。
- 对于子网,请选择 lb-subnet。
- 对于 IPv6 范围,点击下拉菜单并选择创建 IP 地址。
- 在保留静态 IP 地址页面上,对于名称,输入
netlb-ipv6-address
。 - 点击预留。
- 在保留静态 IP 地址页面上,对于名称,输入
- 对于端口,选择单个。对于端口号,输入
80
。 - 点击完成。
前端配置左侧带对勾标记的蓝色圆圈表示设置成功。
检查配置
- 点击检查并最终确定。
- 查看负载均衡器配置设置。
- 可选:点击等效代码以查看将用于创建负载均衡器的 REST API 请求。
点击创建。
在负载均衡页面上,在新负载均衡器的“后端”列下,您会看到一个绿色对勾标记,表明新的负载均衡器运行正常。
gcloud
预留静态外部 IP 地址。
对于 IPv4 流量:为负载均衡器创建静态外部 IPv4 地址。
gcloud compute addresses create netlb-ipv4-address \ --region=us-west1
对于 IPv6 流量:为负载均衡器创建静态外部 IPv6 地址范围。使用的子网必须是具有外部 IPv6 范围的双栈子网。
gcloud compute addresses create netlb-ipv6-address \ --region=us-west1 \ --subnet=lb-subnet \ --ip-version=IPV6 \ --endpoint-type=NETLB
创建 TCP 健康检查。
gcloud compute health-checks create tcp tcp-health-check \ --region=us-west1 \ --port=80
创建后端服务。
gcloud compute backend-services create networklb-backend-service \ --protocol=TCP \ --health-checks=tcp-health-check \ --health-checks-region=us-west1 \ --region=us-west1
将两个可用区级 NEG(
neg-a
和neg-c
)添加到后端服务:gcloud compute backend-services add-backend networklb-backend-service \ --region=us-west1 \ --network-endpoint-group=neg-a \ --network-endpoint-group-zone=us-west1-a
gcloud compute backend-services add-backend networklb-backend-service \ --region=us-west1 \ --network-endpoint-group=neg-c \ --network-endpoint-group-zone=us-west1-c
根据您希望处理 IPv4 流量还是 IPv6 流量,创建转发规则。创建两个转发规则来处理这两种流量。
对于 IPv4 流量:创建转发规则以将传入的 TCP 流量路由到后端服务。使用第 1 步中预留的 IPv4 地址作为负载均衡器的静态外部 IP 地址。
gcloud compute forwarding-rules create forwarding-rule-ipv4 \ --load-balancing-scheme=EXTERNAL \ --region=us-west1 \ --ports=80 \ --address=netlb-ipv4-address \ --backend-service=networklb-backend-service
对于 IPv6 流量:创建转发规则以处理 IPv6 流量。使用第 1 步中预留的 IPv6 地址范围作为负载均衡器的静态外部 IP 地址。使用的子网必须是具有外部 IPv6 子网范围的双栈子网。
gcloud compute forwarding-rules create forwarding-rule-ipv6 \ --load-balancing-scheme=EXTERNAL \ --region=us-west1 \ --network-tier=PREMIUM \ --ip-version=IPV6 \ --subnet=lb-subnet \ --address=netlb-ipv6-address \ --ports=80 \ --backend-service=networklb-backend-service
测试负载均衡器
至此您已经配置好了负载均衡服务,接下来可以开始将流量发送到负载均衡器的外部 IP 地址,并观察流量被分发到不同的后端实例。
查询负载均衡器的外部 IP 地址
控制台
在高级负载均衡页面中,转到转发规则标签页。
找到负载均衡器使用的转发规则。
在地址列中,记下列出的外部 IP 地址。
gcloud:IPv4
输入以下命令,查看负载均衡器使用的 network-lb-forwarding-rule
转发规则的外部 IPv4 地址。
gcloud compute forwarding-rules describe forwarding-rule-ipv4 \ --region=us-west1
gcloud:IPv6
输入以下命令,查看负载均衡器使用的 network-lb-forwarding-rule
转发规则的外部 IPv6 地址。
gcloud compute forwarding-rules describe forwarding-rule-ipv6 \ --region=us-west1
将流量发送到负载均衡器
使用 curl
连接负载均衡器的 IP 地址,通过这种方式向负载均衡器发送 Web 请求。
从具有 IPv4 连接的客户端,运行以下命令:
$ while true; do curl -m1 IPV4_ADDRESS; done
从具有 IPv6 连接的客户端,运行以下命令:
$ while true; do curl -m1 http://IPV6_ADDRESS; done
比方说,如果分配的 IPv6 地址为
[2001:db8:1:1:1:1:1:1/96]:80
,则该命令应如下所示:$ while true; do curl -m1 http://[2001:db8:1:1:1:1:1:1]:80; done
请注意 curl
命令返回的结果。该结果文本中显示了生成响应的后端虚拟机的名称,例如:Page served
from: VM_NAME
来自 curl
命令的响应会在后端实例之间随机交替。如果响应最初不成功,您可能需要等待大约 30 秒,以便完全加载配置并且实例被标记为运行状况良好,然后再次尝试。
其他配置选项
如需进一步自定义外部直通式网络负载均衡器,您可以配置会话亲和性和流量导向,并设置故障切换政策或连接跟踪政策。这些任务是可选的,您可以按任意顺序执行。如需了解说明,请参阅其他配置选项。
后续步骤
- 如需了解如何将外部直通式网络负载均衡器从目标池后端迁移到区域级后端服务,请参阅将外部直通式网络负载均衡器从目标池迁移到后端服务。
- 如需为多个 IP 协议(支持 IPv4 和 IPv6 流量)配置外部直通式网络负载均衡器,请参阅为多个 IP 协议设置外部直通式网络负载均衡器。
- 如需使用 Google Cloud Armor 为外部直通式网络负载均衡器配置高级网络 DDoS 防护,请参阅配置高级网络 DDoS 防护。
- 如需删除资源,请参阅清理负载均衡器设置。