设置具有可用区级 NEG 后端的区域级外部代理网络负载均衡器

区域级外部代理网络负载均衡器是一种基于代理的区域第 4 层负载均衡器,可让您在外部区域 IP 地址后面的单个区域中运行和扩缩 TCP 服务流量。这些负载均衡器将来自互联网的外部 TCP 流量分配到同一区域中的后端。

本指南介绍如何设置具有可用区级网络端点组 (NEG) 后端的区域级外部代理网络负载均衡器。

在开始之前,请查看以下文档:

在此示例中,我们将使用负载均衡器在区域 A 的两个可用区级 NEG 中的后端虚拟机之间分配 TCP 流量。在本示例中,服务是一组配置为在端口 80 上进行响应的 Apache 服务器。

在此示例中,您将配置下图中显示的部署。

具有可用区级 NEG 后端的区域级外部代理网络负载均衡器示例配置。
具有可用区级 NEG 后端的区域级外部代理网络负载均衡器示例配置。

这是一个区域级负载均衡器。所有负载均衡器组件(后端实例组、后端服务、目标代理和转发规则)必须位于同一区域。

权限

若要按照本指南中的说明进行操作,您必须能够创建实例以及修改项目中的网络。您必须是项目的 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

为后端创建网络和子网

控制台

  1. 在 Google Cloud 控制台中,进入 VPC 网络页面。

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 对于名称,输入 lb-network

  4. 子网部分中,执行以下操作:

    1. 子网创建模式设置为自定义
    2. 新子网部分中,输入以下信息:
      • 名称backend-subnet
      • 区域REGION_A
      • IP 地址范围10.1.2.0/24
    3. 点击完成
  5. 点击创建

gcloud

  1. 如需创建自定义 VPC 网络,请使用 gcloud compute networks create 命令

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 如需在 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 控制台,则可以稍后在负载均衡页面上创建代理专用子网。

如需立即创建代理专用子网,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,进入 VPC 网络页面。

    进入 VPC 网络页面

  2. 点击共享 VPC 网络的名称:lb-network

  3. 点击添加子网

  4. 对于名称,输入 proxy-only-subnet

  5. 对于区域,请选择 REGION_A

  6. 用途设置为区域级代管式代理

  7. 对于 IP 地址范围,输入 10.129.0.0/23

  8. 点击添加

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/2235.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 来标识应该应用该规则的后端虚拟机。

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。

    转到“防火墙政策”

  2. 点击创建防火墙规则,然后填写以下字段:

    • 名称fw-allow-health-check
    • 网络lb-network
    • 目标指定的目标标记
    • 目标标记allow-health-check
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围130.211.0.0/2235.191.0.0/16
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 TCP 复选框,然后输入 80 作为端口号。
  3. 点击创建

  4. 再次点击创建防火墙规则,创建允许传入 SSH 连接的规则:

    • 名称fw-allow-ssh
    • 网络lb-network
    • 优先级1000
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围0.0.0.0/0
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 TCP 复选框,然后输入 22 作为端口号。
  5. 点击创建

  6. 第三次点击创建防火墙规则,以创建允许从代理专用子网到 Google Cloud 后端的传入连接的规则:

    • 名称fw-allow-proxy-only-subnet
    • 网络lb-network
    • 优先级1000
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记allow-proxy-only-subnet
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围10.129.0.0/23
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 TCP 复选框,然后输入 80 作为端口号。
  7. 点击创建

gcloud

  1. 创建 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
    
  2. 创建 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
    
  3. 为代理专用子网创建入站流量允许防火墙规则,以允许负载均衡器与 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 地址

控制台

  1. 在 Google Cloud 控制台中,进入预留静态地址页面。

    进入“预留静态地址”

  2. 为新地址选择一个名称。

  3. 对于网络服务层级,请选择标准

  4. IP 版本部分,选择 IPv4。系统不支持 IPv6 地址。

  5. 对于类型,请选择区域

  6. 对于区域,请选择 REGION_A

  7. 附加目标选项设置为。创建负载均衡器后,此 IP 地址会关联到负载均衡器的转发规则。

  8. 点击预留以预留该 IP 地址。

gcloud

  1. 如需预留静态外部 IP 地址,请使用 gcloud compute addresses create 命令

    gcloud compute addresses create ADDRESS_NAME  \
       --region=REGION_A \
       --network-tier=STANDARD
    

    ADDRESS_NAME 替换为您要为此地址指定的名称。

  2. 如需查看结果,请使用 gcloud compute addresses describe 命令

    gcloud compute addresses describe ADDRESS_NAME
    

设置可用区级 NEG

在区域 A 中设置具有 GCE_VM_IP_PORT 类型端点的可用区级 NEG。首先创建虚拟机,然后创建可用区级 NEG 并将虚拟机的网络端点添加到此 NEG。

创建虚拟机

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 vm-a1

  4. 对于区域,请选择 REGION_A

  5. 对于可用区,请选择 ZONE_A

  6. 启动磁盘部分中,确保为启动磁盘选项选择了 Debian GNU/Linux 12 (bookworm)。如有必要,请点击选择以更改映像。

  7. 点击高级选项

  8. 点击网络,然后配置以下字段:

    1. 网络标记字段中,输入 allow-sshallow-health-checkallow-proxy-only-subnet
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network
      • 子网backend-subnet
  9. 点击管理。将以下脚本输入到启动脚本字段中:

    #! /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
    
  10. 点击创建

  11. 重复上述步骤,再创建三个虚拟机。使用以下名称和可用区组合:

    • 名称:vm-a2 | 可用区:ZONE_A
    • 名称:vm-b1 | 可用区:ZONE_B
    • 名称:vm-b2 | 可用区:ZONE_B

gcloud

如需创建虚拟机,请使用两次 gcloud compute instances create 命令。使用以下 VM_NAMEZONE 组合。两个虚拟机的脚本内容相同:

  • VM_NAME: vm-a1ZONE: ZONE_A
  • VM_NAME: vm-a2ZONE: ZONE_A
  • VM_NAME: vm-b1ZONE: ZONE_B
  • VM_NAME: vm-b2ZONE: 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

控制台

创建可用区级网络端点组

  1. 在 Google Cloud 控制台中,进入网络端点组页面。

    进入“网络端点组”

  2. 点击创建网络端点组

  3. 对于名称,输入 zonal-neg-a

  4. 对于网络端点组类型,选择网络端点组(可用区级)

  5. 对于网络,请选择 lb-network

  6. 对于子网,请选择 backend-subnet

  7. 对于可用区,请选择 ZONE_A

  8. 对于默认端口,输入 80

  9. 点击创建

  10. 重复执行此部分中的所有步骤,以创建第二个可用区级 NEG 并对设置进行以下更改:

    • 名称zonal-neg-b
    • 可用区ZONE_B

将端点添加到可用区级 NEG

  1. 在 Google Cloud 控制台中,进入网络端点组页面。

    进入“网络端点组”

  2. 点击您在上一步中创建的网络端点组的名称(例如 zonal-neg-a)。

  3. 网络端点组详情页面的此组中的网络端点部分中,点击添加网络端点

  4. 选择虚拟机实例(例如 vm-a1)。

  5. 网络接口部分会显示虚拟机名称、可用区和子网。

    1. IP 地址字段中,输入新网络端点的 IP 地址。如需获取该 IP 地址,请点击检查 nic0 中的主要 IP 地址和别名 IP 范围
    2. 端口类型字段中,选择默认。网络端点组中的所有端点都会使用默认端口 80。这足以满足我们的示例需求,因为 Apache 服务器是在端口 80 处理请求。
    3. 点击创建
  6. 点击添加网络端点。选择第二个虚拟机实例 vm-a2,然后重复上述步骤,以将其端点添加到 zonal-neg-a

  7. 重复本部分中的所有步骤,以将 vm-b1vm-b2 中的端点添加到 zonal-neg-b

gcloud

  1. 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,也可以为每个端点指定端口号,如下一步所示。

  2. 将端点添加到可用区级 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'
    
  3. 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,也可以为每个端点指定端口号,如下一步所示。

  4. 将端点添加到可用区级 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'
    

配置负载均衡器

控制台

开始配置

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步
  4. 对于代理或直通,选择代理负载均衡器,然后点击下一步
  5. 公共或内部字段中,选择公共(外部),然后点击下一步
  6. 对于全球或单区域部署,选择最适合区域级工作负载,然后点击下一步
  7. 点击配置

基本配置

  1. 对于名称,输入 my-ext-tcp-lb
  2. 对于区域,请选择 REGION_A
  3. 对于网络,请选择 lb-network

预留代理专用子网

  1. 点击预留子网
  2. 对于名称,输入 proxy-only-subnet
  3. 对于 IP 地址范围,输入 10.129.0.0/23
  4. 点击添加

配置后端

  1. 点击后端配置
  2. 对于后端类型,选择可用区级网络端点组
  3. 对于 Protocol(协议),选择 TCP
  4. 配置第一个后端:
    1. 新后端字段中,选择可用区级 NEG zonal-neg-a
    2. 保留其余的默认值,然后点击完成
  5. 配置第二个后端:
    1. 点击添加后端
    2. 新后端字段中,选择实例组 zonal-neg-b
    3. 保留其余的默认值,然后点击完成
  6. 配置健康检查:
    1. 健康检查字段中,选择创建健康检查
    2. 将健康检查名称设置为 tcp-health-check
    3. 对于 Protocol(协议),选择 TCP
    4. 对于端口,请输入 80
  7. 保留其余的默认值,然后点击保存
  8. 在 Google Cloud 控制台中,验证后端配置旁边显示了对勾标记。如果没有显示对勾标记,请仔细检查您是否已完成所有步骤。

配置前端

  1. 点击前端配置
  2. 对于名称,输入 ext-tcp-forwarding-rule
  3. 对于子网,选择 backend-subnet
  4. IP 地址字段中,选择 ext-tcp-ip-address
  5. 对于端口号,输入 9090。转发规则仅转发具有匹配目标端口的数据包。
  6. 代理协议字段中,选择关闭,因为 PROXY 协议不适用于 Apache HTTP Server 软件。如需了解详情,请参阅 PROXY 协议
  7. 点击完成
  8. 在 Google Cloud 控制台中,验证前端配置旁边显示了对勾标记。如果没有显示对勾标记,请仔细检查您是否已完成上述所有步骤。

检查并最终确定

  1. 点击检查并最终确认
  2. 仔细检查您的设置。
  3. 点击创建

gcloud

  1. 为后端创建区域性健康检查:

    gcloud compute health-checks create tcp tcp-health-check \
        --region=REGION_A \
        --use-serving-port
    
  2. 创建后端服务:

    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
    
  3. 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
    
  4. 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
    
  5. 创建目标 TCP 代理:

    gcloud compute target-tcp-proxies create ext-tcp-target-proxy \
       --backend-service=external-tcp-proxy-bs \
       --region=REGION_A
    
  6. 创建转发规则。 对于 --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 地址发送流量。

  1. 获取负载均衡器的 IP 地址。

    要获取 IPv4 地址,请运行以下命令:

    gcloud compute addresses describe ADDRESS_NAME
    
  2. 通过运行以下命令将流量发送到负载均衡器。将 LB_IP_ADDRESS 替换为负载均衡器的 IPv4 地址。

    curl -m1 LB_IP_ADDRESS:9090
    

后续步骤