为多个协议设置具有虚拟机实例组后端的内部直通网络负载均衡器

本页面介绍了如何创建内部直通网络负载均衡器以对多个协议的流量进行负载均衡。

如需为多个协议(包括 TCP 和 UDP)配置负载均衡器,您需要创建将协议设置为 L3_DEFAULT 的转发规则。此转发规则指向将协议设置为 UNSPECIFIED 的后端服务

在此示例中,我们使用一个内部直通网络负载均衡器在 us-west1 区域的后端虚拟机之间分配流量。负载均衡器具有使用 L3_DEFAULT 协议的转发规则来处理 TCP、UDP、ICMP、ICMPv6、SCTP、ESP、AH 和 GRE。

基于协议对 IPv4 和 IPv6 流量进行负载均衡,并使用后端服务管理单个可用区级实例组的连接分布。
多种协议的内部直通网络负载均衡器(点击可放大)。

须知事项

权限

如需获得完成本指南所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

为 L3_DEFAULT 流量设置负载均衡器

此部分中的步骤介绍了以下配置:

  • 使用名为 lb-network自定义模式 VPC 网络的示例。如果您只想处理 IPv4 流量,则可以使用自动模式网络。但是,IPv6 流量需要自定义模式子网
  • 单栈子网(stack-type 设置为 IPv4),IPv4 流量需要该子网。在自定义模式 VPC 网络上创建单栈子网时,您可以为子网选择 IPv4 子网范围。对于 IPv6 流量,我们需要双栈子网(stack-type 设置为 IPv4_IPv6)。在自定义模式 VPC 网络上创建双栈子网时,您可以为子网选择 IPv6 访问类型。在此示例中,我们将子网的 ipv6-access-type 参数设置为 INTERNAL。这意味着此子网上的新虚拟机可以同时分配有内部 IPv4 地址和内部 IPv6 地址。
  • 允许后端虚拟机的传入连接的防火墙规则。
  • 用于此示例的后端实例组和负载均衡器组件位于以下区域和子网中:
    • 地区:us-west1
    • 子网:lb-subnet,其主要 IPv4 地址范围为 10.1.2.0/24。虽然您可以选择在子网上配置哪个 IPv4 地址范围,但系统会自动分配 IPv6 地址范围。Google 提供固定大小 (/64) 的 IPv6 CIDR 地址块。
  • us-west1-a 可用区的代管式实例组中的后端虚拟机。
  • 用于测试与后端的连接的客户端虚拟机。
  • 包含以下组件的内部直通网络负载均衡器:
    • 后端服务健康检查。
    • us-west1 区域中协议设置为 UNSPECIFIED 的后端服务,用于管理到可用区实例组的连接分布。
    • 协议设置为 L3_DEFAULT 且端口设置为 ALL 的转发规则。

配置网络、区域和子网

如需配置具有内部 IPv6 范围的子网,请启用 Virtual Private Cloud (VPC) 网络 ULA 内部 IPv6 范围。内部 IPv6 子网范围是从此范围分配的。 如需创建示例网络和子网,请按照以下步骤操作:

控制台

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

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 对于名称,输入 lb-network

  4. 如果您要在此网络中的子网上配置内部 IPv6 地址范围,请完成以下步骤:

    1. 对于 VPC 网络 ULA 内部 IPv6 范围,选择已启用
    2. 对于分配内部 IPv6 范围,选择自动手动
  5. 对于子网创建模式,选择自定义

  6. 新子网部分,为子网指定以下配置参数:

    1. 对于名称,输入 lb-subnet
    2. 对于区域,请选择 us-west1
    3. 如需创建双栈子网,对于 IP 栈类型,请选择 IPv4 和 IPv6(双栈)
    4. 对于 IPv4 范围,输入 10.1.2.0/24
    5. IPv6 访问权限类型字段中,选择内部
  7. 点击完成

  8. 点击创建

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

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 对于名称,输入 lb-network

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

    • 子网创建模式设置为自定义
    • 新子网部分中,输入以下信息:
      • 名称lb-subnet
      • 区域us-west1
      • IP 栈类型IPv4(单栈)
      • IP 地址范围10.1.2.0/24
    • 点击完成
  5. 点击创建

gcloud

对于 IPv4 和 IPv6 流量,请使用以下命令:

  1. 如需创建新的自定义模式 VPC 网络,请运行 gcloud compute networks create 命令

    如需在此网络中的任何子网上配置内部 IPv6 范围,请使用 --enable-ula-internal-ipv6 标志。此选项会分配 Google Cloud 用于内部 IPv6 子网范围的 fd20::/20 范围内的/48 ULA 前缀。

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

    如需创建子网,请运行 gcloud compute networks subnets create 命令

    gcloud compute networks subnets create lb-subnet \
     --network=lb-network \
     --range=10.1.2.0/24 \
     --region=us-west1 \
     --stack-type=IPV4_IPV6 --ipv6-access-type=INTERNAL
    

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

  1. 如需创建自定义 VPC 网络,请使用 gcloud compute networks create 命令:

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 如需在 lb-network 网络中为 us-west1 区域中的后端创建子网,请使用 gcloud compute networks subnets create 命令。

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

API

对于 IPv4 和 IPv6 流量,请使用以下命令:

  1. 创建一个新的自定义模式 VPC 网络。 向 networks.insert 方法发出 POST 请求。

    如需在此网络中的任何子网上配置内部 IPv6 范围,请将 enableUlaInternalIpv6 设置为 true。此选项会分配 Google 用于内部 IPv6 子网范围的 fd20::/20 范围内的 /48 范围。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
    {
      "autoCreateSubnetworks": false,
      "name": "lb-network",
      "mtu": MTU,
      "enableUlaInternalIpv6": true,
    }
    

    请替换以下内容:

    • PROJECT_ID:在其中创建 VPC 网络的项目的 ID。
    • MTU:该网络的最大传输单元。MTU 可以是 1460(默认值)或 1500。在将 MTU 设置为 1500 之前,请查看最大传输单元概览
  2. subnetworks.insert 方法发出 POST 请求。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
    {
    "ipCidrRange": "10.1.2.0/24",
    "network": "lb-network",
    "name": "lb-subnet"
    "stackType": IPV4_IPV6,
    "ipv6AccessType": Internal
    }
    

对于仅限 IPv4 流量,请执行以下步骤:

  1. networks.insert 方法发出 POST 请求。将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
    {
    "name": "lb-network",
    "autoCreateSubnetworks": false
    }
    
  2. subnetworks.insert 方法发出两个 POST 请求:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks
    {
    "name": "lb-subnet",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
    "ipCidrRange": "10.1.2.0/24",
    "privateIpGoogleAccess": false
    }
    

配置防火墙规则

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

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

  • fw-allow-lb-access-ipv6:入站流量规则,它适用于 VPC 网络中的所有目标,允许来自子网中配置的 IPv6 范围内来源的流量。此规则允许来自该子网的任何客户端的传入 IPv6 流量。

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

  • fw-allow-health-check:入站流量规则,它适用于负载均衡实例,允许来自 Google Cloud 健康检查系统(130.211.0.0/2235.191.0.0/16)的流量。此示例使用目标标记 allow-health-check 来标识应该应用该规则的实例。

  • fw-allow-health-check-ipv6:入站流量规则,它适用于负载均衡实例,允许来自 Google Cloud 健康检查系统 (2600:2d00:1:b029::/64) 的流量。此示例使用目标标记 allow-health-check-ipv6 来标识应该应用该规则的实例。

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

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。

    转到“防火墙政策”

  2. 如需允许 IPv4 TCP、UDP 和 ICMP 流量到达后端实例组 ig-a,请执行以下操作:

    • 点击创建防火墙规则
    • 名称fw-allow-lb-access
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 匹配时执行的操作:允许
    • 目标:网络中的所有实例
    • 来源过滤条件:IPv4 范围
    • 来源 IPv4 范围10.1.2.0/24
    • 协议和端口:选择指定的协议和端口
      • 选择 TCP,然后输入 ALL
      • 选择 UDP
      • 选择其他,然后输入 ICMP
  3. 点击创建

  4. 如需允许传入 SSH 连接,请执行以下操作:

    • 点击创建防火墙规则
    • 名称fw-allow-ssh
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 匹配时执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件:IPv4 范围
    • 来源 IPv4 范围0.0.0.0/0
    • 协议和端口:选择指定的协议和端口,然后输入 tcp:22
  5. 点击创建

  6. 如需允许 IPv6 TCP、UDP 和 ICMP 流量到达后端实例组 ig-a,请执行以下操作:

    • 点击创建防火墙规则
    • 名称fw-allow-lb-access-ipv6
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 匹配时执行的操作:允许
    • 目标:网络中的所有实例
    • 来源过滤条件IPv6 范围
    • 来源 IPv6 范围:在 lb-subnet 中分配的 IPV6_ADDRESS
    • 协议和端口:选择指定的协议和端口
      • 选择 TCP,然后输入 0-65535
      • 选择 UDP
      • 选择其他,对于 ICMPv6 协议,输入 58
  7. 点击创建

  8. 如需允许 Google Cloud IPv6 健康检查,请执行以下操作:

    • 点击创建防火墙规则
    • 名称fw-allow-health-check-ipv6
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 匹配时执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-health-check-ipv6
    • 来源过滤条件IPv6 范围
    • 来源 IPv6 范围2600:2d00:1:b029::/64
    • 协议和端口:允许全部
  9. 点击创建

  10. 如需允许 Google Cloud IPv4 健康检查,请执行以下操作:

    • 点击创建防火墙规则
    • 名称fw-allow-health-check
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 匹配时执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-health-check
    • 来源过滤条件:IPv4 范围
    • 来源 IPv4 范围130.211.0.0/2235.191.0.0/16
    • 协议和端口:允许全部
  11. 点击创建

gcloud

  1. 如需允许 IPv4 TCP 流量到达后端实例组 ig-a,请创建以下规则:

    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 防火墙规则,以允许使用网络标记 allow-ssh 通过 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. 如需允许 IPv6 流量到达后端实例组 ig-a,请创建以下规则:

    gcloud compute firewall-rules create fw-allow-lb-access-ipv6 \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=IPV6_ADDRESS \
        --rules=all
    

    IPV6_ADDRESS 替换为在 lb-subnet 中分配的 IPv6 地址。

  4. 创建 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
    
  5. 创建 fw-allow-health-check-ipv6 规则以允许 Google Cloud IPv6 健康检查。

    gcloud compute firewall-rules create fw-allow-health-check-ipv6 \
       --network=lb-network \
       --action=allow \
       --direction=ingress \
       --target-tags=allow-health-check-ipv6 \
       --source-ranges=2600:2d00:1:b029::/64 \
       --rules=tcp,udp,icmp
    

API

  1. 如需创建 fw-allow-lb-access 防火墙规则,请向 firewalls.insert 方法发出 POST 请求。将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    {
    "name": "fw-allow-lb-access",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
    "priority": 1000,
    "sourceRanges": [
      "10.1.2.0/24"
    ],
    "allPorts": true,
    "allowed": [
      {
        "IPProtocol": "tcp"
      },
      {
        "IPProtocol": "udp"
      },
      {
        "IPProtocol": "icmp"
      }
    ],
    "direction": "INGRESS",
    "logConfig": {
      "enable": false
    },
    "disabled": false
    }
    
  2. firewalls.insert 方法发出 POST 请求,以创建 fw-allow-lb-access-ipv6 防火墙规则。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    {
     "name": "fw-allow-lb-access-ipv6",
     "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
     "priority": 1000,
     "sourceRanges": [
       "IPV6_ADDRESS"
     ],
     "allPorts": true,
     "allowed": [
       {
          "IPProtocol": "tcp"
        },
        {
          "IPProtocol": "udp"
        },
        {
          "IPProtocol": "58"
        }
     ],
     "direction": "INGRESS",
     "logConfig": {
        "enable": false
     },
     "disabled": false
    }
    

    IPV6_ADDRESS 替换为在 lb-subnet 中分配的 IPv6 地址。

  3. 如需创建 fw-allow-ssh 防火墙规则,请向 firewalls.insert 方法发出 POST 请求:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    {
    "name": "fw-allow-ssh",
         "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
    "priority": 1000,
    "sourceRanges": [
      "0.0.0.0/0"
    ],
    "targetTags": [
      "allow-ssh"
    ],
    "allowed": [
     {
       "IPProtocol": "tcp",
       "ports": [
         "22"
       ]
     }
    ],
    "direction": "INGRESS",
    "logConfig": {
     "enable": false
    },
    "disabled": false
    }
    
  4. 如需创建 fw-allow-health-check 防火墙规则,请向 firewalls.insert 方法发出 POST 请求:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    {
    "name": "fw-allow-health-check",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
    "priority": 1000,
    "sourceRanges": [
      "130.211.0.0/22",
      "35.191.0.0/16"
    ],
    "targetTags": [
      "allow-health-check"
    ],
    "allowed": [
      {
        "IPProtocol": "tcp"
      },
      {
        "IPProtocol": "udp"
      },
      {
        "IPProtocol": "icmp"
      }
    ],
    "direction": "INGRESS",
    "logConfig": {
      "enable": false
    },
    "disabled": false
    }
    
  5. firewalls.insert 方法发出 POST 请求,以创建 fw-allow-health-check-ipv6 防火墙规则。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    {
    "name": "fw-allow-health-check-ipv6",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
    "priority": 1000,
    "sourceRanges": [
      "2600:2d00:1:b029::/64"
    ],
    "targetTags": [
      "allow-health-check-ipv6"
    ],
    "allowed": [
      {
        "IPProtocol": "tcp"
      },
      {
        "IPProtocol": "udp"
      }
    ],
    "direction": "INGRESS",
    "logConfig": {
      "enable": false
    },
    "disabled": false
    }
    

创建后端虚拟机和实例组

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

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

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

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

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

创建实例组

控制台

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

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

    转到“实例模板”

    1. 点击创建实例模板
    2. 名称输入 vm-a1
    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. 网络标记字段中,添加 allow-sshallow-health-check-ipv6
      2. 对于网络接口,请点击默认接口并配置以下字段:
        • 网络lb-network
        • 子网lb-subnet
        • IP 栈类型IPv4 和 IPv6(双栈)
    7. 点击创建

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

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

    转到“实例模板”

    1. 点击创建实例模板
    2. 名称输入 vm-a1
    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. 网络标记字段中,添加 allow-sshallow-health-check
      2. 对于网络接口,请点击默认接口并配置以下字段:
        • 网络lb-network
        • 子网lb-subnet
        • IP 栈类型IPv4(单栈)
    7. 点击创建

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

    转到“实例组”

    1. 点击创建实例组
    2. 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG
    3. 对于名称,请输入 ig-a
    4. 对于位置,选择单个可用区
    5. 对于区域,请选择 us-west1
    6. 对于可用区,请选择 us-west1-a
    7. 对于实例模板,请选择 vm-a1
    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 vm-a1 \
        --region=us-west1 \
        --network=lb-network \
        --subnet=lb-subnet \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPv4_IPv6 \
        --tags=allow-ssh \
        --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 vm-a1 \
        --region=us-west1 \
        --network=lb-network \
        --subnet=lb-subnet \
        --tags=allow-ssh \
        --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-a \
        --zone us-west1-a \
        --size 2 \
        --template vm-a1
    

api

如需同时处理 IPv4 和 IPv6 流量,请执行以下步骤:

  1. instances.insert 方法发出 POST 请求来创建虚拟机:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
    "name": "vm-a1",
    "tags": {
     "items": [
       "allow-health-check-ipv6",
       "allow-ssh"
     ]
    },
    "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/e2-standard-2",
    "canIpForward": false,
    "networkInterfaces": [
     {
       "stackType": "IPV4_IPV6",
       "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
       "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
       "accessConfigs": [
         {
           "type": "ONE_TO_ONE_NAT",
           "name": "external-nat",
           "networkTier": "PREMIUM"
         }
       ]
     }
    ],
    "disks": [
     {
       "type": "PERSISTENT",
       "boot": true,
       "mode": "READ_WRITE",
       "autoDelete": true,
       "deviceName": "vm-a1",
       "initializeParams": {
         "sourceImage": "projects/debian-cloud/global/images/DEBIAN_IMAGE_NAME",
         "diskType": "projects/PROJECT_ID/zones/ZONE/diskTypes/pd-standard",
         "diskSizeGb": "10"
       }
     }
    ],
    "metadata": {
     "items": [
       {
         "key": "startup-script",
         "value": "#! /bin/bash\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nvm_hostname="$(curl -H "Metadata-Flavor:Google" \\\nhttp://metadata.google.internal/computeMetadata/v1/instance/name)"\necho "Page served from: $vm_hostname" | \\\ntee /var/www/html/index.html\nsed -ire "s/^Listen 80$/Listen 8080/g" /etc/\\napache2/ports.conf\nsystemctl restart apache2"
       }
     ]
    },
    "scheduling": {
     "preemptible": false
    },
    "deletionProtection": false
    }
    

如需处理 IPv4 流量,请按以下步骤操作。

  1. instances.insert 方法发出 POST 请求来创建虚拟机:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
    "name": "vm-a1",
    "tags": {
     "items": [
       "allow-health-check",
       "allow-ssh"
     ]
    },
    "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/e2-standard-2",
    "canIpForward": false,
    "networkInterfaces": [
     {
       "stackType": "IPV4",
       "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
       "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
       "accessConfigs": [
         {
           "type": "ONE_TO_ONE_NAT",
           "name": "external-nat",
           "networkTier": "PREMIUM"
         }
       ]
     }
    ],
    "disks": [
     {
       "type": "PERSISTENT",
       "boot": true,
       "mode": "READ_WRITE",
       "autoDelete": true,
       "deviceName": "vm-a1",
       "initializeParams": {
         "sourceImage": "projects/debian-cloud/global/images/DEBIAN_IMAGE_NAME",
         "diskType": "projects/PROJECT_ID/zones/ZONE/diskTypes/pd-standard",
         "diskSizeGb": "10"
       }
     }
    ],
    "metadata": {
     "items": [
       {
         "key": "startup-script",
         "value": "#! /bin/bash\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nvm_hostname="$(curl -H "Metadata-Flavor:Google" \\\nhttp://metadata.google.internal/computeMetadata/v1/instance/name)"\necho "Page served from: $vm_hostname" | \\\ntee /var/www/html/index.html\nsed -ire "s/^Listen 80$/Listen 8080/g" /etc/\\napache2/ports.conf\nsystemctl restart apache2"
       }
     ]
    },
    "scheduling": {
     "preemptible": false
    },
    "deletionProtection": false
    }
    
  2. instanceGroups.insert 方法发出 POST 请求来创建实例组。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups
    
    {
    "name": "ig-a",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
    "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet"
    }
    
  3. instanceGroups.addInstances 方法发出一个 POST 请求,为每个实例组添加实例。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a/addInstances
    
    {
    "instances": [
    {
     "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a1"
    }
    ]
    }
    

创建客户端虚拟机

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

对于 IPv4 和 IPv6 流量

控制台

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

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 vm-client-ipv6

  4. 可用区设置为 us-west1-a

  5. 点击管理、安全、磁盘、网络、单租户并进行以下更改:

    • 点击网络并将 allow-ssh 添加到网络标记
    • 网络接口下,点击修改,进行以下更改,然后点击完成
      • 网络lb-network
      • 子网lb-subnet
      • IP 栈类型IPv4 和 IPv6(双栈)
      • 主要内部 IP:临时(自动)
      • 外部 IP:临时
  6. 点击创建

gcloud

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

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

api

instances.insert 方法发出 POST 请求。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances

{
 "name": "vm-client-ipv6",
 "tags": {
   "items": [
     "allow-ssh"
   ]
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/machineTypes/e2-standard-2",
 "canIpForward": false,
 "networkInterfaces": [
   {
     "stackType": "IPV4_IPV6",
     "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
     "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
     "accessConfigs": [
       {
         "type": "ONE_TO_ONE_NAT",
         "name": "external-nat",
         "networkTier": "PREMIUM"
       }
     ]
   }
 ],
 "disks": [
   {
     "type": "PERSISTENT",
     "boot": true,
     "mode": "READ_WRITE",
     "autoDelete": true,
     "deviceName": "vm-client",
     "initializeParams": {
       "sourceImage": "projects/debian-cloud/global/images/debian-image-name",
       "diskType": "projects/PROJECT_ID/zones/us-west1-a/diskTypes/pd-standard",
       "diskSizeGb": "10"
     }
   }
 ],
 "scheduling": {
   "preemptible": false
 },
 "deletionProtection": false
}

对于 IPv4 流量

控制台

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

    转到虚拟机实例

  2. 点击创建实例

  3. 对于名称,输入 vm-client

  4. 可用区字段中,输入 us-west1-a

  5. 点击高级选项

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

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

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

API

instances.insert 方法发出 POST 请求。 将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

 POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances
 {
    "name": "vm-client",
    "tags": {
      "items": [
        "allow-ssh"
      ]
  },
    "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/machineTypes/e2-standard-2",
    "canIpForward": false,
    "networkInterfaces": [
      {
        "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
        "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
        "accessConfigs": [
          {
            "type": "ONE_TO_ONE_NAT",
            "name": "external-nat",
            "networkTier": "PREMIUM"
          }
        ]
      }
    ],
    "disks": [
      {
        "type": "PERSISTENT",
        "boot": true,
        "mode": "READ_WRITE",
        "autoDelete": true,
        "deviceName": "vm-client",
        "initializeParams": {
          "sourceImage": "projects/debian-cloud/global/images/debian-image-name",
          "diskType": "projects/PROJECT_ID/zones/us-west1-a/diskTypes/pd-standard",
          "diskSizeGb": "10"
        }
      }
    ],
    "scheduling": {
      "preemptible": false
     },
    "deletionProtection": false
  }
  

配置负载均衡器组件

为多个协议创建负载均衡器。

gcloud

  1. 为端口 80 创建 HTTP 健康检查。此健康检查用于验证 ig-a 实例组中的后端的健康状况。

    gcloud compute health-checks create http hc-http-80 \
        --region=us-west1 \
        --port=80
    
  2. 创建后端服务,并将协议设置为 UNSPECIFIED

    gcloud compute backend-services create be-ilb-l3-default \
        --load-balancing-scheme=internal \
        --protocol=UNSPECIFIED \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  3. 将实例组添加到后端服务:

    gcloud compute backend-services add-backend be-ilb-l3-default \
        --region=us-west1 \
        --instance-group=ig-a \
        --instance-group-zone=us-west1-a
    
  4. 对于 IPv6 流量:创建协议设置为 L3_DEFAULT 的转发规则,以处理所有受支持的 IPv6 协议流量。所有端口都必须配置有 L3_DEFAULT 转发规则。

    gcloud compute forwarding-rules create fr-ilb-ipv6 \
       --region=us-west1 \
       --load-balancing-scheme=internal \
       --subnet=lb-subnet \
       --ip-protocol=L3_DEFAULT \
       --ports=ALL \
       --backend-service=be-ilb-l3-default \
       --backend-service-region=us-west1 \
       --ip-version=IPV6
    
  5. 对于 IPv4 流量:创建协议设置为 L3_DEFAULT 的转发规则,以处理所有受支持的 IPv4 协议流量。所有端口都必须配置有 L3_DEFAULT 转发规则。使用 10.1.2.99 作为内部 IP 地址。

    gcloud compute forwarding-rules create fr-ilb-l3-default \
       --region=us-west1 \
       --load-balancing-scheme=internal \
       --network=lb-network \
       --subnet=lb-subnet \
       --address=10.1.2.99 \
       --ip-protocol=L3_DEFAULT \
       --ports=ALL \
       --backend-service=be-ilb-l3-default \
       --backend-service-region=us-west1
    

API

  1. regionHealthChecks.insert 方法发出 POST 请求,以创建健康检查。将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/regionHealthChecks
    
    {
    "name": "hc-http-80",
    "type": "HTTP",
    "httpHealthCheck": {
     "port": 80
    }
    }
    
  2. regionBackendServices.insert 方法发出 POST 请求,以创建区域后端服务。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices
    
    {
    "name": "be-ilb-l3-default",
    "backends": [
     {
       "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a",
       "balancingMode": "CONNECTION"
     }
    ],
    "healthChecks": [
     "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/healthChecks/hc-http-80"
    ],
    "loadBalancingScheme": "INTERNAL",
    "protocol": "UNSPECIFIED",
    "connectionDraining": {
     "drainingTimeoutSec": 0
    }
    }
    
  3. 对于 IPv6 流量:通过向 forwardingRules.insert 方法发出 POST 请求来创建转发规则。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules
    
    {
    "name": "fr-ilb-ipv6",
    "IPProtocol": "L3_DEFAULT",
    "allPorts": true,
    "loadBalancingScheme": "INTERNAL",
    "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
    "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb-l3-default",
    "ipVersion": "IPV6",
    "networkTier": "PREMIUM"
    }
    
  4. 对于 IPv4 流量:通过向 forwardingRules.insert 方法发出 POST 请求来创建转发规则:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules
    
    {
    "name": "fr-ilb-l3-default",
    "IPAddress": "10.1.2.99",
    "IPProtocol": "L3_DEFAULT",
    "allPorts": true,
    "loadBalancingScheme": "INTERNAL",
    "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
    "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb-l3-default",
    "networkTier": "PREMIUM"
    }
    

测试负载均衡器

以下测试展示了如何验证负载均衡器配置并了解其预期行为。

测试来自客户端虚拟机的连接

此测试通过单独的客户端虚拟机连接负载均衡器;也就是说,并非使用负载均衡器的后端虚拟机。

gcloud:IPv6

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

    gcloud compute ssh vm-client-ipv6 --zone=us-west1-a
    
  2. 描述 IPv6 转发规则 fr-ilb-ipv6。请注意说明中的 IPV6_ADDRESS

    gcloud compute forwarding-rules describe fr-ilb-ipv6 --region=us-west1
    
  3. 从具有 IPv6 连接的客户端,运行以下命令。将 IPV6_ADDRESS 替换为 fr-ilb-ipv6 转发规则中的临时 IPv6 地址。

    curl -m 10 -s http://IPV6_ADDRESS:80
    

    比方说,如果分配的 IPv6 地址为 [fd20:1db0:b882:802:0:46:0:0/96]:80,则该命令应如下所示:

    curl -m 10 -s http://[fd20:1db0:b882:802:0:46:0:0]:80
    

gcloud:IPv4

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

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. 描述 IPv4 转发规则 fr-ilb

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

    curl http://10.1.2.99
    

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

    curl http://10.1.2.99:80
    

对负载均衡器的 IP 地址执行 ping 操作

此测试演示了预期的行为:您可以对负载均衡器的 IP 地址执行 ping 操作。

gcloud:IPv6

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

    gcloud compute ssh vm-client-ipv6 --zone=us-west1-a
    
  2. 尝试对负载均衡器的 IPv6 地址执行 ping 操作。将 IPV6_ADDRESS 替换为 fr-ilb-ipv6 转发规则中的临时 IPv6 地址。

    请注意,您会收到响应,并且 ping 命令在此示例中有效。

    ping6 IPV6_ADDRESS
    

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

    ping6 2001:db8:1:1:1:1:1:1
    

    输出类似于以下内容:

    @vm-client: ping IPV6_ADDRESS
    PING IPV6_ADDRESS (IPV6_ADDRESS) 56(84) bytes of data.
    64 bytes from IPV6_ADDRESS: icmp_seq=1 ttl=64 time=1.58 ms
    

gcloud:IPv4

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

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. 尝试对负载均衡器的 IPv4 地址执行 ping 操作。请注意,您会收到响应,并且 ping 命令在此示例中有效。

    ping 10.1.2.99
    

    输出如下所示:

    @vm-client: ping 10.1.2.99
    PING 10.1.2.99 (10.1.2.99) 56(84) bytes of data.
    64 bytes from 10.1.2.99: icmp_seq=1 ttl=64 time=1.58 ms
    64 bytes from 10.1.2.99: icmp_seq=2 ttl=64 time=0.242 ms
    64 bytes from 10.1.2.99: icmp_seq=3 ttl=64 time=0.295 ms
    

其他配置选项

本部分对配置示例进行了扩展,以提供一些额外的替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。

您可以为示例预留静态内部 IP 地址。此配置允许多个内部转发规则将同一 IP 地址用于不同的协议和不同的端口。示例负载均衡器的后端仍必须位于区域 us-west1 中。

下图展示了此示例的架构。

基于协议对流量进行负载均衡,并使用后端服务管理单个可用区级实例组的连接分布。
适用于使用静态内部 IP 地址的多个协议的内部直通网络负载均衡器(点击可放大)。

您还可以考虑使用以下转发规则配置:

  • 使用多个端口的转发规则:

    • 协议为 TCP,端口为 80,8080
    • 协议为 L3_DEFAULT,端口为 ALL
  • 使用所有端口的转发规则:

    • 协议为 TCP,端口为 ALL
    • 协议为 L3_DEFAULT,端口为 ALL

预留静态内部 IPv4 地址

10.1.2.99 预留静态内部 IP 地址,并将其 --purpose 标志设置为 SHARED_LOADBALANCER_VIP。必须使用 --purpose 标志,以便多条转发规则可以使用同一内部 IP 地址。

gcloud

使用 gcloud compute addresses create 命令:

gcloud compute addresses create internal-lb-ipv4 \
    --region us-west1 \
    --subnet lb-subnet \
    --purpose SHARED_LOADBALANCER_VIP \
    --addresses 10.1.2.99

API

调用 addresses.insert 方法。 将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/addresses

请求正文必须包含 addressType(应为 INTERNAL)、地址的 name 以及 IP 地址所属的 subnetwork。您必须将 address 指定为 10.1.2.99

{
  "addressType": "INTERNAL",
  "name": "internal-lb-ipv4",
  "subnetwork": "regions/us-west1/subnetworks/lb-subnet",
  "purpose": "SHARED_LOADBALANCER_VIP",
  "address": "10.1.2.99"
}

配置负载均衡器组件

使用以下组件配置三个负载均衡器:

  • 第一个负载均衡器具有使用协议 TCP 和端口 80 的转发规则。到达端口 80 上的内部 IP 地址的 TCP 流量由 TCP 转发规则处理。
  • 第二个负载均衡器的转发规则具有协议 UDP 和端口 53。到达端口 53 上的内部 IP 地址的 UDP 流量由 UDP 转发规则处理。
  • 第三个负载均衡器具有协议为 L3_DEFAULT 和端口 ALL 的转发规则。与 TCPUDP 转发规则不匹配的所有其他流量都由 L3_DEFAULT 转发规则处理。
  • 所有三个负载均衡器的转发规则都共享相同的静态内部 IP 地址 (internal-lb-ipv4)。

创建第一个负载均衡器

为端口 80 上的 TCP 流量创建第一个负载均衡器。

gcloud

  1. 为 TCP 流量创建后端服务:

    gcloud compute backend-services create be-ilb \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  2. 将实例组添加到后端服务:

    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-a \
        --instance-group-zone=us-west1-a
    
  3. 为后端服务创建转发规则。使用预留的静态内部 IP 地址 (internal-lb-ipv4) 作为内部 IP 地址。

    gcloud compute forwarding-rules create fr-ilb \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=internal-lb-ipv4 \
        --ip-protocol=TCP \
        --ports=80 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    

API

  1. regionBackendServices.insert 方法发出 POST 请求,以创建区域后端服务。将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices
    {
    "name": "be-ilb",
    "backends": [
     {
       "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a",
       "balancingMode": "CONNECTION"
     }
    ],
    "healthChecks": [
     "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/healthChecks/hc-http-80"
    ],
    "loadBalancingScheme": "INTERNAL",
    "protocol": "TCP",
    "connectionDraining": {
     "drainingTimeoutSec": 0
    }
    }
    

  2. Create the forwarding rule by making a POST request to the forwardingRules.insert method:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules
    
    {
    "name": "fr-ilb",
    "IPAddress": "internal-lb-ipv4",
    "IPProtocol": "TCP",
    "ports": [
     "80"
    ],
    "loadBalancingScheme": "INTERNAL",
    "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
    "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb",
    "networkTier": "PREMIUM"
    }
    

创建第二个负载均衡器

为端口 53 上的 UDP 流量创建第二个负载均衡器。

gcloud

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

    gcloud compute backend-services create be-ilb-udp \
        --load-balancing-scheme=internal \
        --protocol=UDP \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  2. 将实例组添加到后端服务:

    gcloud compute backend-services add-backend be-ilb-udp \
        --region=us-west1 \
        --instance-group=ig-a \
        --instance-group-zone=us-west1-a
    
  3. 为后端服务创建转发规则。使用预留的静态内部 IP 地址 (internal-lb-ipv4) 作为内部 IP 地址。

    gcloud compute forwarding-rules create fr-ilb-udp \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=internal-lb-ipv4 \
        --ip-protocol=UDP \
        --ports=53 \
        --backend-service=be-ilb-udp \
        --backend-service-region=us-west1
    

API

  1. regionBackendServices.insert 方法发出 POST 请求,以创建区域后端服务。将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices
    {
    "name": "be-ilb-udp",
    "backends": [
     {
      "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a",
      "balancingMode": "CONNECTION"
     }
    ],
    "healthChecks": [
     "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/healthChecks/hc-http-80"
    ],
    "loadBalancingScheme": "INTERNAL",
    "protocol": "UDP",
    "connectionDraining": {
     "drainingTimeoutSec": 0
    }
    }
    
  2. forwardingRules.insert 方法发出 POST 请求,以创建转发规则。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules
    
    {
    "name": "fr-ilb-udp",
    "IPAddress": "internal-lb-ipv4",
    "IPProtocol": "UDP",
    "ports": [
     "53"
    ],
    "loadBalancingScheme": "INTERNAL",
    "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
    "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb-udp",
    "networkTier": "PREMIUM"
    }
    

创建第三个负载均衡器

创建第三个负载均衡器的转发规则以使用静态预留内部 IP 地址。

gcloud

创建协议设置为 L3_DEFAULT 的转发规则,以处理所有其他受支持的 IPv4 协议流量。使用预留的静态内部 IP 地址 (internal-lb-ipv4) 作为内部 IP 地址。

gcloud compute forwarding-rules create fr-ilb-l3-default \
    --region=us-west1 \
    --load-balancing-scheme=internal \
    --network=lb-network \
    --subnet=lb-subnet \
    --address=internal-lb-ipv4 \
    --ip-protocol=L3_DEFAULT \
    --ports=ALL \
    --backend-service=be-ilb-l3-default \
    --backend-service-region=us-west1

API

forwardingRules.insert 方法发出 POST 请求,以创建转发规则。将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules

{
"name": "fr-ilb-l3-default",
"IPAddress": "internal-lb-ipv4",
"IPProtocol": "L3_DEFAULT",
"ports": [
  "ALL"
],
"loadBalancingScheme": "INTERNAL",
"subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
"network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
"backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb-l3-default",
"networkTier": "PREMIUM"
}

测试负载均衡器

如需测试您的负载均衡器,请按照上一部分中的步骤操作

后续步骤