设置内部 TCP/UDP 负载平衡

本指南通过一个示例介绍了 Google Cloud 内部 TCP/UDP 负载平衡的基础知识。在按照本指南中的说明进行操作之前,请先熟悉以下内容:

权限

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

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

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

设置

本指南介绍如何配置和测试内部 TCP/UDP 负载平衡器。此部分中的步骤介绍了如何配置以下内容:

  1. 带有自定义子网的示例 VPC 网络
  2. 允许后端虚拟机的传入连接的防火墙规则
  3. 四个后端虚拟机:
    • 区域 us-west1-a 中非代管实例组中的两个虚拟机
    • 区域 us-west1-c 中非代管实例组中的两个虚拟机
  4. 一个用于测试连接的客户端虚拟机
  5. 以下内部 TCP/UDP 负载平衡器组件:
    • 后端服务运行状况检查
    • us-west1 地区中的内部后端服务,用于管理两个区域实例组的连接分布
    • 负载平衡器前端的内部转发规则和内部 IP 地址

此示例的架构如下所示:

内部 TCP/UDP 负载平衡示例配置(点击放大)
内部 TCP/UDP 负载平衡示例配置(点击放大)

配置网络、地区和子网

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

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

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

为了演示全球访问权限,此示例会在其他地区和子网中再创建一个测试客户端虚拟机:

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

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

控制台

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

gcloud

  1. 创建自定义 VPC 网络:

    gcloud compute networks create lb-network --subnet-mode=custom
    
    1. lb-network 网络中,为 us-west1 地区中的后端创建子网,并创建另一个子网以测试 europe-west1 地区中的全球访问权限:
    gcloud compute networks subnets create lb-subnet \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    
    gcloud compute networks subnets create europe-subnet \
        --network=lb-network \
        --range=10.3.4.0/24 \
        --region=europe-west1
    

API

networks.insert 方法发出 POST 请求。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks

{
  "routingConfig": {
    "routingMode": "REGIONAL"
  },
  "name": "lb-network",
  "autoCreateSubnetworks": false
}

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
}

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/europe-west1/subnetworks

{
  "name": "europe-subnet",
  "network": "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/lb-network",
   "ipCidrRange": "10.3.4.0/24",
   "privateIpGoogleAccess": false
}

配置防火墙规则

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

  • fw-allow-lb-access:入站流量规则,它适用于 VPC 网络中的所有目标,允许来自 10.1.2.0/2410.3.4.0/24 范围内来源的流量。此规则允许来自位于两个子网中任一子网的任何客户端的传入流量。稍后,您可以配置和测试全球访问权限

  • 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 来标识应该应用这项规则的实例。

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

控制台

  1. 转到 Google Cloud Console 中的“防火墙”页面。
    转到“防火墙”页面
  2. 点击创建防火墙规则并输入以下信息,以创建允许子网流量的规则:
    • 名称fw-allow-lb-access
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:网络中的所有实例
    • 来源过滤条件IP ranges
    • 来源 IP 地址范围10.1.2.0/2410.3.4.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,10.3.4.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
    

API

firewalls.insert 方法发出 POST 请求,以创建 fw-allow-lb-access 防火墙规则。

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", "10.3.4.0/24"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp"
    },
    {
      "IPProtocol": "udp"
    },
    {
      "IPProtocol": "icmp"
    }
  ],
  "direction": "INGRESS",
  "logConfig": {
    "enable": false
  },
  "disabled": false
}

firewalls.insert 方法发出 POST 请求,以创建 fw-allow-ssh 防火墙规则。

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
}

firewalls.insert 方法发出 POST 请求,以创建 fw-allow-health-check 防火墙规则。

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
}

创建后端虚拟机和实例组

此示例使用了两个非代管实例组,每个实例组都有两个后端(服务器)虚拟机。为了演示内部 TCP/UDP 负载平衡的地区特性,我们将这两个实例组分别置于 us-west1-aus-west1-c 区域。

  • 实例组 ig-a 包含以下两个虚拟机:
    • vm-a1
    • vm-a2
  • 实例组 ig-c 包含以下两个虚拟机:
    • vm-c1
    • vm-c2

传入所有四个后端虚拟机的流量都经过负载平衡。

为了支持此示例和其他配置选项,四个虚拟机都运行一个 Apache Web 服务器,该服务器侦听以下 TCP 端口:80、8008、8080、8088、443 和 8443。

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

后端虚拟机的外部 IP 地址不是必需的;但由于它们允许后端虚拟机从互联网下载 Apache,并且便于您通过 SSH 进行连接,因此对此示例很有用。

默认情况下,Apache 配置为绑定到任何 IP 地址。内部 TCP/UDP 负载平衡器通过保留目标 IP 地址来传送数据包。确保在后端虚拟机上运行的服务器软件侦听的是负载平衡器内部转发规则的 IP 地址。如果您配置了多条内部转发规则,请确保您的软件会监听与每条规则关联的内部 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. 点击创建

创建实例组

  1. 转到 Google Cloud Console 中的“实例组”页面。
    转到“实例组”页面
  2. 使用以下组合重复执行下述步骤,以创建两个非代管实例组,每个组包含两个虚拟机。
    • 实例组:ig-a,区域:us-west1-a,虚拟机:vm-a1vm-a2
    • 实例组:ig-c,区域:us-west1-c,虚拟机:vm-c1vm-c2
  3. 点击创建实例组
  4. 点击新建非代管式实例组
  5. 按照第 2 步中的说明设置名称
  6. 位置部分,为地区选择 us-west1,然后按照第 2 步中的说明选择一个区域
  7. 对于网络,请输入 lb-network
  8. 对于子网,请输入 lb-subnet
  9. 虚拟机实例部分中,添加第 2 步中说明的虚拟机。
  10. 点击创建

gcloud

  1. 使用 [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'
    
  2. 在每个区域中创建两个非代管实例组:

    gcloud compute instance-groups unmanaged create ig-a \
        --zone=us-west1-a
    gcloud compute instance-groups unmanaged create ig-c \
        --zone=us-west1-c
    
  3. 将虚拟机添加到相应的实例组中:

    gcloud compute instance-groups unmanaged add-instances ig-a \
        --zone=us-west1-a \
        --instances=vm-a1,vm-a2
    gcloud compute instance-groups unmanaged add-instances ig-c \
        --zone=us-west1-c \
        --instances=vm-c1,vm-c2
    

API

对于 4 个虚拟机,请使用以下虚拟机名称和区域:

  • [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 命令来获取当前 DEBIAN_IMAGE_NAME

gcloud compute images list \
 --filter="family=debian-10"

instances.insert 方法发出四个 POST 请求,以创建四个后端虚拟机:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/[ZONE]/instances

{
  "name": "[VM-NAME]",
  "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": [
    {
      "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-NAME]",
      "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\nfile_ports=\"/etc/apache2/ports.conf\"\nfile_http_site=\"/etc/apache2/sites-available/000-default.conf\"\nfile_https_site=\"/etc/apache2/sites-available/default-ssl.conf\"\nhttp_listen_prts=\"Listen 80\\nListen 8008\\nListen 8080\\nListen 8088\"\nhttp_vh_prts=\"*:80 *:8008 *:8080 *:8088\"\nhttps_listen_prts=\"Listen 443\\nListen 8443\"\nhttps_vh_prts=\"*:443 *:8443\"\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\necho \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nprt_conf=\"$(cat \"$file_ports\")\"\nprt_conf_2=\"$(echo \"$prt_conf\" | sed \"s|Listen 80|${http_listen_prts}|\")\"\nprt_conf=\"$(echo \"$prt_conf_2\" | sed \"s|Listen 443|${https_listen_prts}|\")\"\necho \"$prt_conf\" | tee \"$file_ports\"\nhttp_site_conf=\"$(cat \"$file_http_site\")\"\nhttp_site_conf_2=\"$(echo \"$http_site_conf\" | sed \"s|*:80|${http_vh_prts}|\")\"\necho \"$http_site_conf_2\" | tee \"$file_http_site\"\nhttps_site_conf=\"$(cat \"$file_https_site\")\"\nhttps_site_conf_2=\"$(echo \"$https_site_conf\" | sed \"s|_default_:443|${https_vh_prts}|\")\"\necho \"$https_site_conf_2\" | tee \"$file_https_site\"\nsystemctl restart apache2"
      }
    ]
  },
  "scheduling": {
    "preemptible": false
  },
  "deletionProtection": false
}

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"
}

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups

{
  "name": "ig-c",
  "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"
}

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",
      "instance": "https://www.googleapis.com/compute/v1/projects/project-id/zones/us-west1-a/instances/vm-a2"
    }
  ]
}

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups/ig-c/addInstances

{
  "instances": [
    {
      "instance": "https://www.googleapis.com/compute/v1/projects/project-id/zones/us-west1-c/instances/vm-c1",
      "instance": "https://www.googleapis.com/compute/v1/projects/project-id/zones/us-west1-c/instances/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

API

instances.insert 方法发出 POST 请求。

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
}

配置负载平衡器组件

以下步骤会配置所有内部 TCP/UDP 负载平衡器组件,从运行状况检查和后端服务到前端组件:

  • 运行状况检查:在此示例中,我们使用仅检查 HTTP 200 (OK) 响应的 HTTP 运行状况检查。如需了解详情,请参阅内部 TCP/UDP 负载平衡概览中的“运行状况检查”部分

  • 后端服务:由于我们需要通过内部负载平衡器传递 HTTP 流量,因此需要使用 TCP,而不是 UDP。

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

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

控制台

创建负载平衡器并配置后端服务

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 点击创建负载平衡器
  3. TCP 负载平衡下,点击开始配置
  4. 面向互联网或仅限内部下选择仅在我的虚拟机之间
  5. 点击继续
  6. 名称设置为 be-ilb
  7. 点击后端配置 并进行以下更改:
    1. 地区us-west1
    2. 网络lb-network
    3. 后端下的新建内容部分,选择 ig-a 实例组,然后点击完成
    4. 点击添加后端。在显示的新建内容部分,选择 ig-c 实例组,然后再次点击完成
    5. 运行状况检查中,选择另创建一项运行状况检查,输入以下信息,然后点击保存并继续
      • 名称hc-http-80
      • 协议HTTP
      • 端口80
      • 代理协议NONE
      • 请求路径/ 请注意,当您使用 Cloud Console 创建负载平衡器时,运行状况检查是全球性的。如果要创建地区性运行状况检查,请使用 gcloud 或 API。
    6. 请先确认后端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  8. 点击前端配置。在新建前端 IP 和端口部分,进行以下更改:
    1. 名称fr-ilb
    2. 子网lb-subnet
    3. 内部 IP 中,选择保留静态内部 IP 地址,输入以下信息,然后点击保留
      • 名称ip-ilb
      • 静态 IP 地址:让我选择
      • 自定义 IP 地址10.1.2.99
    4. 端口:选择多个,然后输入 80,8008,8080,8088 作为端口号
    5. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  9. 点击检查并最终确认。仔细检查您的设置。
  10. 点击创建

gcloud

  1. 创建一个新的地区性 HTTP 运行状况检查,以测试端口 80 上的虚拟机的 HTTP 连接。

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

    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
    
  3. 将两个实例组添加到后端服务:

    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-a \
        --instance-group-zone=us-west1-a
    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-c \
        --instance-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=be-ilb \
        --backend-service-region=us-west1
    

API

regionHealthChecks.insert 方法发出 POST 请求,以创建运行状况检查。

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

{
  "name": "hc-http-80",
  "type": "HTTP",
  "httpHealthCheck": {
    "port": 80
  }
}

regionBackendServices.insert 方法发出 POST 请求,以创建地区后端服务。

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"
    },
    {
      "group": "https://www.googleapis.com/compute/v1/projects/project-id/zones/us-west1-c/instanceGroups/ig-c",
      "balancingMode": "CONNECTION"
    }
  ],
  "healthChecks": [
    "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-west1/healthChecks/hc-http-80"
  ],
  "loadBalancingScheme": "INTERNAL",
  "connectionDraining": {
    "drainingTimeoutSec": 0
   }
}

forwardingRules.insert 方法发出 POST 请求,以创建转发规则。

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

{
  "name": "fr-ilb",
  "IPAddress": "10.1.2.99",
  "IPProtocol": "TCP",
  "ports": [
    "80", "8008", "8080", "8088"
  ],
  "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"
}

测试

这部分中的测试展示了如何验证负载平衡器配置并了解其预期行为。

测试负载平衡

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

  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
    
    • 如果您为内部转发规则添加了服务标签,则可以使用内部 DNS 通过相应服务名称连接负载平衡器。

      curl http://web-test.fr-ilb.il4.us-west1.lb.project-id.internal
      

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

此测试演示了预期的行为:您无法对负载平衡器的 IP 地址执行 ping 操作。这是因为内部 TCP/UDP 负载平衡器采用虚拟网络编程实现,并不属于独立设备。

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

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

    timeout 10 ping 10.1.2.99
    

从负载平衡虚拟机发送请求

此测试表明,从任何后端虚拟机(经过负载平衡的服务器虚拟机)发送到负载平衡器的请求始终由发出该请求的虚拟机应答。

内部 TCP/UDP 负载平衡是通过虚拟网络编程和访客操作系统中的虚拟机配置实现的。在 Linux 虚拟机上,Linux 访客环境通过在访客操作系统路由表中安装路由来执行本地配置。由于存在此本地路由,传入负载平衡器的 IP 地址的流量会保留在负载平衡虚拟机上。(此本地路由与 VPC 网络中的路由不同。)

  1. 连接到后端虚拟机,例如 vm-a1

    gcloud compute ssh vm-a1 --zone=us-west1-a
    
  2. 使用 curl 向负载平衡器发出 Web 请求(通过 IP 地址或服务名称)。重复该请求,并注意响应是从发出请求的后端虚拟机发送的。从 vm-a1 进行测试时的预期响应始终为 Page served from: vm-a1

    curl http://10.1.2.99
    
  3. 检查本地路由表,查找与负载平衡器本身的 IP 地址 10.1.2.99 匹配的目标。此路由是内部 TCP/UDP 负载平衡的必要部分,但也说明了由负载平衡器的后端虚拟机发出的请求始终由同一虚拟机响应的原因。

    ip route show table local | grep 10.1.2.99
    

其他配置选项

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

启用全球访问权限

您可以为示例内部 TCP/UDP 负载平衡器启用全球访问权限,以使其可供所有地区的客户端访问。示例负载平衡器的后端仍必须位于一个地区 (us-west1) 中。

具有全球访问权限的内部 TCP/UDP 负载平衡(点击可放大)
具有全球访问权限的内部 TCP/UDP 负载平衡(点击可放大)

如需配置全球访问权限,请更改以下配置。

控制台

修改负载平衡器的转发规则

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 名称列中,点击您的内部 TCP/UDP 负载平衡器。示例负载平衡器名为 be-ilb

  3. 点击前端配置

  4. 点击修改

  5. 全球访问权限下,选择启用

  6. 点击完成

  7. 点击更新

负载平衡器详情页面上,验证前端配置是否显示具有全球访问权限的地区 (REGION)

gcloud

  1. 更新示例负载平衡器的转发规则 fr-ilb 以添加 --allow-global-access 标志。

    gcloud compute forwarding-rules update fr-ilb \
       --region=us-west1 \
       --allow-global-access
    
  2. 请确保该转发规则允许全球访问。

    gcloud compute forwarding-rules describe fr-ilb \
       --region=us-west1 \
       --format="get(name,region,allowGlobalAccess)"
    

    启用全球访问权限后,在输出中转发规则的名称和地区之后会出现 True 一词。

API

forwardingRules/patch 方法发出 PATCH 请求。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr-ilb

{
  "allowGlobalAccess": true
}

创建虚拟机客户端以测试全球访问权限

控制台

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

gcloud

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

gcloud compute instances create vm-client2 \
    --zone=europe-west1-b \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=europe-subnet

API

instances.insert 方法发出 POST 请求。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/europe-west1-b/instances

{
  "name": "vm-client2",
  "tags": {
    "items": [
      "allow-ssh"
    ]
  },
  "machineType": "https://www.googleapis.com/compute/v1/projects/project-id/zones/europe-west1-b/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/europe-west1/subnetworks/europe-subnet",
      "accessConfigs": [
        {
          "type": "ONE_TO_ONE_NAT",
          "name": "external-nat",
          "networkTier": "PREMIUM"
        }
      ]
    }
  ],
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "mode": "READ_WRITE",
      "autoDelete": true,
      "deviceName": "vm-client2",
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/debian-image-name",
        "diskType": "projects/project-id/zones/europe-west1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "scheduling": {
    "preemptible": false
  },
  "deletionProtection": false
}

连接到虚拟机客户端并测试连接

gcloud compute ssh vm-client2 --zone=europe-west1-b

您可以在所有已配置的端口上测试到负载平衡器的连接,方法与从 us-west1 地区中的 vm-client 进行连接时相同。在转发规则中配置的四个端口上测试 HTTP 连接:

curl http://10.1.2.99
curl http://10.1.2.99:8008
curl http://10.1.2.99:8080
curl http://10.1.2.99:8088

配置代管实例组

示例配置创建了两个非代管实例组。您也可以将代管实例组(包括区域和地区代管实例组)用作内部 TCP/UDP 负载平衡的后端。

代管实例组要求您创建实例模板。此过程演示了如何使用单个地区代管实例组替换示例中的两个非代管区域实例组。地区代管实例组会自动在地区内的多个区域中创建虚拟机,以便更轻松地在区域之间分布生产流量。

代管实例组还支持自动扩缩自动修复。如果您将自动扩缩和内部 TCP/UDP 负载平衡结合使用,则无法根据负载平衡进行扩缩。

此过程展示了如何修改示例内部 TCP/UDP 负载平衡器的后端服务,使其使用地区代管实例组。

控制台

实例模板

  1. 转到 Google Cloud Console 中的“虚拟机实例模板”页面。
    转到“虚拟机实例模板”页面
  2. 点击创建实例模板
  3. 名称设置为 template-vm-ilb
  4. 选择机器类型
  5. 对于启动磁盘,请点击更改,选择 Debian 操作系统和 10 (buster) 版本。
  6. 点击保存以确认此启动磁盘的选项。
  7. 点击管理、安全、磁盘、网络、单独租用

    • 点击网络并进行以下更改:
      • 网络lb-network
      • 子网lb-subnet
      • 网络标记allow-sshallow-health-check
    • 点击管理。在启动脚本字段中,复制并粘贴以下脚本内容:
    #! /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. 点击创建

代管实例组

  1. 转到 Google Cloud Console 中的“虚拟机实例组”页面。
    转到“虚拟机实例组”页面
  2. 点击创建实例组
  3. 名称设置为 ig-ilb
  4. 对于位置,选择多区域,并将地区设置为 us-west1
  5. 实例模板设置为 template-vm-ilb
  6. (可选)配置自动扩缩。您无法根据 HTTP 负载平衡使用情况来自动扩缩实例组,因为实例组是内部 TCP/UDP 负载平衡的后端。
  7. 实例数下限设置为 1,将实例数上限设置为 6
  8. (可选)配置自动修复。如果您配置了自动修复功能,请对内部 TCP/UDP 负载平衡器使用与后端服务相同的运行状况检查。在此示例中,请使用 hc-http-80
  9. 点击创建

gcloud

  1. 创建实例模板。您也可以为要使用的映像模版设置其他参数,如机器类型

    gcloud compute instance-templates create template-vm-ilb \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check \
        --subnet=lb-subnet \
        --region=us-west1 \
        --network=lb-network \
           --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'
    
  2. 使用模板创建一个地区代管实例组:

    gcloud compute instance-groups managed create ig-ilb \
        --template=template-vm-ilb \
        --region=us-west1 \
        --size=6
    
  3. 将地区代管实例组作为后端添加到您已创建的后端服务

    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-ilb \
        --instance-group-region=us-west1
    
  4. 断开两个非代管(区域)实例组与后端服务的连接:

    gcloud compute backend-services remove-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-a \
        --instance-group-zone=us-west1-a
    gcloud compute backend-services remove-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-c \
        --instance-group-zone=us-west1-c
    

从后端虚拟机中移除外部 IP 地址

当您创建后端虚拟机时,系统会为每个虚拟机分配一个临时外部 IP 地址,以便其通过启动脚本下载 Apache。由于后端虚拟机仅供内部负载平衡器使用,因此您可以移除其外部 IP 地址。移除外部 IP 地址可防止后端虚拟机直接访问互联网。

控制台

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 对每个后端虚拟机重复执行以下步骤。
  3. 点击后端虚拟机的名称(例如 vm-a1),以查看“虚拟机实例详情”页面
  4. 点击修改
  5. “网络接口”部分,点击修改按钮。
  6. 外部 IP 弹出式窗口中选择,然后点击完成
  7. 点击保存

gcloud

  1. 如需查询实例的区域(例如,如果您使用的是地区代管实例组),请为每个实例运行以下命令以确定其所在区域。将 [SERVER-VM] 替换为要查询的虚拟机的名称。

    gcloud compute instances list --filter="name=[SERVER-VM]"
    
  2. 对每个后端虚拟机重复执行以下步骤。将 [SERVER-VM] 替换为虚拟机的名称,并将 [ZONE] 替换为虚拟机所在的区域。

    gcloud compute instances delete-access-config [SERVER-VM] \
        --zone=[ZONE] \
        --access-config-name=external-nat
    

API

针对每个后端虚拟机向 instances.deleteAccessConfig 方法发出 POST 请求,并将 vm-a1us-west1-a 分别替换为虚拟机的名称和虚拟机所在的区域。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a1/deleteAccessConfig?accessConfig=external-nat&networkInterface=None

接受所有端口上的流量

负载平衡器的转发规则(而不是其后端服务)决定着负载平衡器接受哪些端口上的流量。如需了解每个组件的用途,请参阅组件

创建此示例负载平衡器的转发规则时,请配置端口 80800880808088。安装 Apache 的启动脚本还会将其配置为接受端口 4438443 上的 HTTPS 连接。

为了支持这 6 个端口,您可以将转发规则配置为接受所有端口上的流量。借助此策略,您还可以配置一条或多条允许到后端虚拟机的传入连接的防火墙规则,以便仅允许特定端口。

此过程演示了如何将示例负载平衡器的转发规则替换为接受所有端口上的流量的规则。

如需详细了解何时使用此设置,请参阅内部 TCP/UDP 负载平衡和采用相同 IP 地址的转发规则

控制台

删除转发规则并创建新的转发规则

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 点击 be-ilb 负载平衡器,然后点击修改
  3. 点击前端配置
  4. 将鼠标悬停在您的 10.1.2.9 转发规则上,然后点击垃圾桶图标将其删除。
  5. 点击添加前端 IP 和端口
  6. 新建前端 IP 和端口部分,进行以下更改:
    1. 名称fr-ilb
    2. 子网lb-subnet
    3. 内部 IP 中,选择 ip-ilb
    4. 端口所有
    5. 点击完成
    6. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  7. 点击检查并最终确认。仔细检查您的设置。
  8. 点击创建

gcloud

  1. 删除现有的转发规则 fr-ilb

    gcloud compute forwarding-rules delete fr-ilb \
        --region=us-west1
    
  2. 创建具有相同名称的替换转发规则,其端口配置使用关键字 ALL。此转发规则的其他参数与之前相同。

    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=ALL \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    

API

forwardingRules.delete 方法发出 DELETE 请求,以删除转发规则。

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr-ilb

forwardingRules.insert 方法发出 POST 请求,以创建转发规则。

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

{
  "name": "fr-ilb",
  "IPAddress": "10.1.2.99",
  "IPProtocol": "TCP",
  "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",
  "networkTier": "PREMIUM"
}

测试所有端口设置的流量

您可以连接到客户端虚拟机实例并测试 HTTP 和 HTTPS 连接。

  • 连接到客户端虚拟机:

    gcloud compute ssh vm-client --zone=us-west1-a
    
  • 在所有四个端口上测试 HTTP 连接:

    curl http://10.1.2.99
    curl http://10.1.2.99:8008
    curl http://10.1.2.99:8080
    curl http://10.1.2.99:8088
    
  • 在端口 4438443 上测试 HTTPS 连接。必须使用 --insecure 标志,因为示例设置中的每个 Apache 服务器均使用自签名证书。

    curl https://10.1.2.99 --insecure
     curl https://10.1.2.99:8443 --insecure
    
  • 测试结果显示,HTTP 请求(在所有四个端口上)和 HTTPS 请求(在两个端口上)分布在所有后端虚拟机中。

使用两条转发规则接受多个端口上的流量

创建此示例负载平衡器的转发规则时,请配置端口 80800880808088。安装 Apache 的启动脚本还会将其配置为接受端口 4438443 上的 HTTPS 连接。

如需配置单条转发规则以接受所有端口上的流量,一种替代策略是创建多条转发规则,每条转发规则最多支持五个端口。

此过程演示了如何将示例负载平衡器的转发规则替换为两条转发规则,即一条转发规则处理端口 80800880808088 上的流量,另一条转发规则处理端口 4438443 上的流量。

如需详细了解何时使用此设置,请参阅内部 TCP/UDP 负载平衡和采用相同 IP 地址的转发规则

gcloud

  1. 删除现有的转发规则 fr-ilb

    gcloud compute forwarding-rules delete fr-ilb \
        --region=us-west1
    
  2. 10.1.2.99 创建静态(预留)内部 IP 地址,并将其 --purpose 标志设置为 SHARED_LOADBALANCER_VIP。必须使用 --purpose 标志,这样两条内部转发规则才能使用同一内部 IP 地址。

    gcloud beta compute addresses create internal-10-1-2-99 \
        --region=us-west1 \
        --subnet=lb-subnet \
        --addresses=10.1.2.99 \
        --purpose=SHARED_LOADBALANCER_VIP
    
    1. 使用以下参数创建两条替换转发规则:
    gcloud compute forwarding-rules create fr-ilb-http \
        --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=be-ilb \
        --backend-service-region=us-west1
    
    gcloud compute forwarding-rules create fr-ilb-https \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=443,8443 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    

API

forwardingRules.delete 方法发出 DELETE 请求,以删除转发规则。

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr-ilb

addresses.insert 方法发出 POST 请求,以为 10.1.2.99 创建静态(预留)内部 IP 地址并将其用途设为 SHARED_LOADBALANCER_VIP

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

{
  "name": "internal-10-1-2-99",
  "address": "10.1.2.99",
  "prefixLength": 32,
  "addressType": INTERNAL,
  "purpose": SHARED_LOADBALANCER_VIP,
  "subnetwork": "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-west1/subnetworks/lb-subnet"
}

forwardingRules.insert 方法发出两个 POST 请求,以创建两条转发规则。

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

{
  "name": "fr-ilb-http",
  "IPAddress": "10.1.2.99",
  "IPProtocol": "TCP",
  "ports": [
    "80", "8008", "8080",  "8088"
  ],
  "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"
}
{
  "name": "fr-ilb-https",
  "IPAddress": "10.1.2.99",
  "IPProtocol": "TCP",
  "ports": [
    "443", "8443"
  ],
  "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"
}

测试多个端口设置的流量

您可以连接到客户端虚拟机实例并测试 HTTP 和 HTTPS 连接。

  • 连接到客户端虚拟机:

    gcloud compute ssh vm-client --zone=us-west1-a
    
  • 在所有四个端口上测试 HTTP 连接:

    curl http://10.1.2.99
    curl http://10.1.2.99:8008
    curl http://10.1.2.99:8080
    curl http://10.1.2.99:8088
    
  • 在端口 4438443 上测试 HTTPS 连接。必须使用 --insecure 标志,因为示例设置中的每个 Apache 服务器均使用自签名证书。

    curl https://10.1.2.99 --insecure
    curl https://10.1.2.99:8443 --insecure
    
  • 测试结果显示,HTTP 请求(在所有四个端口上)和 HTTPS 请求(在两个端口上)分布在所有后端虚拟机中。

使用会话亲和性

示例配置创建的后端服务没有会话亲和性。

此过程演示了如何根据从客户端的 IP 地址和负载平衡器内部转发规则的 IP 地址创建的哈希值,更新示例内部 TCP/UDP 负载平衡器的后端服务以使其使用会话亲和性。请注意,当前不支持为内部 UDP 负载平衡器设置会话亲和性。

控制台

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 点击 be-ilb(您为此示例创建的后端服务的名称),然后点击修改
  3. “修改内部负载平衡器”页面,点击后端配置
  4. 会话粘性弹出式菜单中选择客户端 IP
  5. 点击更新

gcloud

使用以下 gcloud 命令更新 be-ilb 后端服务,并指定客户端 IP 会话亲和性:

gcloud compute backend-services update be-ilb \
    --region=us-west1 \
    --session-affinity CLIENT_IP

API

regionBackendServices/patch 方法发出 PATCH 请求。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb

{
  "sessionAffinity": "CLIENT_IP"
}

如需详细了解如何使用会话亲和性影响流量分配以及每个选项的说明,请参阅流量分配

在其他子网中创建转发规则

此过程会在另一个子网中再创建一个 IP 地址和一条转发规则,以演示您可以为一个内部 TCP/UDP 负载平衡器创建多条转发规则。转发规则的地区必须与后端服务的地区一致。

根据防火墙规则,地区内任何子网中的客户端都可以连接任一内部 TCP/UDP 负载平衡器 IP 地址。

控制台

添加第二个子网

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击创建 VPC 网络
  3. 点击 lb-network
  4. 子网部分中执行以下操作:
    • 点击添加子网
    • 新子网部分中,输入以下信息:
      • 名称second-subnet
      • 地区us-west1
      • IP 地址范围10.5.6.0/24
      • 点击添加

添加第二条转发规则

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 点击 be-ilb 负载平衡器,然后点击修改
  3. 点击前端配置
  4. 点击添加前端 IP 和端口
  5. 新建前端 IP 和端口部分,进行以下更改:
    1. 名称fr-ilb-2
    2. 子网second-subnet
    3. 内部 IP 中,选择 ip-ilb
    4. 端口80、443
    5. 点击完成
    6. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  6. 点击检查并最终确认。仔细检查您的设置。
  7. 点击创建

gcloud

  1. us-west1 地区的 lb-network 网络中创建第二个子网:

    gcloud compute networks subnets create second-subnet \
       --network=lb-network \
       --range=10.5.6.0/24 \
       --region=us-west1
    
  2. 为端口 80 和 443 创建第二个转发规则。此规则的其他参数(包括 IP 地址和后端服务)均与主转发规则 fr-ilb 相同。

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

API

subnetworks.insert 方法发出 POST 请求。

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

{
  "name": "second-subnet",
  "network": "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/lb-network",
  "ipCidrRange": "10.5.6.0/24",
  "privateIpGoogleAccess": false
}

forwardingRules.insert 方法发出 POST 请求,以创建转发规则。

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

{
 "name": "fr-ilb-2",
 "IPAddress": "10.5.6.99",
 "IPProtocol": "TCP",
 "ports": [
   "80", "443"
 ],
 "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"
}

测试新的转发规则

  1. 您可以连接到客户端虚拟机实例并测试与 IP 地址的 HTTP 和 HTTPS 连接。

    • 连接到客户端虚拟机:
    gcloud compute ssh vm-client --zone=us-west1-a
    
    • 测试与 IP 地址的 HTTP 连接:
    curl http://10.1.2.99
    curl http://10.5.6.99
    
    • 测试 HTTPS 连接。必须使用 --insecure,因为示例设置中的 Apache 服务器配置使用自签名证书。
    curl https://10.1.2.99 --insecure
    curl https://10.5.6.99 --insecure
    
    • 测试结果显示,无论使用何种协议(HTTP 或 HTTPS)或 IP 地址,请求均由所有后端虚拟机进行处理。

后续步骤