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

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

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

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

概览

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

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

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

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

权限

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

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

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

配置网络和子网

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

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

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

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

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

为后端创建网络和子网

控制台

  1. 在 Google Cloud 控制台中,进入 VPC 网络页面。
    进入“VPC 网络”
  2. 点击创建 VPC 网络
  3. 对于名称,请输入 lb-network
  4. 子网部分中执行以下操作:
    • 子网创建模式设置为自定义
    • 新子网部分中,输入以下信息:
      • 名称backend-subnet
      • 区域us-west1
      • 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 命令在 us-west1 区域的 lb-network 网络中创建子网:

    gcloud compute networks subnets create backend-subnet \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

创建代理专用子网

代理专用子网提供了一组 IP 地址,供 Google 用于代表您运行 Envoy 代理。代理会终结来自客户端的连接并创建与后端的新连接。

此代理专用子网用于 lb-network VPC 网络的 us-west1 区域中所有基于 Envoy 的负载均衡器

控制台

如果您使用的是 Google Cloud 控制台,则可以稍后在负载均衡页面上创建代理专用子网。

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

  1. 在 Google Cloud Console 中,转到 VPC 网络页面。
    转到“VPC 网络”
  2. 点击共享 VPC 网络的名称:lb-network
  3. 点击添加子网
  4. 对于名称,请输入 proxy-only-subnet
  5. 对于区域,请选择 us-west1
  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=us-west1 \
    --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. 网络下,选择 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
    • 网络NETWORK
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围0.0.0.0/0
    • 协议和端口:选择指定的协议和端口,然后输入 tcp:22
  4. 点击创建
  5. 再次点击创建防火墙规则,以创建允许从代理专用子网到 Google Cloud 后端的传入连接的规则:
    • 名称fw-allow-proxy-only-subnet
    • 网络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 地址

控制台

您可以使用 Google Cloud Console 预留内部 IP 地址。

  1. 在 Google Cloud Console 中,转到 VPC 网络页面。

    进入“VPC 网络”

  2. 点击用于配置环境之间的混合连接的网络。
  3. 点击静态内部 IP 地址,然后点击预留静态地址
  4. 输入名称LB_IP_ADDRESS
  5. 对于子网,选择 backend-subnet
  6. 如果要指定要预留的 IP 地址,请在静态 IP 地址下选择让我自行选择,然后填写自定义 IP 地址。否则,系统会自动为您分配子网中的 IP 地址。
  7. 如果要将此 IP 地址与多个转发规则一起使用,请在用途下选择共享
  8. 点击保留以完成此流程。

gcloud

为负载均衡器的转发规则预留区域内部 IP 地址。

gcloud compute addresses create LB_IP_ADDRESS \
    --region=us-west1 \
    --subnet=backend-subnet \
    --purpose=SHARED_LOADBALANCER_VIP

设置可用区级 NEG

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

创建虚拟机

控制台

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。
    转到“虚拟机实例”
  2. 点击创建实例
  3. 名称设置为 vm-a1
  4. 对于区域,请选择 us-west1
  5. 对于可用区,请选择 us-west1-a
  6. 启动磁盘部分中,确保为启动磁盘选项选择了 Debian 操作系统和 10 (Buster) 版本。如有必要,请点击选择以更改映像。
  7. 点击高级选项
  8. 点击网络并配置以下字段:
    1. 对于网络标记,请输入 allow-sshallow-health-checkallow-proxy-only-subnet
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network
      • 子网backend-subnet
  9. 点击管理。将以下脚本输入启动脚本字段。

    #! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    sudo echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    
  10. 点击创建

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

    • 名称:vm-a2,可用区:us-west1-a
    • 名称:vm-c1,可用区:us-west1-c
    • 名称:vm-c2,可用区:us-west1-c

gcloud

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

  • VM_NAME: vm-a1ZONE: us-west1-a
  • VM_NAME: vm-a2ZONE: us-west1-a
  • VM_NAME: vm-c1ZONE: us-west1-c
  • VM_NAME: vm-c2ZONE: us-west1-c

    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
         vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         http://169.254.169.254/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    

创建可用区级 NEG

gcloud

  1. us-west1-a 可用区中创建具有 GCE_VM_IP_PORT 端点的可用区级 NEG。

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

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

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

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

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

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

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

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

配置负载均衡器

控制台

gcloud

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

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

    gcloud compute backend-services create internal-tcp-proxy-bs \
       --load-balancing-scheme=INTERNAL_MANAGED \
       --protocol=TCP \
       --region=us-west1 \
       --health-checks=tcp-health-check \
       --health-checks-region=us-west1
    
  3. us-west1-a 可用区中的可用区级 NEG 添加到后端服务。

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

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

    gcloud compute target-tcp-proxies create int-tcp-target-proxy \
       --backend-service=internal-tcp-proxy-bs \
       --region=us-west1
    
  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=LB_IP_ADDRESS \
      --ports=9090 \
      --region=us-west1 \
      --target-tcp-proxy=int-tcp-target-proxy \
      --target-tcp-proxy-region=us-west1
    

测试负载均衡器

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

创建客户端虚拟机

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

控制台

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

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 client-vm

  4. 可用区设置为 CLIENT_VM_ZONE

  5. 点击高级选项

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

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

gcloud

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

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

将流量发送到负载均衡器

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

  1. 通过 SSH 连接到客户端实例。

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

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

      gcloud compute addresses describe LB_IP_ADDRESS \
        --region=us-west1
      

      记下 IP 地址。

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

      curl IP_ADDRESS:9090
      

后续步骤