设置具有可用区级 NEG 的内部直通网络负载均衡器

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

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

内部直通网络负载均衡器仅支持具有 GCE_VM_IP 端点的可用区级 NEG。

权限

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

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

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

设置概览

本指南介绍如何配置和测试具有 GCE_VM_IP 可用区级 NEG 后端的内部直通网络负载均衡器。此部分中的步骤介绍了如何配置以下内容:

  1. 名为 lb-network 的示例 VPC 网络,其中包含自定义子网
  2. 允许后端虚拟机的传入连接的防火墙规则
  3. 四个虚拟机:
    • us-west1-a 地区中的虚拟机 vm-a1vm-a2
    • us-west1-c 地区中的虚拟机 vm-c1vm-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. 以下内部直通网络负载均衡器组件:
    • us-west1 区域中的内部后端服务,用于管理两个地区 NEG 的连接分布
    • 负载均衡器前端的内部转发规则和内部 IP 地址

此示例的架构如下所示:

具有可用区级 NEG 的内部直通网络负载均衡器配置
具有可用区级 NEG 的内部直通网络负载均衡器配置

配置网络、区域和子网

本页面介绍的内部直通式网络负载均衡器示例是在一个名为 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 控制台中,转到防火墙页面。
    转到“防火墙政策”
  2. 点击创建防火墙规则并输入以下信息,以创建允许子网流量的规则:
    • 名称fw-allow-lb-access
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:网络中的所有实例
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围10.1.2.0/24
    • 协议和端口:允许全部
  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-health-check
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-health-check
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围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
    

创建 NEG 后端

为了展示内部直通网络负载均衡器的区域级性质,此示例会分别在可用区 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 地址。内部直通网络负载均衡器通过保留目标 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://metadata.google.internal/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://metadata.google.internal/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)必须在上一步中创建的虚拟机所在的可用区中创建。

控制台

如需创建可用区级网络端点组,请执行以下操作:

  1. 转到 Google Cloud 控制台中的“网络端点组”页面。
    转到“网络端点组”页面
  2. 点击创建网络端点组
  3. 输入可用区级 NEG 的名称neg-a
  4. 选择网络端点组类型网络端点组(可用区级)
  5. 选择网络lb-network
  6. 选择子网lb-subnet
  7. 选择可用区us-west1-a
  8. 点击创建
  9. 重复上述步骤,在 us-west1-c 可用区中创建名为 neg-c 的第二个可用区级 NEG。

将端点添加到可用区级 NEG:

  1. 转到 Google Cloud 控制台中的“网络端点组”页面。
    进入“网络端点组”
  2. 点击上一步中创建的第一个网络端点组的名称 (neg-a)。您会看到网络端点组详情页面。
  3. 此组中的网络端点部分,点击添加网络端点。您会看到添加网络端点页面。

    1. 点击虚拟机实例,然后选择 vm-a1 以将其内部 IP 地址添加为网络端点。
    2. 点击创建
    3. 再次点击添加网络端点,然后在虚拟机实例下选择 vm-a2
    4. 点击创建
  4. 点击上一步中创建的第二个网络端点组的名称 (neg-c)。您会看到网络端点组详情页面。

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

    1. 点击虚拟机实例,然后选择 vm-c1 以将其内部 IP 地址添加为网络端点。
    2. 点击创建
    3. 再次点击添加网络端点,然后在虚拟机实例下选择 vm-c2
    4. 点击创建

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'
    

配置负载均衡器组件

以下步骤会配置所有内部直通网络负载均衡器组件

  • 后端服务:在此示例中,您需要通过负载均衡器传递 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
    

测试负载均衡器

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

创建测试客户端虚拟机

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

控制台

  1. 转到 Google Cloud 控制台中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  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

将流量发送到负载均衡器

执行以下步骤以连接到负载均衡器。

  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
    

后续步骤