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

区域级内部代理网络负载均衡器是一种基于代理的第 4 层区域级负载均衡器,可让您在只能由同一 VPC 网络中的客户端或连接到您的 VPC 网络的客户端访问的内部 IP 地址后面运行和扩缩 TCP 服务流量。

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

概览

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

在此示例中,您可以配置以下部署:

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

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

权限

若要按照本指南中的说明进行操作,您必须能够创建实例以及修改项目中的网络。因此,您必须具有项目的 Owner 或 Editor 角色,或者必须拥有以下所有 Compute Engine IAM 角色

任务 所需角色
创建网络、子网和负载均衡器组件 Network Admin
添加和移除防火墙规则 Security Admin
创建实例 Compute Instance Admin

如需了解详情,请参阅以下指南:

配置网络和子网

您需要一个包含两个子网的 VPC 网络:一个用于负载均衡器的后端,另一个用于负载均衡器的代理。 区域级内部代理网络负载均衡器是区域级负载均衡器。对于 VPC 网络中的流量,如果其来源所在的子网与负载均衡器位于同一区域,那么该流量会被路由到负载均衡器。

本示例使用以下 VPC 网络、区域和子网:

  • 网络:网络是名为 lb-network自定义模式 VPC 网络

  • 后端子网REGION_A 区域中名为 backend-subnet 的子网使用 10.1.2.0/24 作为其主要 IP 地址范围。

  • 代理子网REGION_A 区域中名为 proxy-only-subnet 的子网使用 10.129.0.0/23 作为其主要 IP 地址范围。

为后端创建网络和子网

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

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

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

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

gcloud

  1. 使用 gcloud compute networks create 命令创建自定义 VPC 网络:

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 使用 gcloud compute networks subnets create 命令在 REGION_A 区域的 lb-network 网络中创建子网:

    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 网络的 REGION_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:为代理专用子网创建入站流量允许防火墙规则,以允许负载均衡器与 TCP 端口 80 上的后端实例进行通信。此示例使用目标标记 allow-proxy-only-subnet 来标识应该应用该规则的后端虚拟机。

控制台

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

    转到“防火墙政策”

  2. 点击创建防火墙规则

    1. 输入 fw-allow-health-check 作为名称
    2. 网络下,选择 lb-network
    3. 目标下,选择指定的目标标记
    4. 使用 allow-health-check 填充目标标记字段。
    5. 来源过滤条件设置为 IPv4 范围
    6. 来源 IPv4 范围设置为 130.211.0.0/2235.191.0.0/16
    7. 协议和端口下,选择指定的协议和端口
    8. 选中 TCP 复选框,然后输入 80 作为端口号。
    9. 点击创建
  3. 再次点击创建防火墙规则,以创建允许传入 SSH 连接的规则:

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

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

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

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 地址

如需为负载均衡器预留静态内部 IP 地址,请参阅预留新的静态内部 IPv4 或 IPv6 地址

设置可用区级 NEG

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

创建虚拟机

控制台

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

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 vm-a1

  4. 对于区域,请选择 REGION_A

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

  6. 启动磁盘部分中,确保为启动磁盘选项选择了 Debian 操作系统和 10 (Buster) 版本。如有必要,请点击选择以更改映像。

  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. 使用以下名称和可用区组合重复以下步骤,再创建 3 个虚拟机:

    • 名称:vm-a2,可用区:ZONE_A1
    • 名称:vm-c1,可用区:ZONE_A2
    • 名称:vm-c2,可用区:ZONE_A2

gcloud

使用 VM_NAMEZONE 的这些组合运行以下命令两次来创建虚拟机。两个虚拟机的脚本内容相同。

  • VM_NAME: vm-a1ZONE: ZONE_A1
  • VM_NAME: vm-a2ZONE: ZONE_A1
  • VM_NAME: vm-c1ZONE: ZONE_A2
  • VM_NAME: vm-c2ZONE: ZONE_A2

    gcloud compute instances create VM_NAME \
        --zone=ZONE \
        --image-family=debian-10 \
        --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_A1

  8. 输入默认端口80

  9. 点击创建

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

    • 名称zonal-neg-c
    • 可用区ZONE_A2

向可用区级 NEG 添加端点:

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

    进入“网络端点组”

  2. 点击上一步中创建的网络端点组的名称(例如 zonal-neg-a)。随即会出现网络端点组详情页面。

  3. 此组中的网络端点部分,点击添加网络端点。您会看到添加网络端点页面。

  4. 选择虚拟机实例(例如 vm-a1)。网络接口部分随即会显示虚拟机名称、可用区和子网。

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

  6. 重复本部分中的所有步骤,以将 vm-c1vm-c2 中的端点添加到 zonal-neg-c

gcloud

  1. ZONE_A1 可用区中创建具有 GCE_VM_IP_PORT 端点的可用区级 NEG。

    gcloud compute network-endpoint-groups create zonal-neg-a \
       --network-endpoint-type=GCE_VM_IP_PORT \
       --zone=ZONE_A1 \
       --network=lb-network \
       --subnet=backend-subnet
    

    您可以在创建 NEG 时指定 --default-port,也可以为每个端点指定端口号,如下一步所示。

  2. 将端点添加到可用区级 NEG。

    gcloud compute network-endpoint-groups update zonal-neg-a \
        --zone=ZONE_A1 \
        --add-endpoint='instance=vm-a1,port=80' \
        --add-endpoint='instance=vm-a2,port=80'
    
  3. ZONE_A2 可用区中创建具有 GCE_VM_IP_PORT 端点的可用区级 NEG。

    gcloud compute network-endpoint-groups create zonal-neg-c \
        --network-endpoint-type=GCE_VM_IP_PORT \
        --zone=ZONE_A2 \
        --network=lb-network \
        --subnet=backend-subnet
    

    您可以在创建 NEG 时指定 --default-port,也可以为每个端点指定端口号,如下一步所示。

  4. 将端点添加到可用区级 NEG。

    gcloud compute network-endpoint-groups update zonal-neg-c \
        --zone=ZONE_A2 \
        --add-endpoint='instance=vm-c1,port=80' \
        --add-endpoint='instance=vm-c2,port=80'
    

配置负载均衡器

控制台

开始配置

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

    转到“负载均衡”

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

基本配置

  1. 对于名称,输入 my-int-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-c
    3. 保留其余的默认值,然后点击完成
  6. 配置健康检查:
    1. 健康检查中,选择创建健康检查
    2. 将健康检查的名称设置为 tcp-health-check
    3. 对于 Protocol(协议),选择 TCP
    4. 对于端口,请输入 80
  7. 保留其余的默认值,然后点击保存
  8. 在 Google Cloud 控制台中,验证后端配置旁边显示了对勾标记。如果没有显示对勾标记,请仔细检查您是否已完成所有步骤。

前端配置

  1. 点击前端配置
  2. 对于名称,输入 int-tcp-forwarding-rule
  3. 对于子网,选择 backend-subnet
  4. 对于 IP 地址,选择 int-tcp-ip-address
  5. 对于端口号,输入 9090。转发规则仅转发具有匹配目标端口的数据包。
  6. 在此示例中,请勿启用代理协议,因为它不适用于 Apache HTTP Server 软件。如需了解详情,请参阅代理协议
  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 internal-tcp-proxy-bs \
       --load-balancing-scheme=INTERNAL_MANAGED \
       --protocol=TCP \
       --region=REGION_A \
       --health-checks=tcp-health-check \
       --health-checks-region=REGION_A
    
  3. ZONE_A1 可用区中的可用区级 NEG 添加到后端服务。

    gcloud compute backend-services add-backend internal-tcp-proxy-bs \
       --network-endpoint-group=zonal-neg-a \
       --network-endpoint-group-zone=ZONE_A1 \
       --balancing-mode=CONNECTION \
       --max-connections-per-endpoint=50 \
       --region=REGION_A
    
  4. ZONE_A2 可用区中的可用区级 NEG 添加到后端服务。

    gcloud compute backend-services add-backend internal-tcp-proxy-bs \
       --network-endpoint-group=zonal-neg-c \
       --network-endpoint-group-zone=ZONE_A2 \
       --balancing-mode=CONNECTION \
       --max-connections-per-endpoint=50 \
       --region=REGION_A
    
  5. 创建目标 TCP 代理。

    gcloud compute target-tcp-proxies create int-tcp-target-proxy \
       --backend-service=internal-tcp-proxy-bs \
       --region=REGION_A
    
  6. 创建转发规则。对于 --ports,请指定 1-65535 范围内的单个端口号。此示例使用端口 9090。转发规则仅转发具有匹配目标端口的数据包。

    gcloud compute forwarding-rules create int-tcp-forwarding-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=lb-network \
      --subnet=backend-subnet \
      --address=int-tcp-ip-address \
      --ports=9090 \
      --region=REGION_A \
      --target-tcp-proxy=int-tcp-target-proxy \
      --target-tcp-proxy-region=REGION_A
    

测试负载均衡器

如需测试负载均衡器,请在负载均衡器所在的区域中创建客户端虚拟机。然后,将流量从客户端发送到负载均衡器。

创建客户端虚拟机

在负载均衡器所在的区域中创建客户端虚拟机 (client-vm)。

控制台

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

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 client-vm

  4. 地区设置为 ZONE_A1

  5. 点击高级选项

  6. 点击网络并配置以下字段:

    1. 对于网络标记,请输入 allow-ssh
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network
      • 子网backend-subnet
  7. 点击创建

gcloud

客户端虚拟机必须与负载均衡器位于同一 VPC 网络和区域中。它无需位于同一子网或可用区中。客户端使用与后端虚拟机相同的子网。

gcloud compute instances create client-vm \
    --zone=ZONE_A1 \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=backend-subnet

将流量发送到负载均衡器

现在您已经配置了负载均衡器,接下来可以测试向负载均衡器的 IP 地址发送流量。

  1. 使用 SSH 连接到客户端实例。

    gcloud compute ssh client-vm \
      --zone=ZONE_A1
    
  2. 验证负载均衡器是否按预期处理后端主机名。

    1. 使用 compute addresses describe 命令查看负载均衡器的 IP 地址:

      gcloud compute addresses describe int-tcp-ip-address \
        --region=REGION_A
      

      记下 IP 地址。

    2. 将流量发送到负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址。

      curl IP_ADDRESS:9090
      

后续步骤