使用地区 NEG 设置内部 TCP/UDP 负载平衡

本指南介绍如何部署具有区域网络端点组 (NEG) 后端的内部 TCP/UDP 负载平衡器。可用区级 NEG 是可用区级资源,表示单个子网内 Google Cloud 资源 IP 地址的集合或 IP 地址/端口组合的集合。 借助 NEG,您可以创建表示软件服务的 IP 地址或 IP 地址/端口组合的逻辑分组,而不是创建整个虚拟机。

在按照本指南进行操作之前,请先熟悉以下内容:

内部 TCP/UDP 负载平衡仅支持具有 GCE_VM_IP 端点的区域 NEG。

权限

为按照本指南进行操作,您需要创建实例并修改项目中的网络。您应该具有项目的 Owner 或 Editor 角色,或者应该具有以下 Compute Engine IAM 角色

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

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

设置概览

本指南介绍如何配置和测试具有 GCE_VM_IP 个地区 NEG 后端的内部 TCP/UDP 负载平衡器。此部分中的步骤介绍了如何配置以下内容:

  1. 名为 lb-network 的示例 VPC 网络,其中包含自定义子网
  2. 允许后端虚拟机的传入连接的防火墙规则
  3. 四个虚拟机:
    • us-west1-a 地区中的虚拟机 vm-a1vm-a2
    • us-west1-c”地区中的虚拟机“vm-c1”和“vm-c2
  4. 两个后端区域 NEG,区域 us-west1-a 中的 neg-a,区域 us-west1-c 中的 neg-c。每个 NEG 都将具有以下端点:
    • neg-a 包含以下两个端点:
      • 虚拟机“vm-a1”的内部 IP 地址
      • 虚拟机 vm-a2 的内部 IP 地址
    • neg-c 包含以下两个端点:
      • 虚拟机“vm-c1”的内部 IP 地址
      • 虚拟机 vm-c2 的内部 IP 地址
  5. us-west1-a 中用于测试连接的客户端虚拟机 (vm-client)。
  6. 以下内部 TCP/UDP 负载平衡器组件:
    • us-west1 区域中的内部后端服务,用于管理两个地区 NEG 的连接分布
    • 负载平衡器前端的内部转发规则和内部 IP 地址

此示例的架构如下所示:

具有区域 NEG 的内部 TCP/UDP 负载平衡配置
使用区域 NEG 的内部 TCP/UDP 负载平衡配置

配置网络、地区和子网

本页面介绍的内部 TCP/UDP 负载平衡器示例是在一个名为 lb-network自定义模式 VPC 网络中创建的。

在此示例中,后端虚拟机和负载平衡器的组件位于以下地区和子网中:

  • 地区:us-west1
  • 子网:lb-subnet(其主要 IP 地址范围为 10.1.2.0/24

如需创建示例网络和子网,请按照以下步骤操作。

控制台

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击创建 VPC 网络
  3. 输入 lb-network 作为名称
  4. 子网部分中执行以下操作:
    • 子网创建模式设置为自定义
    • 新子网部分中,输入以下信息:
      • 名称lb-subnet
      • 地区us-west1
      • IP 地址范围10.1.2.0/24
      • 点击完成
  5. 点击创建

gcloud

  1. 创建自定义 VPC 网络:

    gcloud compute networks create lb-network --subnet-mode=custom
    
    1. lb-network 网络中,为 us-west1 区域中的后端虚拟机创建子网:
    gcloud compute networks subnets create lb-subnet \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

配置防火墙规则

此示例使用以下防火墙规则:

  • fw-allow-lb-access:适用于 VPC 网络中所有目标的入站规则,允许来自 10.1.2.0/24 范围内来源的流量。此规则允许来自 lb-subnet 中任何客户端的传入流量。

  • fw-allow-ssh:入站流量规则,它适用于负载平衡实例,允许从任何地址到 TCP 端口 22 的传入 SSH 连接。您可以为此规则选择限制性更高的源 IP 地址范围;例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 地址范围。此示例使用目标标记 allow-ssh 来标识它应该应用到的虚拟机。

如果不使用上述防火墙规则,则默认拒绝入站规则会阻止传入后端实例的流量。

控制台

  1. 转到 Google Cloud Console 中的“防火墙”页面。
    转到“防火墙”页面
  2. 点击创建防火墙规则并输入以下信息,以创建允许子网流量的规则:
    • 名称fw-allow-lb-access
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:网络中的所有实例
    • 来源过滤条件IP ranges
    • 来源 IP 地址范围10.1.2.0/24
    • 协议和端口:允许全部
  3. 点击创建
  4. 再次点击创建防火墙规则,以创建允许传入 SSH 连接的规则:
    • 名称fw-allow-ssh
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件IP ranges
    • 来源 IP 地址范围0.0.0.0/0
    • 协议和端口:选择指定的协议和端口,然后输入 tcp:22
  5. 点击创建
  6. 第三次点击创建防火墙规则,以创建允许 Google Cloud 运行状况检查的规则:
    • 名称fw-allow-health-check
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-health-check
    • 来源过滤条件IP ranges
    • 来源 IP 地址范围130.211.0.0/2235.191.0.0/16
    • 协议和端口:允许全部
  7. 点击创建

gcloud

  1. 创建 fw-allow-lb-access 防火墙规则以允许与子网通信:

    gcloud compute firewall-rules create fw-allow-lb-access \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.1.2.0/24 \
        --rules=tcp,udp,icmp
    
  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. 创建 fw-allow-health-check 规则以允许 Google Cloud 运行状况检查。

    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,udp,icmp
    

创建虚拟机和网络端点组

为了演示内部 TCP/UDP 负载平衡的区域特性,此示例在地区 us-west1-aus- west1-c 中使用两个地区 NEG 后端,即 neg-aneg-c。流量在两个 NEG 以及每个 NEG 中的端点之间进行负载平衡。

创建虚拟机

为了支持此示例,每个虚拟机均运行一个 Apache 网络服务器,该服务器侦听以下 TCP 端口:80、8008、8080、8088、443 和 8443。

每个虚拟机均分配有 lb-subnet 的内部 IP 地址和临时外部(公共)IP 地址。您稍后可以移除外部 IP 地址

后端虚拟机不需要外部 IP 地址;但它们在本示例中非常有用,因为它们允许虚拟机从互联网下载 Apache,并且便于您通过 SSH 进行连接。默认情况下,Apache 配置为绑定到任何 IP 地址。内部 TCP/UDP 负载平衡器通过保留目标 IP 地址来传送数据包。

确保在后端虚拟机上运行的服务器软件侦听的是负载平衡器内部转发规则的 IP 地址。

为便于说明,这些后端虚拟机均运行 Debian GNU/Linux 10。

控制台

创建虚拟机

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 使用以下名称和区域组合重复执行以下步骤,以创建四个虚拟机。
    • 名称:vm-a1,区域:us-west1-a
    • 名称:vm-a2,区域:us-west1-a
    • 名称:vm-c1,区域:us-west1-c
    • 名称:vm-c2,区域:us-west1-c
  3. 点击创建实例
  4. 按照第 2 步中的说明设置名称
  5. 对于地区,选择 us-west1,然后按照第 2 步中的说明选择一个区域
  6. 启动磁盘部分中,确保为启动磁盘选项选择了 Debian 操作系统和 10 (Buster) 版本。如有必要,请点击选择以更改映像。
  7. 点击管理、安全、磁盘、网络、单独租用并进行以下更改:

    • 点击网络并添加以下网络标记allow-sshallow-health-check
    • 点击网络接口下的修改 按钮并进行以下更改,然后点击完成
      • 网络lb-network
      • 子网lb-subnet
      • 主要内部 IP:临时(自动)
      • 外部 IP:临时
    • 点击管理。在启动脚本字段中,复制并粘贴以下脚本内容。所有四个虚拟机的脚本内容均相同:

      #! /bin/bash
      if [ -f /etc/startup_script_completed ]; then
      exit 0
      fi
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      file_ports="/etc/apache2/ports.conf"
      file_http_site="/etc/apache2/sites-available/000-default.conf"
      file_https_site="/etc/apache2/sites-available/default-ssl.conf"
      http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
      http_vh_prts="*:80 *:8008 *:8080 *:8088"
      https_listen_prts="Listen 443\nListen 8443"
      https_vh_prts="*:443 *:8443"
      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
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      prt_conf="$(cat "$file_ports")"
      prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
      prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
      echo "$prt_conf" | tee "$file_ports"
      http_site_conf="$(cat "$file_http_site")"
      http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
      echo "$http_site_conf_2" | tee "$file_http_site"
      https_site_conf="$(cat "$file_https_site")"
      https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
      echo "$https_site_conf_2" | tee "$file_https_site"
      systemctl restart apache2
      touch /etc/startup_script_completed
      
  8. 点击创建

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

    gcloud compute instances create VM-NAME \
        --zone=ZONE \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check \
        --subnet=lb-subnet \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    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
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    

创建 GCE_VM_IP 个地区 NEG

NEG(neg-aneg-c)必须在上一步中创建的虚拟机所在的地区中创建。

控制台

您无法使用 Cloud Console 创建或管理 GCE_VM_IP 区域 NEG。请改用 gcloud 或 REST API。

gcloud

  1. 使用 gcloud compute network-endpoint-groups create 命令在 us-west1-a 中创建名为 neg-aGCE_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
    
  2. 将端点添加到 neg-a

    gcloud compute network-endpoint-groups update neg-a \
        --zone=us-west1-a \
        --add-endpoint='instance=vm-a1' \
        --add-endpoint='instance=vm-a2'
    
  3. 使用 gcloud compute network-endpoint-groups create 命令在 us-west1-c 中创建名为 neg-cGCE_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
    
  4. 将端点添加到 neg-c

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

创建客户端虚拟机

此示例在后端(服务器)虚拟机所在的同一地区创建一个客户端虚拟机 (vm-client)。该客户端用于验证负载平衡器的配置,并演示测试部分中所述的预期行为。

控制台

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击创建实例
  3. 名称设置为 vm-client
  4. 区域设置为 us-west1-a
  5. 点击管理、安全、磁盘、网络、单独租用并进行以下更改:
    • 点击网络并将 allow-ssh 添加到网络标记
    • 点击网络接口下的修改按钮并进行以下更改,然后点击完成
      • 网络lb-network
      • 子网lb-subnet
      • 主要内部 IP:临时(自动)
      • 外部 IP:临时
  6. 点击创建

gcloud

客户端虚拟机可以位于负载平衡器所在的同一地区的任何区域中,并且可以使用该地区中的任何子网。在此示例中,客户端位于 us-west1-a 区域,并使用与后端虚拟机相同的子网。

gcloud compute instances create vm-client \
    --zone=us-west1-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=lb-subnet

配置负载平衡器组件

以下步骤会配置所有内部 TCP/UDP 负载平衡器组件

  • 后端服务:在此示例中,您需要通过负载平衡器传递 HTTP 流量。因此,您需要使用 TCP,而不是 UDP。

  • 转发规则:本示例创建了一条内部转发规则。

  • 内部 IP 地址:在此示例中,您在创建转发规则时指定了内部 IP 地址 10.1.2.99

控制台

gcloud

  1. 创建新的区域 HTTP 运行状况检查。

    gcloud compute health-checks create http hc-http-80 \
        --region=us-west1 \
        --port=80
    
  2. 创建后端服务:

    gcloud compute backend-services create bs-ilb \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  3. 将两个地区 NEG(neg-aneg-c)添加到后端服务:

    gcloud compute backend-services add-backend bs-ilb \
        --region=us-west1 \
        --network-endpoint-group=neg-a \
        --network-endpoint-group-zone=us-west1-a
    
    gcloud compute backend-services add-backend bs-ilb \
        --region=us-west1 \
        --network-endpoint-group=neg-c \
        --network-endpoint-group-zone=us-west1-c
    
  4. 为后端服务创建转发规则。创建转发规则时,请指定 10.1.2.99 作为子网中的内部 IP 地址。

    gcloud compute forwarding-rules create fr-ilb \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=bs-ilb \
        --backend-service-region=us-west1
    

测试

此测试通过单独的客户端虚拟机连接负载平衡器;也就是说,并非使用负载平衡器的后端虚拟机。预期的行为是流量分布在四个后端虚拟机中,因为没有配置会话亲和性

  1. 连接到客户端虚拟机实例。

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. 使用 curl 连接负载平衡器的 IP 地址,通过这种方式向负载平衡器发送 Web 请求。重复该请求,您可以看到响应来自不同的后端虚拟机。根据每个后端虚拟机上 /var/www/html/index.html 的内容,生成响应的虚拟机的名称会显示在 HTML 响应的文本中。预期响应如 Page served from: vm-a1Page served from: vm-a2 等。

    curl http://10.1.2.99
    

    转发规则配置为提供端口 80800880808088。如需向这些端口发送流量,请在 IP 地址后附加英文冒号 (:) 和端口号,如下所示:

    curl http://10.1.2.99:8008
    

后续步骤