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

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


如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示

操作演示


权限

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

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

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

设置具有单栈子网的负载均衡器

本指南介绍如何配置和测试内部直通式网络负载均衡器。此部分中的步骤介绍了如何配置以下内容:

  1. 使用名为 lb-network自定义模式 VPC 网络的示例。
  2. 单栈子网(stack-type 设置为 IPv4),IPv4 流量需要该子网。在自定义模式 VPC 网络上创建单栈子网时,您可以为子网选择 IPv4 子网范围
  3. 允许后端虚拟机的传入连接的防火墙规则。
  4. 后端实例组,位于此示例的以下区域和子网中:
    • 地区:us-west1
    • 子网:lb-subnet,其主要 IPv4 地址范围为 10.1.2.0/24
  5. 四个后端虚拟机:可用区 us-west1-a 中非代管式实例组中的两个虚拟机,以及可用区 us-west1-c 中非代管式实例组中的两个虚拟机。为了演示全球访问权限,此示例会在其他区域和子网中再创建一个测试客户端虚拟机:
    • 地区:europe-west1
    • 子网:europe-subnet(其主要 IP 地址范围为 10.3.4.0/24
  6. 一个用于测试连接的客户端虚拟机。
  7. 以下内部直通网络负载均衡器组件:
    • 后端服务健康检查。
    • us-west1 区域中的内部后端服务,用于管理两个可用区实例组的连接分布。
    • 负载均衡器前端的内部转发规则和内部 IP 地址。

此示例的架构如下所示:

内部直通式网络负载均衡器示例配置。
内部直通式网络负载均衡器示例配置(点击可放大)。

配置网络、区域和子网

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

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

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

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

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

gcloud

  1. 创建自定义 VPC 网络:

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

    gcloud compute networks subnets create lb-subnet \
      --network=lb-network \
      --range=10.1.2.0/24 \
      --region=us-west1
    
  3. lb-network 网络中,创建另一个子网以测试 europe-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 控制台中,转到防火墙页面。

    转到“防火墙政策”

  2. 如需允许子网流量,请点击创建防火墙规则并输入以下信息:

    • 名称fw-allow-lb-access
    • 网络lb-network
    • 优先级1000
    • 流量方向入站
    • 匹配时执行的操作允许
    • 目标All instances in the network
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围10.1.2.0/24
    • 协议和端口允许全部
  3. 点击创建

  4. 如需允许传入的 SSH 连接,请再次点击创建防火墙规则,然后输入以下信息:

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

  6. 如需允许 Google Cloud 健康检查,请第三次点击创建防火墙规则,然后输入以下信息:

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

gcloud

  1. 创建 fw-allow-lb-access 防火墙规则以允许在子网内进行通信:

    gcloud compute firewall-rules create fw-allow-lb-access \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.1.2.0/24,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
}

创建后端虚拟机和实例组

此示例使用了两个非代管实例组,每个实例组都有两个后端(服务器)虚拟机。为了展示内部直通式网络负载均衡器的区域级性质,我们将这两个实例组分别置于 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 地址。内部直通网络负载均衡器通过保留目标 IP 地址来传送数据包。确保在后端虚拟机上运行的服务器软件在监听负载均衡器内部转发规则的 IP 地址。如果您配置了多条内部转发规则,请确保您的软件会监听与每条规则关联的内部 IP 地址。由内部直通式网络负载均衡器传送到后端虚拟机的数据包的目标 IP 地址是转发规则的内部 IP 地址。

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

控制台

创建后端虚拟机

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

    转到虚拟机实例

  2. 使用以下名称和可用区组合对每个虚拟机重复执行第 3 步到第 8 步。

    • 名称: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. 点击高级选项

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

    1. 对于网络标记,请输入 allow-sshallow-health-check
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network
      • 子网lb-subnet
      • IP 栈类型IPv4(单栈)
      • 主要内部 IPv4 地址临时(自动)
      • 外部 IPv4 地址临时
  9. 点击管理,然后在启动脚本字段中,输入以下脚本。所有四个虚拟机的脚本内容均相同。

    
    #! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed
    
  10. 点击创建

创建实例组

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

    进入“实例组”

  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://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    
  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://metadata.google.internal/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"
   }
 ]
}

配置负载均衡器组件

以下步骤会配置所有内部直通式网络负载均衡器组件,先配置健康检查和后端服务,然后配置前端组件:

  • 健康检查:在此示例中,您使用检查 HTTP 200 (OK) 响应的 HTTP 健康检查。如需了解详情,请参阅内部直通式网络负载均衡器概览的健康检查部分

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

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

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

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击创建负载均衡器

  3. 网络负载均衡器 (TCP/SSL) 卡片上,点击开始配置
  4. 对于面向互联网或仅限内部,请选择仅在我的虚拟机之间

  5. 对于负载均衡器类型,选择直通

  6. 点击继续

  7. 创建内部直通网络负载均衡器页面上,输入以下信息:

    • 负载均衡器名称be-ilb
    • 区域us-west1
    • 网络lb-network

配置后端

  1. 点击后端配置
  2. 如需仅处理 IPv4 流量,请在后端新后端部分,选择 IP 栈类型作为 IPv4(单栈)
  3. 实例组中,选择 ig-c 实例组,然后点击完成
  4. 点击添加后端,然后重复此步骤来添加 ig-a
  5. 健康检查列表中,选择创建健康检查,输入以下信息,然后点击保存

    • 名称hc-http-80
    • 协议HTTP
    • 端口80
    • 代理协议:NONE
    • 请求路径:/

    请注意,当您使用 Google Cloud 控制台创建负载均衡器时,健康检查是全局性检查。如果要创建区域性健康检查,请使用 gcloud 或 API。

  6. 请先确认后端配置旁边是否有蓝色对勾标记,然后再继续操作。

配置前端

  1. 点击前端配置
  2. 新建前端 IP 和端口部分,执行以下操作:
    1. 对于名称,输入 fr-ilb
    2. 对于子网,选择 lb-subnet
    3. 内部 IP 用途部分的 IP 地址列表中,选择创建 IP 地址,输入以下信息,然后点击预留
      • 名称ip-ilb
      • IP 版本:IPv4
      • 静态 IP 地址:让我选择
      • 自定义 IP 地址:10.1.2.99
    4. 对于端口,选择多个,然后在端口号中输入 80800880808088
    5. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。

检查配置

  1. 点击检查并最终确定
  2. 查看负载均衡器配置设置。
  3. 可选:点击等效代码以查看将用于创建负载均衡器的 REST API 请求。
  4. 点击创建

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

测试负载均衡器

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

创建客户端虚拟机

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

控制台

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

    转到虚拟机实例

  2. 点击创建实例

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

  4. 对于区域,请选择 us-west1

  5. 对于可用区,请选择 us-west1-a

  6. 点击高级选项

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

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

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
}

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

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

  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 操作。这是因为内部直通式网络负载均衡器采用虚拟网络编程实现,不属于独立设备。

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

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

    timeout 10 ping 10.1.2.99
    

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

此测试表明,当后端虚拟机将数据包发送到负载均衡器的转发规则的 IP 地址时,这些请求会路由回后端虚拟机自身。无论后端虚拟机的健康检查状态如何,情况都是如此。

内部直通式网络负载均衡器是在客机操作系统中使用虚拟网络编程和虚拟机配置实现的。在 Linux 虚拟机上,客机环境会在操作系统的本地路由表中为负载均衡器的 IP 地址创建路由。

由于此本地路由在虚拟机自身内(而非 VPC 网络中的路由),因此 VPC 网络不会处理发送到负载均衡器的 IP 地址的数据包。相反,发送到负载均衡器的 IP 地址的数据包仍会保留在虚拟机的操作系统中。

  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 匹配的目标。此路由是内部直通式网络负载均衡器的必要部分,但也说明了由负载均衡器的后端虚拟机发出的请求始终由同一虚拟机响应的原因。

    ip route show table local | grep 10.1.2.99
    

当内部直通式网络负载均衡器的后端虚拟机将数据包发送到负载均衡器的转发规则 IP 地址时,数据包将始终路由回发出请求的虚拟机。这是因为内部直通式网络负载均衡器是直通式负载均衡器,并通过在虚拟机的客机操作系统中为负载均衡器的 IP 地址创建本地路由来实现,如本部分所示。如果在特定应用场景中,您实现了负载均衡的后端需要将 TCP 流量发送到负载均衡器的 IP 地址,并且您需要分配流量,就像其来自非负载均衡后端一样,请考虑使用区域级内部代理网络负载均衡器

如需了解详情,请参阅内部直通式网络负载均衡器作为下一个跃点

设置具有双栈子网的负载均衡器

本指南介绍如何配置和测试内部直通式网络负载均衡器。此部分中的步骤介绍了如何配置以下内容:

  1. 本页面中的示例使用名为 lb-network-dual-stack自定义模式 VPC 网络。IPv6 流量需要自定义模式子网
  2. 双栈子网(stack-type 设置为 IPv4_IPv6),IPv6 流量需要该子网。在自定义模式 VPC 网络上创建双栈子网时,您可以为子网选择 IPv6 访问类型。在此示例中,我们将子网的 ipv6-access-type 参数设置为 INTERNAL。这意味着此子网上的新虚拟机可以分配内部 IPv4 地址和内部 IPv6 地址。如需了解相关说明,请参阅有关添加双栈子网的 VPC 文档。
  3. 允许后端虚拟机的传入连接的防火墙规则。
  4. 后端实例组,位于此示例的以下区域和子网中:
    • 地区:us-west1
    • 子网:lb-subnet,其主要 IPv4 地址范围为 10.1.2.0/24。虽然您可以选择在子网上配置哪个 IPv4 地址范围,但系统会自动分配 IPv6 地址范围。Google 提供固定大小 (/64) 的 IPv6 CIDR 地址块。
  5. 四个后端双栈虚拟机:可用区 us-west1-a 的非代管式实例组中的两个虚拟机,以及可用区 us-west1-c 的非代管式实例组中的两个虚拟机。为了演示全球访问权限,此示例会在其他区域和子网中再创建一个测试客户端虚拟机:
    • 地区:europe-west1
    • 子网:europe-subnet(其主要 IP 地址范围为 10.3.4.0/24
  6. 一个用于测试连接的客户端虚拟机。
  7. 以下内部直通网络负载均衡器组件:
    • 后端服务健康检查。
    • us-west1 区域中的内部后端服务,用于管理两个可用区实例组的连接分布。
    • 负载均衡器前端的两条内部转发规则。

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

具有后端服务的双栈 VPC 网络,用于管理到两个可用区实例组的连接分布。
内部直通式网络负载均衡器示例配置(点击可放大)。

配置网络、区域和子网

本页面介绍的内部直通式网络负载均衡器示例是在一个名为 lb-network-dual-stack自定义模式 VPC 网络中创建的。

如需配置具有内部 IPv6 范围的子网,请启用 VPC 网络 ULA 内部 IPv6 范围。内部 IPv6 子网范围是从此范围分配的。

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

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

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

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

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

    • 名称lb-subnet
    • 区域us-west1
    • IP 栈类型IPv4 和 IPv6(双栈)
    • IPv4 范围10.1.2.0/24
    • IPv6 访问权限类型内部
  7. 点击完成

  8. 点击添加子网,然后输入以下信息:

    • 名称europe-subnet
    • 区域europe-west1
    • IP 栈类型IPv4(单栈)
    • IP 地址范围10.3.4.0/24
  9. 点击完成

  10. 点击创建

gcloud

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

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

    gcloud compute networks create lb-network-dual-stack \
     --subnet-mode=custom \
     --enable-ula-internal-ipv6 \
     --internal-ipv6-range=ULA_IPV6_RANGE \
     --bgp-routing-mode=regional
    

    ULA_IPV6_RANGE 替换为 Google 用于内部 IPv6 子网范围的 fd20::/20 范围内的 /48 前缀。如果您不使用 --internal-ipv6-range 标志,则 Google 会为该网络选择 /48 前缀,例如 fd20:bc7:9a1c::/48

  2. NETWORK 网络中,为 us-west1 区域中的后端创建子网,并创建另一个子网以测试 europe-west1 区域中的全球访问权限。

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

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

API

创建一个新的自定义模式 VPC 网络。

如需在此网络中的任何子网上配置内部 IPv6 范围,请将 enableUlaInternalIpv6 设置为 true。此选项会分配 Google 用于内部 IPv6 子网范围的 fd20::/20 范围内的 /48 范围。如果您要选择分配的 /48 IPv6 范围,还请使用 internalIpv6Range 字段指定范围。

 POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
 {
   "autoCreateSubnetworks": false,
   "name": "lb-network-dual-stack",
   "mtu": MTU,
   "enableUlaInternalIpv6": true,
   "internalIpv6Range": "ULA_IPV6_RANGE",
   "routingConfig": {
   "routingMode": "DYNAMIC_ROUTING_MODE"
  }
 }
 

请替换以下内容:

  • PROJECT_ID:在其中创建 VPC 网络的项目的 ID。
  • MTU:该网络的最大传输单元。MTU 可以是 1460(默认值)或 1500。在将 MTU 设置为 1500 之前,请查看最大传输单元概览
  • ULA_IPV6_RANGE:Google 用于内部 IPv6 子网范围的 fd20::/20 范围内的 /48 前缀。如果您没有为 internalIpv6Range 提供值,Google 会为该网络选择 /48 前缀。
  • DYNAMIC_ROUTING_MODEglobalregional,用于控制网络中 Cloud Router 路由器的路由通告行为。如需了解详情,请参阅动态路由模式

    如需了解详情,请参阅 networks.insert 方法

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-dual-stack",
   "name": "lb-subnet"
   "stackType": IPV4_IPV6,
   "ipv6AccessType": Internal
 }
 

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

配置防火墙规则

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

  • fw-allow-lb-access:入站流量规则,它适用于 VPC 网络中的所有目标,允许来自 10.1.2.0/2410.3.4.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. 如需创建允许子网流量的规则,请点击创建防火墙规则,然后输入以下信息:

    • 名称fw-allow-lb-access
    • 网络lb-network-dual-stack
    • 优先级1000
    • 流量方向入站
    • 匹配时执行的操作允许
    • 目标All instances in the network
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围10.1.2.0/2410.3.4.0/24
    • 协议和端口允许全部
  3. 点击创建

  4. 如需允许 IPv6 子网流量,请再次点击创建防火墙规则,然后输入以下信息:

    • 名称fw-allow-lb-access-ipv6
    • 网络lb-network-dual-stack
    • 优先级1000
    • 流量方向入站
    • 匹配时执行的操作允许
    • 目标All instances in the network
    • 来源过滤条件IPv6 范围
    • 来源 IPv6 范围lb-subnet 中分配的 IPV6_ADDRESS
    • 协议和端口允许全部
  5. 点击创建

  6. 如需允许传入的 SSH 连接,请再次点击创建防火墙规则,然后输入以下信息:

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

  8. 如需允许 Google Cloud IPv6 健康检查,请再次点击创建防火墙规则,然后输入以下信息:

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

  10. 如需允许 Google Cloud 健康检查,请再次点击创建防火墙规则,然后输入以下信息:

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

gcloud

  1. 创建 fw-allow-lb-access 防火墙规则以允许与子网通信:

    gcloud compute firewall-rules create fw-allow-lb-access \
        --network=lb-network-dual-stack \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.1.2.0/24,10.3.4.0/24 \
        --rules=all
    
  2. 创建 fw-allow-lb-access-ipv6 防火墙规则以允许与子网通信:

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

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

  3. 创建 fw-allow-ssh 防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。如果省略 source-ranges,Google Cloud 会将规则解释为表示所有来源

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network-dual-stack \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  4. 创建 fw-allow-health-check-ipv6 规则以允许 Google Cloud IPv6 健康检查。

    gcloud compute firewall-rules create fw-allow-health-check-ipv6 \
        --network=lb-network-dual-stack \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-health-check-ipv6 \
        --source-ranges=2600:2d00:1:b029::/64 \
        --rules=tcp,udp
    
  5. 创建 fw-allow-health-check 规则以允许 Google Cloud 健康检查。

    gcloud compute firewall-rules create fw-allow-health-check \
        --network=lb-network-dual-stack \
        --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

  1. 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-dual-stack",
    "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
    }
    
  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-dual-stack",
     "priority": 1000,
     "sourceRanges": [
       "IPV6_ADDRESS"
     ],
     "allowed": [
       {
          "IPProtocol": "tcp"
        },
        {
          "IPProtocol": "udp"
        },
        {
          "IPProtocol": "icmp"
        }
     ],
     "direction": "INGRESS",
     "logConfig": {
        "enable": false
     },
     "disabled": false
    }
    

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

  3. 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-dual-stack",
    "priority": 1000,
    "sourceRanges": [
      "0.0.0.0/0"
    ],
    "targetTags": [
      "allow-ssh"
    ],
    "allowed": [
     {
       "IPProtocol": "tcp",
       "ports": [
         "22"
       ]
     }
    ],
    "direction": "INGRESS",
    "logConfig": {
     "enable": false
    },
    "disabled": false
    }
    
  4. 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-dual-stack",
    "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
    }
    
  5. 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-dual-stack",
    "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
    }
    

创建后端虚拟机和实例组

此示例使用了两个非代管实例组,每个实例组都有两个后端(服务器)虚拟机。为了展示内部直通式网络负载均衡器的区域级性质,我们将这两个实例组分别置于 us-west1-aus-west1-c 这两个独立的可用区。

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

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

为了支持此示例和其他配置选项,四个虚拟机都运行一个 Apache Web 服务器,该服务器监听以下 TCP 端口:808008808080884438443

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

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

默认情况下,Apache 配置为绑定到任何 IP 地址。内部直通式网络负载均衡器通过保留目标 IP 地址来传送数据包。

确保在后端虚拟机上运行的服务器软件在监听负载均衡器内部转发规则的 IP 地址。如果您配置了多条内部转发规则,请确保您的软件会监听与每条规则关联的内部 IP 地址。由内部直通式网络负载均衡器传送到后端虚拟机的数据包的目标 IP 地址是转发规则的内部 IP 地址。

确保子网堆栈类型与代管式实例组使用的实例模板的堆栈类型匹配。如果代管式实例组使用双栈实例模板,则子网必须是双栈。

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

控制台

创建后端虚拟机

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

    转到虚拟机实例

  2. 使用以下名称和可用区组合对每个虚拟机重复执行第 3 步到第 8 步。

    • 名称: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. 点击高级选项

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

    1. 对于网络标记,请输入 allow-sshallow-health-check-ipv6
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network-dual-stack
      • 子网lb-subnet
      • IP 栈类型IPv4 和 IPv6(双栈)
      • 主要内部 IPv4 地址临时(自动)
      • 外部 IPv4 地址临时
    3. 点击管理,然后在启动脚本字段中,输入以下脚本。所有四个虚拟机的脚本内容均相同。

      #! /bin/bash
      if [ -f /etc/startup_script_completed ]; then
      exit 0
      fi
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      file_ports="/etc/apache2/ports.conf"
      file_http_site="/etc/apache2/sites-available/000-default.conf"
      file_https_site="/etc/apache2/sites-available/default-ssl.conf"
      http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
      http_vh_prts="*:80 *:8008 *:8080 *:8088"
      https_listen_prts="Listen 443\nListen 8443"
      https_vh_prts="*:443 *:8443"
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      prt_conf="$(cat "$file_ports")"
      prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
      prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
      echo "$prt_conf" | tee "$file_ports"
      http_site_conf="$(cat "$file_http_site")"
      http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
      echo "$http_site_conf_2" | tee "$file_http_site"
      https_site_conf="$(cat "$file_https_site")"
      https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
      echo "$https_site_conf_2" | tee "$file_https_site"
      systemctl restart apache2
      touch /etc/startup_script_completed
      
  9. 点击创建

创建实例组

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

    进入“实例组”

  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-dual-stack

  8. 对于子网,选择 lb-subnet

  9. 虚拟机实例部分中,添加第 2 步中说明的虚拟机。

  10. 点击创建

gcloud

  1. 如需创建四个虚拟机,请使用 [VM-NAME][ZONE] 的下列四种组合运行四次 gcloud compute instances create 命令。所有四个虚拟机的脚本内容均相同。

    • 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-ipv6 \
        --subnet=lb-subnet \
        --stack-type=IPV4_IPV6 \
        --metadata=startup-script='#! /bin/bash
      if [ -f /etc/startup_script_completed ]; then
      exit 0
      fi
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      file_ports="/etc/apache2/ports.conf"
      file_http_site="/etc/apache2/sites-available/000-default.conf"
      file_https_site="/etc/apache2/sites-available/default-ssl.conf"
      http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
      http_vh_prts="*:80 *:8008 *:8080 *:8088"
      https_listen_prts="Listen 443\nListen 8443"
      https_vh_prts="*:443 *:8443"
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      prt_conf="$(cat "$file_ports")"
      prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
      prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
      echo "$prt_conf" | tee "$file_ports"
      http_site_conf="$(cat "$file_http_site")"
      http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
      echo "$http_site_conf_2" | tee "$file_http_site"
      https_site_conf="$(cat "$file_https_site")"
      https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
      echo "$https_site_conf_2" | tee "$file_https_site"
      systemctl restart apache2
      touch /etc/startup_script_completed'
      
  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-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-dual-stack",
     "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-dual-stack",
 "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-dual-stack",
 "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"
   }
 ]
}

配置负载均衡器组件

以下步骤会配置所有内部直通式网络负载均衡器组件,先配置健康检查和后端服务,然后配置前端组件:

  • 健康检查:在此示例中,您使用检查 HTTP 200 (OK) 响应的 HTTP 健康检查。如需了解详情,请参阅内部直通式网络负载均衡器概览的健康检查部分

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

  • 转发规则:此示例为 IPv4 和 IPv6 流量创建两条内部转发规则。

  • 内部 IP 地址:在此示例中,您在创建 IPv4 转发规则时指定了内部 IP 地址 10.1.2.99。如需了解详情,请参阅内部 IP 地址。虽然您可以选择配置哪个 IPv4 地址,但系统会自动分配 IPv6 地址。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击创建负载均衡器

  3. 网络负载均衡器 (TCP/SSL) 卡片上,点击开始配置
  4. 对于面向互联网或仅限内部,请选择仅在我的虚拟机之间

  5. 点击继续

  6. 创建内部直通网络负载均衡器页面上,输入以下信息:

    • 负载均衡器名称be-ilb
    • 区域us-west1
    • 网络lb-network-dual-stack

后端配置

  1. 点击后端配置
  2. 后端新后端部分,选择 IP 栈类型作为 IPv4 和 IPv6(双栈)
  3. 实例组中,选择 ig-a 实例组,然后点击完成
  4. 点击添加后端,然后重复此步骤来添加 ig-c
  5. 健康检查列表中,选择创建健康检查,输入以下信息,然后点击保存
    • 名称hc-http-80
    • 范围区域
    • 协议HTTP
    • 端口80
    • 代理协议NONE
    • 请求路径/
  6. 验证后端配置旁边是否显示了蓝色对勾标记。

前端配置

  1. 点击前端配置。在新建前端 IP 和端口部分,执行以下操作:
    1. 对于名称,输入 fr-ilb-ipv6
    2. 如需处理 IPv6 流量,请执行以下操作:
      1. 对于 IP 版本,请选择 IPv6
      2. 对于子网,选择 lb-subnet。 转发规则中的 IPv6 地址范围始终具有临时性。
      3. 对于端口,选择多个,然后在端口号字段中输入 80800880808088
      4. 点击完成
    3. 如需处理 IPv4 流量,请执行以下操作:
      1. 点击添加前端 IP 和端口
      2. 对于名称,输入 fr-ilb
      3. 对于子网,选择 lb-subnet
      4. 内部 IP 用途部分的 IP 地址列表中,选择创建 IP 地址,输入以下信息,然后点击预留
        • 名称ip-ilb
        • IP 版本:IPv4
        • 静态 IP 地址:让我选择
        • 自定义 IP 地址:10.1.2.99
      5. 对于端口,选择多个,然后在端口号中输入 80800880808088
      6. 点击完成
      7. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。

检查配置

  1. 点击检查并最终确定。检查所有设置。
  2. 如果设置正确,请点击创建。创建内部直通式网络负载均衡器需要几分钟时间。

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. 为后端服务创建两条转发规则。创建 IPv4 转发规则时,请为 IPv4 地址所在子网中的内部 IP 地址指定 10.1.2.99

    gcloud compute forwarding-rules create fr-ilb \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --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-ipv6 \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --subnet=lb-subnet \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1 \
        --ip-version=IPV6
    

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-ipv6",
"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",
"backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb",
"ipVersion": "IPV6",
"networkTier": "PREMIUM"
}

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",
"backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb",
"networkTier": "PREMIUM"
}

测试负载均衡器

如需测试负载均衡器,请在负载均衡器所在的区域中创建客户端虚拟机,然后将流量从客户端发送到负载均衡器。

创建客户端虚拟机

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

控制台

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

    转到虚拟机实例

  2. 点击创建实例

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

  4. 对于区域,请选择 us-west1

  5. 对于可用区,请选择 us-west1-a

  6. 点击高级选项

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

    1. 对于网络标记,请输入 allow-ssh
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network-dual-stack
      • 子网lb-subnet
      • IP 栈类型IPv4 和 IPv6(双栈)
      • 主要内部 IP临时(自动)
      • 外部 IP临时
    3. 点击完成
  8. 点击创建

gcloud

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

gcloud compute instances create vm-client \
    --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",
 "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-dual-stack",
     "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
}

测试连接

此测试通过单独的客户端虚拟机连接负载均衡器;也就是说,并非使用负载均衡器的后端虚拟机。预期行为是流量在四个后端虚拟机之间分配。

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

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

    gcloud compute forwarding-rules describe fr-ilb-ipv6 --region=us-west1
    
  3. 描述 IPv4 转发规则 fr-ilb

    gcloud compute forwarding-rules describe fr-ilb --region=us-west1
    
  4. 从具有 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
    
  5. 从具有 IPv4 连接的客户端,运行以下命令:

    $ curl -m 10 -s http://10.1.2.99:80
    

    请将占位符替换为有效值:

    • IPV6_ADDRESSfr-ilb-ipv6 转发规则中的临时 IPv6 地址。

其他配置选项

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

启用全球访问权限

您可以为示例内部直通式网络负载均衡器启用全球访问权限,以使其可供所有区域的客户端访问。示例负载均衡器的后端仍必须位于一个区域 (us-west1) 中。

具有全球访问权限的内部直通网络负载均衡器。
具有全球访问权限的内部直通式网络负载均衡器(点击可放大)。

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

控制台

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

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 名称列中,点击您的内部直通式网络负载均衡器。示例负载均衡器名为 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. 您可以使用 forwarding-rules describe 命令来确定转发规则是否启用了全球访问权限。例如:

    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 控制台中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 vm-client2

  4. 区域设置为 europe-west1

  5. 可用区设置为 europe-west1-b

  6. 点击高级选项

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

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

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
  

配置代管式实例组

示例配置创建了两个非代管实例组。您也可以将代管式实例组(包括可用区级和区域级代管式实例组)用作内部直通式网络负载均衡器的后端。

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

代管实例组还支持自动扩缩自动修复。如果您将自动扩缩和内部直通式网络负载均衡器搭配使用,则无法基于负载均衡进行扩缩。

此过程展示了如何修改示例内部直通式网络负载均衡器的后端服务,使其使用区域代管式实例组。

控制台

实例模板

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

    转到虚拟机实例模板

  2. 点击创建实例模板

  3. 名称设置为 template-vm-ilb

  4. 选择机器类型

  5. 启动磁盘部分中,确保为启动磁盘选项选择了 Debian 操作系统和 10 (Buster) 版本。如有必要,请点击更改以更改映像。

  6. 点击高级选项

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

    1. 对于网络标记,请输入 allow-sshallow-health-check
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network
      • 子网lb-subnet
  8. 点击管理,然后在启动脚本字段中输入以下脚本:

    #! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed
    
  9. 点击创建

代管实例组

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

    进入“实例组”

  2. 点击创建实例组

  3. 名称设置为 ig-ilb

  4. 对于位置,选择多可用区,并将区域设置为 us-west1

  5. 实例模板设置为 template-vm-ilb

  6. 可选:配置自动扩缩。您无法基于 HTTP 负载均衡功能来自动扩缩实例组,因为实例组是内部直通式网络负载均衡器的后端。

  7. 实例数下限设置为 1,将实例数上限设置为 6

  8. 可选:配置自动修复。如果您配置了自动修复功能,请对内部直通式网络负载均衡器使用与后端服务相同的健康检查。在此示例中,请使用 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://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    
  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 控制台中,转到虚拟机实例页面。

    转到虚拟机实例

  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

使用预留的内部 IP 地址

当您创建后端虚拟机和实例组时,该虚拟机实例使用临时内部 IPv4 或 IPv6 地址。

以下步骤展示了如何将内部 IPv4 或 IPv6 地址提升为静态内部 IPv4 或 IPv6 地址,然后将虚拟机实例更新为使用静态内部 IP 地址:

  1. 将使用中的临时内部 IPv4 或 IPv6 地址升级为静态地址
  2. 为现有实例更改或分配内部 IPv6 地址

或者,以下步骤展示了如何预留新的静态内部 IPv4 或 IPv6 地址,然后更新虚拟机实例以使用静态内部 IP 地址:

  1. 预留新的静态内部 IPv4 或 IPv6 地址

    与内部 IPv4 预留不同,内部 IPv6 预留不支持预留子网中的特定 IP 地址。系统会自动从子网的 /64 内部 IPv6 地址范围中分配 /96 内部 IPv6 地址范围。

  2. 为现有实例更改或分配内部 IPv6 地址

如需了解详情,请参阅如何预留静态内部 IP 地址

接受所有端口上的流量

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

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

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

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

如需详细了解何时使用此设置,请参阅内部直通式网络负载均衡器及共用 IP 地址的转发规则

控制台

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

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击 be-ilb 负载均衡器,然后点击修改

  3. 点击前端配置

  4. 将鼠标指针放在 10.1.2.9 转发规则上,然后点击 删除

  5. 点击添加前端 IP 和端口

  6. 新建前端 IP 和端口部分,输入以下信息,然后点击完成

    • 名称fr-ilb
    • 子网lb-subnet
    • 内部 IPip-ilb
    • 端口所有
  7. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。

  8. 点击检查并最终确定,然后查看您的负载均衡器配置设置。

  9. 点击创建

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 上的流量。

如需详细了解何时使用此设置,请参阅内部直通式网络负载均衡器及共用 IP 地址的转发规则

控制台

  1. 在 Google Cloud 控制台中,转到转发规则页面。

    转到转发规则

  2. 名称列中,点击 fr-ilb,然后点击删除

  3. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  4. 名称列中,点击 be-ilb

  5. 点击修改

  6. 点击前端配置

  7. 点击添加前端 IP 和端口

  8. 新建前端 IP 和端口部分,执行以下操作:

    1. 对于名称,输入 fr-ilb-http
    2. 对于子网,选择 lb-subnet
    3. 对于内部 IP 用途,选择共享
    4. IP 地址列表中,选择创建 IP 地址,输入以下信息,然后点击预留
      • 名称internal-10-1-2-99
      • 静态 IP 地址:让我选择
      • 自定义 IP 地址10.1.2.99
    5. 对于端口,选择多个,然后在端口号中输入 80800880808088
    6. 点击完成
  9. 点击添加前端 IP 和端口

  10. 新建前端 IP 和端口部分,执行以下操作:

    1. 对于名称,输入 fr-ilb-https
    2. 对于子网,选择 lb-subnet
    3. 对于内部 IP 用途,选择共享
    4. IP 地址列表中,选择 internal-10-1-2-99
    5. 对于端口,选择多个,然后在端口号中输入 4438443
    6. 点击完成
  11. 点击检查并最终确定,然后检查您的负载均衡器配置设置。

  12. 点击更新

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 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 地址创建的哈希值,更新示例内部直通式网络负载均衡器的后端服务以使其使用会话亲和性。

如需了解支持的会话亲和性类型,请参阅会话亲和性选项

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

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

配置连接跟踪政策

本部分介绍如何更新后端服务以更改负载均衡器的默认连接跟踪政策。

连接跟踪政策包括以下设置:

gcloud

使用以下 gcloud compute backend-services 命令更新后端服务的连接跟踪政策:

gcloud compute backend-services update BACKEND_SERVICE \
    --region=REGION \
    --tracking-mode=TRACKING_MODE \
    --connection-persistence-on-unhealthy-backends=CONNECTION_PERSISTENCE_BEHAVIOR \
    --idle-timeout-sec=IDLE_TIMEOUT_VALUE

请将占位符替换为有效值:

  • BACKEND_SERVICE:您要更新的后端服务
  • REGION:您要更新的后端服务的区域
  • TRACKING_MODE:用于传入数据包的连接跟踪模式;如需查看受支持值的列表,请参阅跟踪模式
  • CONNECTION_PERSISTENCE_BEHAVIOR:后端运行状况不佳时的连接持久性行为;如需查看受支持值的列表,请参阅运行状况不佳的后端上的连接持久性
  • IDLE_TIMEOUT_VALUE:在负载均衡器处理与条目匹配的最后一个数据包后,必须保持连接跟踪表条目的秒数

    仅当连接跟踪小于 5 元组时(即当会话亲和性配置为:CLIENT_IPCLIENT_IP_PROTO,并且跟踪模式为 PER_SESSION 时),才能修改此属性。

    默认值为 600 秒(10 分钟)。最大可配置空闲超时值为 57600 秒(16 小时)。

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

此过程会在另一个子网中创建第二个 IP 地址和转发规则,以证明您可以为一个内部直通式网络负载均衡器创建多个转发规则。转发规则的区域必须与后端服务的区域一致。

根据防火墙规则,区域内任何子网中的客户端都可以连接任一内部直通式网络负载均衡器 IP 地址。

控制台

添加第二个子网

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 点击 lb-network

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

    1. 点击添加子网
    2. 新子网部分中,输入以下信息:
      • 名称second-subnet
      • 区域us-west1
      • IP 地址范围10.5.6.0/24
    3. 点击添加

添加第二条转发规则

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击 be-ilb 负载均衡器,然后点击修改

  3. 点击前端配置

  4. 点击添加前端 IP 和端口

  5. 新建前端 IP 和端口部分,设置以下字段,然后点击完成

    • 名称fr-ilb-2
    • IP 版本IPv4
    • 子网second-subnet
    • 内部 IPip-ilb
    • 端口80443
  6. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。

  7. 点击检查并最终确定,然后检查您的负载均衡器配置设置。

  8. 点击创建

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

测试新转发规则

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

  1. 连接到客户端虚拟机:

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. 测试与 IP 地址的 HTTP 连接:

    curl http://10.1.2.99
    curl http://10.5.6.99
    
  3. 测试 HTTPS 连接。必须使用 --insecure,因为示例设置中的 Apache 服务器配置使用自签名证书。

    curl https://10.1.2.99 --insecure
    curl https://10.5.6.99 --insecure
    
  4. 测试结果显示,无论使用何种协议(HTTP 或 HTTPS)或 IP 地址,请求均由所有后端虚拟机进行处理。

使用后端子集化

示例配置创建没有子集的后端服务。

此过程说明如何为示例内部直通式网络负载均衡器的后端服务启用子集,以便部署可扩展到更多的后端实例。

当单个负载均衡器需要支持超过 250 个后端虚拟机时,才需要启用子集。

如需详细了解此使用场景,请参阅后端子集化

gcloud

使用以下 gcloud 命令更新 be-ilb 后端服务,并指定子集化政策:

gcloud compute backend-services update be-ilb \
    --subsetting-policy=CONSISTENT_HASH_SUBSETTING

API

regionBackendServices/patch 方法发出 PATCH 请求。

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

{
"subsetting":
  {
    "policy": CONSISTENT_HASH_SUBSETTING
  }
}

为数据包镜像创建负载均衡器

数据包镜像可让您从 VPC 中的特定实例复制和收集数据包数据。您可以利用所收集到的数据,检测安全威胁并监控应用性能。

数据包镜像需要内部直通式网络负载均衡器,以均衡传送到收集器目标实例组的流量。如需为数据包镜像创建内部直通式网络负载均衡器,请按以下步骤操作。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击创建负载均衡器

  3. 网络负载均衡器 (TCP/SSL) 卡片上,点击开始配置
  4. 面向互联网或仅限内部部分,选择仅在我的虚拟机之间,然后点击继续

  5. 负载均衡器名称部分,输入名称。

  6. 对于区域,请选择您要镜像数据包的虚拟机实例所在的区域。

  7. 网络部分,选择要创建数据包镜像的网络。

  8. 点击后端配置

  9. 新建后端部分,对于实例组,选择要将数据包转发到的实例组。

  10. 健康检查列表中,选择创建健康检查,输入以下信息,然后点击保存

    1. 名称字段中,输入健康检查的名称。
    2. 对于协议,请选择 HTTP
    3. 对于端口,请输入 80
  11. 点击前端配置

  12. 新建前端 IP 和端口部分,执行以下操作:

    1. 名称部分,输入名称。
    2. 对于子网,请选择与要创建镜像的实例位于同一区域的子网。
    3. 对于端口,选择全部
    4. 点击高级配置,然后选中启用此负载均衡器以执行数据包镜像复选框。
    5. 点击完成
  13. 点击创建

gcloud

  1. 创建一个新的区域级 HTTP 健康检查,以测试端口 80 上的实例组 HTTP 连接:

    gcloud compute health-checks create http HEALTH_CHECK_NAME \
        --region=REGION \
        --port=80
    

    请替换以下内容:

    • HEALTH_CHECK_NAME:健康检查的名称。
    • REGION:您要镜像数据包的虚拟机实例所在的区域。
  2. 为 HTTP 流量创建后端服务:

    gcloud compute backend-services create COLLECTOR_BACKEND_SERVICE \
        --region=REGION \
        --health-checks-region=REGION \
        --health-checks=HEALTH_CHECK_NAME \
        --load-balancing-scheme=internal \
        --protocol=tcp
    

    请替换以下内容:

    • COLLECTOR_BACKEND_SERVICE:后端服务的名称。
    • REGION:您要对数据包进行镜像的虚拟机实例所在的区域。
    • HEALTH_CHECK_NAME:健康检查的名称。
  3. 将实例组添加到后端服务:

    gcloud compute backend-services add-backend COLLECTOR_BACKEND_SERVICE \
        --region=REGION \
        --instance-group=INSTANCE_GROUP \
        --instance-group-zone=ZONE
    

    请替换以下内容:

    • COLLECTOR_BACKEND_SERVICE:后端服务的名称。
    • REGION:实例组所在的区域。
    • INSTANCE_GROUP:实例组的名称。
    • ZONE:实例组所在的可用区。
  4. 为后端服务创建转发规则:

    gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
        --region=REGION \
        --network=NETWORK \
        --subnet=SUBNET \
        --backend-service=COLLECTOR_BACKEND_SERVICE \
        --load-balancing-scheme=internal \
        --ip-protocol=TCP \
        --ports=all \
        --is-mirroring-collector
    

    请替换以下内容:

    • FORWARDING_RULE_NAME:转发规则的名称。
    • REGION:转发规则的区域。
    • NETWORK:转发规则的网络。
    • SUBNET:您要镜像数据包的虚拟机区域中的子网。
    • COLLECTOR_BACKEND_SERVICE:此负载均衡器的后端服务。

后续步骤