为多个 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 工具指南。您可以在 API 和 gcloud 参考指南中找到与负载均衡相关的命令。

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

本指南假定您熟悉 bash

设置网络和子网

本页面中的示例使用名为 lb-network自定义模式 VPC 网络。如果您只想处理 IPv4 流量,则可以使用自动模式网络。但是,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 Console 中,转到 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 Console 中,转到 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)。

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

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

控制台

  1. 创建实例模板。在控制台中,打开实例模板页面。

    打开“实例模板”

    1. 点击创建实例模板
    2. 对于名称,输入 ig-us-template-tcp-80
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (buster)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get
    4. 点击网络、磁盘、安全、管理、单租户
    5. 点击管理,并将以下脚本复制到启动脚本字段中。

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo a2ensite default-ssl
      sudo a2enmod ssl
      sudo 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
      
    6. 点击网络

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

  2. 创建代管式实例组。在控制台中,打开实例组页面。

    打开“实例组”

    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
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo 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
    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
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo 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
    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. 创建实例模板。在控制台中,打开实例模板页面。

    打开“实例模板”

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

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo a2ensite default-ssl
      sudo a2enmod ssl
      sudo 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
      sudo sed -ire 's/^Listen 80$/Listen 8080/g' /etc/apache2/ports.conf
      sudo systemctl restart apache2
      
    6. 点击网络

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

  2. 创建代管式实例组。在控制台中,打开实例组页面。

    打开“实例组”

    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
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo 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
    sudo sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
    sudo 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
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo 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
    sudo sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
    sudo 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 Console 中的“防火墙”页面。
    转到“防火墙”页面
  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. (仅适用于 IPv4 流量)为负载均衡器创建静态外部 IP 地址

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

    在此示例中,IPv6 转发规则使用临时 IP 地址。预留静态外部 IPv6 地址仍处于预览阶段,并且需要列入许可名单的项目。如需了解详情,请参阅预留外部 IPv6 地址

  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 是默认转发规则协议,无需明确设置。

      使用临时 IP 地址。

      gcloud compute forwarding-rules create forwarding-rule-tcp-80-ipv6 \
          --load-balancing-scheme external \
          --region us-central1 \
          --subnet lb-subnet \
          --ip-version 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 转发规则。

      使用临时 IP 地址。

      gcloud compute forwarding-rules create forwarding-rule-l3-default-ipv6 \
          --load-balancing-scheme external \
          --region us-central1 \
          --subnet lb-subnet \
          --ip-version 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

使用以下命令获取第二个负载均衡器使用的 forwarding-rule-l3-default-ipv6 的 IPv6 地址。

gcloud compute forwarding-rules describe forwarding-rule-l3-default-ipv6 \
    --region us-central1

将流量发送到负载均衡器

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

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

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

    $ while true; do curl -m1 IP_ADDRESS; 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. 在控制台中,打开虚拟机实例页面。
      打开“虚拟机实例”页面

    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)
    

后续步骤