为多项 IP 协议设置外部直通网络负载均衡器

本指南介绍如何创建基于后端服务的外部直通网络负载均衡器,以对 TCP、UDP、ESP、GRE、ICMP 和 ICMPv6 流量进行负载均衡。如果要对使用 TCP 或 UDP 以外的 IP 协议的流量进行负载均衡,则可以使用这样的配置。基于目标池的外部直通式网络负载均衡器不支持此功能。

如需为 TCP 或 UDP 以外的 IP 协议配置外部直通式网络负载均衡器,您需要创建将协议设置为 L3_DEFAULT 的转发规则。此转发规则指向将协议设置为 UNSPECIFIED 的后端服务

在此示例中,我们使用两个外部直通网络负载均衡器在 us-central1 区域的两个可用区级代管式实例组中的后端虚拟机之间分配流量。两个负载均衡器接收相同的外部 IP 地址的流量。

一个负载均衡器具有使用协议 TCP 和端口 80 的转发规则,另一个负载均衡器具有使用协议 L3_DEFAULT 的转发规则。到达端口 80 上的 IP 地址的 TCP 流量由 TCP 转发规则处理。与 TCP 专用转发规则不匹配的所有其他流量都由 L3_DEFAULT 转发规则处理。

具有可用区级代管式实例组的外部直通式网络负载均衡器
具有可用区级代管式实例组的外部直通式网络负载均衡器

此场景会在运行状况良好的实例之间分配流量。为此,您需要创建 TCP 健康检查,以确保仅将流量发送给运行状况良好的实例。

外部直通式网络负载均衡器是区域级负载均衡器。所有负载均衡器组件都必须位于同一区域。

准备工作

安装 Google Cloud CLI。如需全面了解此工具,请参阅 gcloud CLI 概览。您可以在 API 和 gcloud 参考文档中找到与负载均衡相关的命令。

如果您之前未运行过 gcloud CLI,请先运行 gcloud init 命令进行身份验证。

本指南假定您熟悉 bash

设置网络和子网

本页面中的示例使用名为 lb-network自定义模式 VPC 网络。如果您只想处理 IPv4 流量,则可以使用自动模式 VPC 网络。但是,IPv6 流量需要自定义模式子网

IPv6 流量还需要双栈子网(stack-type 设置为 IPv4_IPv6)。在自定义模式 VPC 网络上创建双栈子网时,您可以为子网选择 IPv6 访问类型。在此示例中,我们将子网的 ipv6-access-type 参数设置为 EXTERNAL。这意味着此子网上的新虚拟机可以分配外部 IPv4 地址和外部 IPv6 地址。

用于此示例的后端和负载均衡器组件位于以下区域和子网中:

  • 区域:us-central1
  • 子网:lb-subnet,其主要 IPv4 地址范围为 10.1.2.0/24。虽然您可以选择在子网上配置哪个 IPv4 地址范围,但系统会自动分配 IPv6 地址范围。Google 提供固定大小 (/64) 的 IPv6 CIDR 地址块。

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

控制台

如需同时支持 IPv4 和 IPv6 流量,请按照以下步骤操作:

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 输入 lb-network 作为名称

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

    • 子网创建模式设置为自定义
    • 新子网部分中,配置以下字段,然后点击完成
      • 名称lb-subnet
      • 区域us-central1
      • IP 栈类型IPv4 和 IPv6(双栈)
      • IPv4 范围10.1.2.0/24
        虽然您可以为子网配置 IPv4 地址范围,但您不能为子网选择 IPv6 地址范围。Google 提供固定大小 (/64) 的 IPv6 CIDR 地址块。
      • IPv6 访问类型外部
  5. 点击创建

如需支持仅限 IPv4 流量,请按以下步骤操作:

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 输入 lb-network 作为名称

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

    • 子网创建模式设置为自定义
    • 新子网部分中,配置以下字段,然后点击完成
      • 名称lb-subnet
      • 区域us-central1
      • IP 栈类型IPv4(单栈)
      • IPv4 范围10.1.2.0/24
  5. 点击创建

gcloud

  1. 创建自定义模式 VPC 网络:

    gcloud compute networks create lb-network \
        --subnet-mode=custom
    
  2. lb-network 网络中,为 us-central1 区域中的后端创建子网。

    对于 IPv4 和 IPv6 流量,请使用以下命令创建双栈子网:

    gcloud compute networks subnets create lb-subnet \
      --stack-type=IPV4_IPv6 \
      --ipv6-access-type=EXTERNAL \
      --network=lb-network \
      --range=10.1.2.0/24 \
      --region=us-central1
    

    对于仅限 IPv4 流量,请使用以下命令:

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

创建可用区代管式实例组

对于此负载均衡场景,您将创建两个 Compute Engine 可用区代管式实例组并在每个实例上安装一个 Apache Web 服务器。

要同时处理 IPv4 和 IPv6 流量,请将后端虚拟机配置为双栈。将虚拟机的 stack-type 设置为 IPv4_IPv6。虚拟机还会从子网继承 ipv6-access-type 设置(在此示例中为 EXTERNAL)。 如需详细了解 IPv6 要求,请参阅外部直通式网络负载均衡器概览:转发规则

如需将现有虚拟机用作后端,请使用 gcloud compute instances network-interfaces update 命令将虚拟机更新为双栈。

作为外部直通式网络负载均衡器的后端虚拟机参与的实例必须运行相应的 Linux 客机环境Windows 客机环境或提供同等功能的其他进程。

为端口 80 上的 TCP 流量创建实例组

控制台

  1. 创建实例模板。在 Google Cloud 控制台中,进入实例模板页面。

    转到“实例模板”

    1. 点击创建实例模板
    2. 对于名称,输入 ig-us-template-tcp-80
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (buster)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get
    4. 展开高级选项部分。
    5. 展开管理部分,然后将以下脚本复制到启动脚本字段中。

      #! /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
      
    6. 展开网络部分,然后指定以下内容:

      1. 对于网络标记,请添加 network-lb-tcp-80
      2. 对于网络接口,请点击默认接口并配置以下字段:
        1. 网络lb-network
        2. 子网lb-subnet
    7. 点击创建

  2. 创建代管式实例组。转到 Google Cloud 控制台中的实例组页面。

    转到“实例组”

    1. 点击创建实例组
    2. 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG
    3. 名称输入 ig-us-tcp-80
    4. 位置下方,选择单个可用区
    5. 对于区域,请选择 us-central1
    6. 对于可用区,请选择 us-central1-a
    7. 实例模板下,选择 ig-us-template-tcp-80
    8. 指定要在组中创建的实例数。

      对于此示例,请在自动扩缩下指定以下选项:

      • 对于自动扩缩模式,请选择 Off:do not autoscale
      • 对于实例数上限,请输入 2
    9. 点击创建

gcloud

本指南中的 gcloud 说明假定您使用的是 Cloud Shell 或安装了 bash 的其他环境。

  1. 使用 gcloud compute instance-templates create 命令创建含有 HTTP 服务器的虚拟机实例模板。

    如需同时处理 IPv4 和 IPv6 流量,请使用以下命令。

    gcloud compute instance-templates create ig-us-template-tcp-80 \
    --region=us-central1 \
    --network=lb-network \
    --subnet=lb-subnet \
    --ipv6-network-tier=PREMIUM \
    --stack-type=IPv4_IPv6 \
    --tags=network-lb-tcp-80 \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --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'
    

    或者,如果您只想处理 IPv4 流量,请使用以下命令。

    gcloud compute instance-templates create ig-us-template-tcp-80 \
    --region=us-central1 \
    --network=lb-network \
    --subnet=lb-subnet \
    --tags=network-lb-tcp-80 \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --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'
    
  2. 使用 gcloud compute instance-groups managed create 命令在可用区中创建一个代管式实例组。

    gcloud compute instance-groups managed create ig-us-tcp-80 \
        --zone us-central1-a \
        --size 2 \
        --template ig-us-template-tcp-80
    

为端口 8080 上的 TCP、UDP、ESP 和 ICMP 流量创建实例组

控制台

  1. 创建实例模板。在 Google Cloud 控制台中,进入实例模板页面。

    转到“实例模板”

    1. 点击创建实例模板
    2. 名称输入 ig-us-template-l3-default
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (buster)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get
    4. 展开高级选项部分。
    5. 展开管理部分,然后将以下脚本复制到启动脚本字段中。启动脚本还会将 Apache 服务器配置为监听端口 8080,而不是端口 80

      #! /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
      sed -ire 's/^Listen 80$/Listen 8080/g' /etc/apache2/ports.conf
      systemctl restart apache2
      
    6. 展开网络部分,然后指定以下内容:

      1. 对于网络标记,请添加 network-lb-l3-default
      2. 对于网络接口,请点击默认接口并配置以下字段:
        1. 网络lb-network
        2. 子网lb-subnet
    7. 点击创建

  2. 创建代管式实例组。转到 Google Cloud 控制台中的实例组页面。

    转到“实例组”

    1. 点击创建实例组
    2. 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG
    3. 名称输入 ig-us-l3-default
    4. 位置下方,选择单个可用区
    5. 对于区域,请选择 us-central1
    6. 对于可用区,请选择 us-central1-c
    7. 实例模板下,选择 ig-us-template-l3-default
    8. 指定要在组中创建的实例数。

      对于此示例,请在自动扩缩下指定以下选项:

      • 对于自动扩缩模式,请选择 Off:do not autoscale
      • 对于实例数上限,请输入 2
    9. 点击创建

gcloud

本指南中的 gcloud 说明假定您使用的是 Cloud Shell 或安装了 bash 的其他环境。

  1. 使用 gcloud compute instance-templates create 命令创建含有 HTTP 服务器的虚拟机实例模板。

    启动脚本还会将 Apache 服务器配置为侦听端口 8080,而不是端口 80

    如需同时处理 IPv4 和 IPv6 流量,请使用以下命令。

    gcloud compute instance-templates create ig-us-template-l3-default \
    --region=us-central1 \
    --network=lb-network \
    --subnet=lb-subnet \
    --ipv6-network-tier=PREMIUM \
    --stack-type=IPv4_IPv6 \
    --tags=network-lb-l3-default \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --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
    sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
    systemctl restart apache2'
    

    或者,如果您只想处理 IPv4 流量,请使用以下命令。

    gcloud compute instance-templates create ig-us-template-l3-default \
    --region=us-central1 \
    --network=lb-network \
    --subnet=lb-subnet \
    --tags=network-lb-l3-default \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --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
    sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
    systemctl restart apache2'
    
  2. 使用 gcloud compute instance-groups managed create 命令在可用区中创建一个代管式实例组。

    gcloud compute instance-groups managed create ig-us-l3-default \
        --zone us-central1-c \
        --size 2 \
        --template ig-us-template-l3-default
    

配置防火墙规则

创建以下防火墙规则:

  • 允许外部 TCP 流量通过端口 80(使用目标标记 network-lb-tcp-80)到达 ig-us-tcp-80 实例组中的后端实例的防火墙规则。创建单独的防火墙规则以允许 IPv4 和 IPv6 流量。
  • 允许其他外部流量(端口 8080 上的 TCP、UDP、ESP 和 ICMP)到达 ig-us-l3-default 实例组中的后端实例的防火墙规则(使用目标标记 network-lb-l3-default)。创建单独的防火墙规则以允许 IPv4 和 IPv6 流量。

此示例会创建防火墙规则,以允许来自所有来源范围的流量到达已配置端口上的后端实例。如果要专门为健康检查探测创建单独的防火墙规则,请使用健康检查概览:探测 IP 范围和防火墙规则中记录的来源 IP 地址范围。

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。
    前往“防火墙政策”
  2. 如需允许 IPv4 TCP 流量到达 ig-us-tcp-80 实例组中的后端,请创建以下防火墙规则。
    1. 点击创建防火墙规则
    2. 输入 allow-network-lb-tcp-80-ipv4 作为名称
    3. 选择要应用防火墙规则的网络默认)。
    4. 目标下,选择指定的目标标记
    5. 目标标记字段中,输入 network-lb-tcp-80
    6. 来源过滤条件设置为 IPv4 范围
    7. 来源 IPv4 地址范围设置为 0.0.0.0/0(允许来自任何来源的流量)。这样,外部流量和健康检查探测都会到达后端实例。
    8. 协议和端口下,选择指定的协议和端口。选中 TCP 复选框并输入 80
    9. 点击创建。新的防火墙规则可能需要一段时间才能在控制台中显示,或者您可能需要点击刷新才能看见规则。
  3. 如需允许 IPv4 UDP、ESP 和 ICMP 流量到达 ig-us-l3-default 实例组中的后端,请创建以下防火墙规则。
    1. 点击创建防火墙规则
    2. 输入 allow-network-lb-l3-default-ipv4 作为名称
    3. 选择要应用防火墙规则的网络默认)。
    4. 目标下,选择指定的目标标记
    5. 目标标记字段中,输入 network-lb-l3-default
    6. 来源过滤条件设置为 IPv4 范围
    7. 来源 IPv4 地址范围设置为 0.0.0.0/0(允许来自任何来源的流量)。这样,外部流量和健康检查探测都会到达后端实例。
    8. 协议和端口下,选择指定的协议和端口
      1. 选中 TCP 复选框并输入 8080
      2. 选中 UDP 复选框。
      3. 选择其他复选框,然后输入 esp, icmp
    9. 点击创建。新的防火墙规则可能需要一段时间才能在控制台中显示,或者您可能需要点击刷新才能看见规则。
  4. 如需允许 IPv6 TCP 流量到达 ig-us-tcp-80 实例组中的后端,请创建以下防火墙规则。
    1. 点击创建防火墙规则
    2. 输入 allow-network-lb-tcp-80-ipv6 作为名称
    3. 选择要应用防火墙规则的网络默认)。
    4. 目标下,选择指定的目标标记
    5. 目标标记字段中,输入 network-lb-tcp-80
    6. 来源过滤条件设置为 IPv6 范围
    7. 来源 IPv6 范围设置为 ::/0(允许来自任何来源的流量)。这样,外部流量和健康检查探测都会到达后端实例。
    8. 协议和端口下,选择指定的协议和端口。点击 TCP 旁边的复选框,然后输入 80
    9. 点击创建。新的防火墙规则可能需要一段时间才能在控制台中显示,或者您可能需要点击刷新才能看见规则。
  5. 如需允许 IPv6 UDP、ESP 和 ICMPv6 流量到达 ig-us-l3-default 实例组中的后端,请创建以下防火墙规则。此防火墙规则还允许 TCP 健康检查探测到达端口 8080 上的实例。
    1. 点击创建防火墙规则
    2. 输入 allow-network-lb-l3-default-ipv6 作为名称
    3. 选择要应用防火墙规则的网络默认)。
    4. 目标下,选择指定的目标标记
    5. 目标标记字段中,输入 network-lb-l3-default
    6. 来源过滤条件设置为 IPv6 范围
    7. 来源 IPv6 范围设置为 ::/0(允许来自任何来源的流量)。这样,外部流量和健康检查探测都会到达后端实例。
    8. 协议和端口下,选择指定的协议和端口
      1. 点击 TCP 旁边的复选框,然后输入 8080
      2. 点击 UDP 旁边的复选框。
      3. 点击其他旁边的复选框,然后输入 esp, 58
    9. 点击创建。新的防火墙规则可能需要一段时间才能在控制台中显示,或者您可能需要点击刷新才能看见规则。

gcloud

  1. 如需允许 IPv4 TCP 流量到达 ig-us-tcp-80 实例组中的后端,请创建以下防火墙规则。

    gcloud compute firewall-rules create allow-network-lb-tcp-80-ipv4 \
        --network=lb-network \
        --target-tags network-lb-tcp-80 \
        --allow tcp:80 \
        --source-ranges=0.0.0.0/0
    
  2. 如需允许 IPv4 UDP、ESP 和 ICMP 流量到达 ig-us-l3-default 实例组中的后端,请创建以下防火墙规则。此防火墙规则还允许 TCP 健康检查探测到达端口 8080 上的实例。

    gcloud compute firewall-rules create allow-network-lb-l3-default-ipv4 \
        --network=lb-network \
        --target-tags network-lb-l3-default \
        --allow tcp:8080,udp,esp,icmp \
        --source-ranges=0.0.0.0/0
    
  3. 如需允许 IPv6 TCP 流量到达 ig-us-tcp-80 实例组中的后端,请创建以下防火墙规则。

    gcloud compute firewall-rules create allow-network-lb-tcp-80-ipv6 \
        --network=lb-network \
        --target-tags network-lb-tcp-80 \
        --allow tcp:80 \
        --source-ranges=::/0
    
  4. 如需允许 IPv6 UDP、ESP 和 ICMPv6 流量到达 ig-us-l3-default 实例组中的后端,请创建以下防火墙规则。此防火墙规则还允许 TCP 健康检查探测到达端口 8080 上的实例。

    gcloud compute firewall-rules create allow-network-lb-l3-default-ipv6 \
        --network=lb-network \
        --target-tags network-lb-l3-default \
        --allow tcp:8080,udp,esp,58 \
        --source-ranges=::/0
    

配置负载均衡器

接下来,设置负载均衡器。配置一个负载均衡器用于处理端口 80 上的 TCP 流量,另一个负载均衡器用于处理端口 8080 上的 TCP、UDP、ESP 和 ICMP 流量。两个负载均衡器将使用与其转发规则相同的外部 IP 地址。

配置负载均衡器时,后端虚拟机实例将接收发往您配置的静态外部 IP 地址的数据包。如果您使用的是 Compute Engine 提供的映像,则系统会自动配置您的实例处理此 IP 地址。如果您使用任何其他映像,则必须将此地址配置为 eth0 上的别名或每个实例上的环回地址。

控制台

gcloud

  1. 预留静态外部 IP 地址。

    对于 IPv4 流量:为负载均衡器创建静态外部 IP 地址

    gcloud compute addresses create network-lb-ipv4 \
        --region us-central1
    

    对于 IPv6 流量:为负载均衡器创建静态外部 IPv6 地址范围。使用的子网必须是具有外部 IPv6 子网范围的双栈子网。

    gcloud compute addresses create network-lb-ipv6 \
        --region us-central1 \
        --subnet lb-subnet \
        --ip-version IPV6 \
        --endpoint-type NETLB
    
  2. 为端口 80 创建 TCP 健康检查。此健康检查用于验证 ig-us-tcp-80 实例组中的后端的健康状况。

    gcloud compute health-checks create tcp tcp-health-check-80 \
        --region us-central1 \
        --port 80
    
  3. 为端口 8080 创建 TCP 健康检查。此健康检查用于验证 ig-us-l3-default 实例组中的后端的健康状况。

    gcloud compute health-checks create tcp tcp-health-check-8080 \
        --region us-central1 \
        --port 8080
    
  4. 为端口 80 上的 TCP 流量创建第一个负载均衡器。

    1. 创建后端服务,并将协议设置为 TCP

      gcloud compute backend-services create backend-service-tcp-80 \
          --protocol TCP \
          --health-checks tcp-health-check-80 \
          --health-checks-region us-central1 \
          --region us-central1
      
    2. 将后端实例组添加到后端服务。

      gcloud compute backend-services add-backend backend-service-tcp-80 \
          --instance-group ig-us-tcp-80 \
          --instance-group-zone us-central1-a \
          --region us-central1
      
    3. 对于 IPv4 流量:创建转发规则以将端口 80 上的传入 TCP 流量路由到后端服务。TCP 是默认转发规则协议,无需明确设置。

      使用第 1 步中预留的 IP 地址作为负载均衡器的静态外部 IP 地址。

      gcloud compute forwarding-rules create forwarding-rule-tcp-80-ipv4 \
          --load-balancing-scheme external \
          --region us-central1 \
          --ports 80 \
          --address network-lb-ipv4 \
          --backend-service backend-service-tcp-80
      
    4. 对于 IPv6 流量:创建转发规则以将端口 80 上的传入 TCP 流量路由到后端服务。TCP 是默认转发规则协议,无需明确设置。

      使用第 1 步中预留的 IPv6 地址范围作为负载均衡器的静态外部 IP 地址。使用的子网必须是具有外部 IPv6 子网范围的双栈子网。

      gcloud compute forwarding-rules create forwarding-rule-tcp-80-ipv6 \
          --load-balancing-scheme external \
          --region us-central1 \
          --network-tier PREMIUM \
          --ip-version IPV6 \
          --subnet lb-subnet \
          --address network-lb-ipv6 \
          --ports 80 \
          --backend-service backend-service-tcp-80
      
  5. 为端口 8080 上的 TCP、UDP、ESP 和 ICMP 流量创建第二个负载均衡器。

    1. 创建后端服务,并将协议设置为 UNSPECIFIED

      gcloud compute backend-services create backend-service-l3-default \
          --protocol UNSPECIFIED \
          --health-checks tcp-health-check-8080 \
          --health-checks-region us-central1 \
          --region us-central1
      
    2. 将后端实例组添加到后端服务。

      gcloud compute backend-services add-backend backend-service-l3-default \
          --instance-group ig-us-l3-default \
          --instance-group-zone us-central1-c \
          --region us-central1
      
    3. 对于 IPv4 流量:创建协议设置为 L3_DEFAULT 的转发规则,以处理其余所有受支持的 IP 协议流量(端口 8080 上的 TCP、UDP、ESP 和 ICMP)。所有端口都必须配置有 L3_DEFAULT 转发规则。

      使用您用于前一个负载均衡器的外部 IPv4 地址。

      gcloud compute forwarding-rules create forwarding-rule-l3-default-ipv4 \
          --load-balancing-scheme external \
          --region us-central1 \
          --ports all \
          --ip-protocol L3_DEFAULT \
          --address network-lb-ipv4 \
          --backend-service backend-service-l3-default
      
    4. 对于 IPv6 流量:创建协议设置为 L3_DEFAULT 的转发规则,以处理其余所有受支持的 IP 协议流量(端口 8080 上的 TCP、UDP、ESP 和 ICMP)。所有端口都必须配置有 L3_DEFAULT 转发规则。

      使用第 1 步中预留的 IPv6 地址范围作为负载均衡器的静态外部 IP 地址。使用的子网必须是具有外部 IPv6 子网范围的双栈子网。

      gcloud compute forwarding-rules create forwarding-rule-l3-default-ipv6 \
          --load-balancing-scheme external \
          --region us-central1 \
          --network-tier PREMIUM \
          --ip-version IPV6 \
          --subnet lb-subnet \
          --address network-lb-ipv6 \
          --ports all \
          --ip-protocol L3_DEFAULT \
          --backend-service backend-service-l3-default
      

测试负载均衡器

至此您已经配置好了负载均衡服务,接下来可以开始将流量发送到负载均衡器的外部 IP 地址,并观察流量被分发到不同的后端实例。

查询负载均衡器的外部 IP 地址

控制台

  1. 高级负载均衡页面中,转到转发规则标签页。
    转到“转发规则”标签页
  2. 找到负载均衡器使用的转发规则。
  3. IP 地址列中,记下为每个 IPv4 和 IPv6 转发规则列出的外部 IP 地址。

gcloud:IPv4

输入以下命令,查看负载均衡器使用的转发规则的外部 IP 地址。

gcloud compute forwarding-rules describe forwarding-rule-tcp-80-ipv4 \
    --region us-central1

此示例对两个 IPv4 转发规则使用相同的 IP 地址,从而也可以使用 forwarding-rule-l3-default-ipv4 来正常工作。

gcloud:IPv6

输入以下命令,查看负载均衡器使用的 forwarding-rule-tcp-80-ipv6 转发规则的外部 IPv6 地址。

gcloud compute forwarding-rules describe forwarding-rule-tcp-80-ipv6 \
    --region us-central1

此示例对两个 IPv6 转发规则使用相同的 IP 地址,因此使用 forwarding-rule-l3-default-ipv6 也有效。

将流量发送到负载均衡器

此过程会将外部流量发送到负载均衡器。运行以下测试以确保 ig-us-tcp-80 实例组对端口 80 上的 TCP 流量进行负载均衡,而所有其他流量(端口 8080 上的 TCP、UDP、ESP 和 ICMP)正在由 ig-us-l3-default 实例组处理该实例组。

在端口 80 上使用 TCP 请求验证行为

  1. 使用 curl 联系负载均衡器以发出 IP 地址(通过端口 80 上的 TCP)。

    • 从具有 IPv4 连接的客户端,运行以下命令:

      $ while true; do curl -m1 IP_ADDRESS; done
      
    • 从具有 IPv6 连接的客户端,运行以下命令:

      $ while true; do curl -m1 http://IPV6_ADDRESS; done
      

      比方说,如果分配的 IPv6 地址为 [2001:db8:1:1:1:1:1:1/96],则该命令应如下所示:

      $ while true; do curl -m1 http://[2001:db8:1:1:1:1:1:1]; done
      
  2. 请注意 curl 命令返回的结果。该结果文本中显示了生成响应的后端虚拟机的名称,例如:Page served from: VM_NAME。响应应仅来自 ig-us-tcp-80 实例组中的实例。

    如果响应最初不成功,您可能需要等待大约 30 秒,以便完全加载配置并且实例被标记为运行状况良好,然后再次尝试。

在端口 8080 上使用 TCP 请求验证行为

使用 curl 向负载均衡器发出 Web 请求(通过端口 8080 上的 TCP)以联系其 IP 地址。

  • 从具有 IPv4 连接的客户端,运行以下命令:

    $ while true; do curl -m1 IPV4_ADDRESS:8080; done
    
  • 从具有 IPv6 连接的客户端,运行以下命令:

    $ while true; do curl -m1 http://IPV6_ADDRESS; done
    

    比方说,如果分配的 IPv6 地址为 [2001:db8:1:1:1:1:1:1/96],则该命令应如下所示:

    $ while true; do curl -m1 http://[2001:db8:1:1:1:1:1:1]:8080; done
    

请注意 curl 命令返回的结果。响应应仅来自 ig-us-l3-default 实例组中的实例。

这表明发送到端口 8080 的负载均衡器的 IP 地址的任何流量仅由 ig-us-l3-default 实例组中的后端处理。

使用 ICMP 请求验证行为

如需验证使用 ICMP 流量的行为,您需要从 tcpdump 命令捕获输出,以确认只有 ig-us-l3-default 实例组中的后端虚拟机正在处理发送到负载均衡器的 ICMP 请求。

  1. 通过 SSH 连接到后端虚拟机。

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

    2. 在虚拟机实例列表中,点击要连接的实例所在行中的 SSH

  2. 运行以下命令以使用 tcpdump 开始监听 ICMP 流量。

    sudo tcpdump icmp -w ~/icmpcapture.pcap -s0 -c 10000
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    

    使 SSH 窗口保持打开状态。

  3. 对所有四个后端虚拟机重复第 1 步和第 2 步。

  4. 向负载均衡器发出 ICMP 请求。

    如需测试 IPv4 响应,请使用 ping 联系负载均衡器的 IPv4 地址。

    ping IPV4_ADDRESS
    

    如需测试 IPv6 响应,请使用 ping6 联系负载均衡器的 IPv6 地址。

    ping6 IPV6_ADDRESS
    

    比方说,如果分配的 IPv6 地址为 [2001:db8:1:1:1:1:1:1/96],则该命令应如下所示:

    ping6 2001:db8:1:1:1:1:1:1
    
  5. 返回至每个虚拟机的打开的 SSH 窗口,然后停止 tcpdump 捕获命令。您可以使用 Ctrl+C 来执行此操作。

  6. 对于每个虚拟机,请检查 icmpcapture.pcap 文件中 tcpdump 命令的输出。

    sudo tcpdump -r ~/icmpcapture.pcap -n
    

    对于 ig-us-l3-default 实例组中的后端虚拟机,您应该会看到类似如下的条目:

    reading from file /home/[user-directory]/icmpcapture.pcap, link-type EN10MB (Ethernet)
    22:13:07.814486 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 1, length 64
    22:13:07.814513 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 1, length 64
    22:13:08.816150 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 2, length 64
    22:13:08.816175 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 2, length 64
    22:13:09.817536 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 3, length 64
    22:13:09.817560 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 3, length 64
    ...
    

    对于 ig-us-tcp-80 实例组中的后端虚拟机,您应该会看到未收到任何数据包,该文件应为空:

    reading from file /home/[user-directory]/icmpcapture.pcap, link-type EN10MB (Ethernet)
    

后续步骤