设置具有虚拟机实例组后端的跨区域内部代理网络负载均衡器

本文档介绍了如何为 Compute Engine 虚拟机上运行的服务配置跨区域内部代理网络负载均衡器。

准备工作

在按照本指南进行操作之前,请先熟悉以下内容:

权限

若要按照本指南中的说明进行操作,您必须能够创建实例以及修改项目中的网络。因此,您必须是项目 Owner 或 Editor,或者必须具有以下所有 Compute Engine IAM 角色

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

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

设置概览

您可以配置负载均衡器,如下图所示:

跨区域内部代理网络负载均衡器高可用性部署。
跨区域内部代理网络负载均衡器高可用性部署(点击可放大)。

如上图所示,该示例在 VPC 网络中创建了一个跨区域内部代理网络负载均衡器,其中区域 REGION_AREGION_B 中包含一个后端服务和两个后端代管式实例组 (MIG)。

图中显示了以下内容:

  1. 一个具有以下子网的 VPC 网络:

    • 子网 SUBNET_AREGION_A 中的代理专用子网。
    • 子网 SUBNET_BREGION_B 中的代理专用子网。

    您必须在其中使用跨区域内部代理网络负载均衡器的 VPC 网络的每个区域中创建代理专用子网。该区域的代理专用子网会在该区域的所有跨区域内部代理网络负载均衡器之间共享。对于从负载均衡器发送到服务后端的数据包,系统会从代理专用子网分配其来源地址。在此示例中,区域 REGION_B 的代理专用子网的主要 IP 地址范围为 10.129.0.0/23REGION_A 的主要 IP 地址范围为 10.130.0.0/23,这是建议的子网大小。

  2. 高可用性设置具有适用于 REGION_AREGION_B 区域中的 Compute Engine 虚拟机部署的托管式实例组后端。如果一个区域中的后端发生故障,则流量会故障切换到另一个区域。

  3. 用于监控后端使用情况和健康状况全球后端服务。

  4. 全球目标 TCP 代理,用于接收用户请求并将其转发到后端服务。

  5. 具有负载均衡器的区域级内部 IP 地址且可以将每个传入请求转发到目标代理的全球转发规则。

    与转发规则关联的内部 IP 地址可以来自与后端位于同一网络和区域的子网。请注意以下条件:

    • 该 IP 地址可以(但并非必须)与后端实例组来自同一子网。
    • 该 IP 地址不得来自 --purpose 标志设置为 GLOBAL_MANAGED_PROXY 的预留代理专用子网。
    • 如果要将同一内部 IP 地址与多个转发规则结合使用,请将 IP 地址 --purpose 标志设置为 SHARED_LOADBALANCER_VIP

配置网络和子网

在 VPC 网络中,在配置了后端的每个区域中配置一个子网。此外,请在要配置负载均衡器的每个区域中配置 proxy-only-subnet

本示例使用以下 VPC 网络、区域和子网:

  • 网络。网络是名为 NETWORK自定义模式 VPC 网络

  • 后端子网

    • REGION_A 区域中名为 SUBNET_A 的子网使用 10.1.2.0/24 作为其主要 IP 范围。
    • REGION_B 区域中名为 SUBNET_B 的子网使用 10.1.3.0/24 作为其主要 IP 范围。
  • 代理子网

    • REGION_A 区域中名为 PROXY_SN_A 的子网使用 10.129.0.0/23 作为其主要 IP 范围。
    • REGION_B 区域中名为 PROXY_SN_B 的子网使用 10.130.0.0/23 作为其主要 IP 范围。

您可以从 VPC 中的任何区域访问跨区域内部应用负载均衡器。因此,来自任何区域的客户端都可以在全球范围内访问负载均衡器后端。

配置后端子网

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 为网络提供名称

  4. 子网部分中,将子网创建模式设置为自定义

  5. 为负载均衡器的后端创建子网。在新子网部分中,输入以下信息:

    • 为子网提供名称
    • 选择区域REGION_A
    • 输入 IP 地址范围10.1.2.0/24
  6. 点击完成

  7. 点击添加子网

  8. 为负载均衡器的后端创建子网。在新子网部分中,输入以下信息:

    • 为子网提供名称
    • 选择区域REGION_B
    • 输入 IP 地址范围10.1.3.0/24
  9. 点击完成

  10. 点击创建

gcloud

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

    gcloud compute networks create NETWORK \
        --subnet-mode=custom
    
  2. 使用 gcloud compute networks subnets create 命令REGION_A 区域的 NETWORK 网络中创建子网:

    gcloud compute networks subnets create SUBNET_A \
        --network=NETWORK \
        --range=10.1.2.0/24 \
        --region=REGION_A
    
  3. 使用 gcloud compute networks subnets create 命令REGION_B 区域的 NETWORK 网络中创建子网:

    gcloud compute networks subnets create SUBNET_B \
        --network=NETWORK \
        --range=10.1.3.0/24 \
        --region=REGION_B
    

Terraform

如需创建 VPC 网络,请使用 google_compute_network 资源

resource "google_compute_network" "default" {
  auto_create_subnetworks = false
  name                    = "lb-network-crs-reg"
  provider                = google-beta
}

如需在 lb-network-crs-reg 网络中创建 VPC 子网,请使用 google_compute_subnetwork 资源

resource "google_compute_subnetwork" "subnet_a" {
  provider      = google-beta
  ip_cidr_range = "10.1.2.0/24"
  name          = "lbsubnet-uswest1"
  network       = google_compute_network.default.id
  region        = "us-west1"
}
resource "google_compute_subnetwork" "subnet_b" {
  provider      = google-beta
  ip_cidr_range = "10.1.3.0/24"
  name          = "lbsubnet-useast1"
  network       = google_compute_network.default.id
  region        = "us-east1"
}

API

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

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

{
 "routingConfig": {
   "routingMode": "regional"
 },
 "name": "NETWORK",
 "autoCreateSubnetworks": false
}

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

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks

{
 "name": "SUBNET_A",
 "network": "projects/PROJECT_ID/global/networks/lb-network-crs-reg",
 "ipCidrRange": "10.1.2.0/24",
 "region": "projects/PROJECT_ID/regions/REGION_A",
}

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

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks

{
 "name": "SUBNET_B",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "ipCidrRange": "10.1.3.0/24",
 "region": "projects/PROJECT_ID/regions/REGION_B",
}

配置代理专用子网

代理专用子网提供了一组 IP 地址,供 Google Cloud 用于代表您运行 Envoy 代理。代理会终结来自客户端的连接并创建与后端的新连接。

此代理专用子网用于与 VPC 网络位于同一区域的所有基于 Envoy 的区域级负载均衡器。在每个网络中,每个区域只能有一个活跃代理专用子网用于给定目的。

控制台

如果您使用的是 Google Cloud 控制台,则可以稍后在负载均衡页面上创建代理专用子网。

如需立即创建代理专用子网,请按以下步骤操作:

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

    转到 VPC 网络页面

  2. 点击 VPC 网络的名称。
  3. 子网标签页上,点击添加子网
  4. 为代理专用子网提供名称
  5. 选择区域REGION_A
  6. 用途列表中,选择跨区域托管式代理
  7. IP 地址范围字段中,输入 10.129.0.0/23
  8. 点击添加

REGION_B 中创建代理专用子网

  1. 子网标签页上,点击添加子网
  2. 为代理专用子网提供名称
  3. 选择区域REGION_B
  4. 用途列表中,选择跨区域托管式代理
  5. IP 地址范围字段中,输入 10.130.0.0/23
  6. 点击添加

gcloud

使用 gcloud compute networks subnets create 命令创建代理专用子网。

    gcloud compute networks subnets create PROXY_SN_A \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=REGION_A \
        --network=NETWORK \
        --range=10.129.0.0/23
    
    gcloud compute networks subnets create PROXY_SN_B \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=REGION_B \
        --network=NETWORK \
        --range=10.130.0.0/23
    

Terraform

如需在 lb-network-crs-reg 网络中创建 VPC 代理专用子网,请使用 google_compute_subnetwork 资源

resource "google_compute_subnetwork" "proxy_subnet_a" {
  provider      = google-beta
  ip_cidr_range = "10.129.0.0/23"
  name          = "proxy-only-subnet1"
  network       = google_compute_network.default.id
  purpose       = "GLOBAL_MANAGED_PROXY"
  region        = "us-west1"
  role          = "ACTIVE"
  lifecycle {
    ignore_changes = [ipv6_access_type]
  }
}
resource "google_compute_subnetwork" "proxy_subnet_b" {
  provider      = google-beta
  ip_cidr_range = "10.130.0.0/23"
  name          = "proxy-only-subnet2"
  network       = google_compute_network.default.id
  purpose       = "GLOBAL_MANAGED_PROXY"
  region        = "us-east1"
  role          = "ACTIVE"
  lifecycle {
    ignore_changes = [ipv6_access_type]
  }
}

API

使用 subnetworks.insert 方法创建代理专用子网,并将 PROJECT_ID 替换为您的项目 ID。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks

    {
      "name": " PROXY_SN_A",
      "ipCidrRange": "10.129.0.0/23",
      "network": "projects/PROJECT_ID/global/networks/NETWORK",
      "region": "projects/PROJECT_ID/regions/REGION_A",
      "purpose": "GLOBAL_MANAGED_PROXY",
      "role": "ACTIVE"
    }
   
    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks

    {
      "name": "PROXY_SN_B",
      "ipCidrRange": "10.130.0.0/23",
      "network": "projects/PROJECT_ID/global/networks/NETWORK",
      "region": "projects/PROJECT_ID/regions/REGION_B",
      "purpose": "GLOBAL_MANAGED_PROXY",
      "role": "ACTIVE"
    }
   

配置防火墙规则

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

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

  • fw-healthcheck。适用于负载均衡实例的入站流量规则,该规则允许来自 Google Cloud 健康检查系统(130.211.0.0/2235.191.0.0/16)的所有 TCP 流量。此示例使用目标标记 load-balanced-backend 来标识防火墙规则应用到的实例。

  • fw-backends。适用于负载均衡实例的入站流量规则,该规则允许从内部代理网络负载均衡器的代管式代理发送到端口 804438080 的 TCP 流量。此示例使用目标标记 load-balanced-backend 来标识防火墙规则应用到的虚拟机。

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

目标标记定义了后端实例。没有目标标记,防火墙规则将应用于 VPC 网络中的所有后端实例。创建后端虚拟机时,请务必包括指定的目标标记,如创建代管实例组中所示。

控制台

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

    转到“防火墙政策”

  2. 点击创建防火墙规则,以创建允许传入 SSH 连接的规则:

    • 名称fw-ilb-to-backends
    • 网络NETWORK
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围0.0.0.0/0
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 TCP 复选框,然后输入 22 作为端口号。
  3. 点击创建

  4. 再次点击创建防火墙规则,创建允许 Google Cloud 健康检查的规则:

    • 名称fw-healthcheck
    • 网络NETWORK
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记load-balanced-backend
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围130.211.0.0/2235.191.0.0/16
    • 协议和端口

      • 选择指定的协议和端口
      • 选中 TCP 复选框,然后输入 80 作为端口号。

      最佳做法是将此规则限制为仅使用与健康检查所使用的协议和端口匹配的协议和端口。如果您使用 tcp:80 协议和端口,则 Google Cloud 可以使用 HTTP 通过端口 80 联系您的虚拟机,但无法使用 HTTPS 通过端口 443 联系这些虚拟机。

  5. 点击创建

  6. 第三次点击创建防火墙规则,以创建允许负载均衡器的代理服务器连接后端的规则:

    • 名称fw-backends
    • 网络NETWORK
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记load-balanced-backend
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围10.129.0.0/2310.130.0.0/23
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 TCP 复选框,然后输入 80, 443, 8080 作为端口号。
  7. 点击创建

gcloud

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

    gcloud compute firewall-rules create fw-ilb-to-backends \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  2. 创建 fw-healthcheck 规则以允许 Google Cloud 健康检查。本示例允许来自健康检查探测工具的所有 TCP 流量;但是,您可以根据自己的需求配置较小范围的端口集。

    gcloud compute firewall-rules create fw-healthcheck \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --target-tags=load-balanced-backend \
        --rules=tcp
    
  3. 创建 fw-backends 规则以允许内部代理网络负载均衡器的代理连接到您的后端。将 source-ranges 设置为代理专用子网的分配范围,例如 10.129.0.0/2310.130.0.0/23

    gcloud compute firewall-rules create fw-backends \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --source-ranges=SOURCE_RANGE \
        --target-tags=load-balanced-backend \
        --rules=tcp:80,tcp:443,tcp:8080
    

API

通过向 firewalls.insert 方法发出 POST 请求来创建 fw-ilb-to-backends 防火墙规则,并将 PROJECT_ID 替换为您的项目 ID。

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

{
 "name": "fw-ilb-to-backends",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "sourceRanges": [
   "0.0.0.0/0"
 ],
 "targetTags": [
   "allow-ssh"
 ],
 "allowed": [
  {
    "IPProtocol": "tcp",
    "ports": [
      "22"
    ]
  }
 ],
"direction": "INGRESS"
}

通过向 firewalls.insert 方法发出 POST 请求来创建 fw-healthcheck 防火墙规则,并将 PROJECT_ID 替换为您的项目 ID。

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

{
 "name": "fw-healthcheck",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "sourceRanges": [
   "130.211.0.0/22",
   "35.191.0.0/16"
 ],
 "targetTags": [
   "load-balanced-backend"
 ],
 "allowed": [
   {
     "IPProtocol": "tcp"
   }
 ],
 "direction": "INGRESS"
}

通过 firewalls.insert 方法创建 fw-backends 防火墙规则以允许代理子网内的 TCP 流量,并将 PROJECT_ID 替换为您的项目 ID。

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

{
 "name": "fw-backends",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "sourceRanges": [
   "10.129.0.0/23",
   "10.130.0.0/23"
 ],
 "targetTags": [
   "load-balanced-backend"
 ],
 "allowed": [
   {
     "IPProtocol": "tcp",
     "ports": [
       "80"
     ]
   },
 {
     "IPProtocol": "tcp",
     "ports": [
       "443"
     ]
   },
   {
     "IPProtocol": "tcp",
     "ports": [
       "8080"
     ]
   }
 ],
 "direction": "INGRESS"
}

创建代管式实例组

本部分介绍如何创建模板和托管式实例组。托管式实例组提供运行示例跨区域内部代理网络负载均衡器的后端服务器的虚拟机实例。对于您的实例组,您可以定义一个 HTTP 服务并将端口名称映射到相关端口上。负载均衡器的后端服务会将流量转发到已命名的端口。 来自客户端的流量在经过负载均衡处理后传送到后端服务器。出于演示目的,后端会传送其各自的主机名。

控制台

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

    转到“实例模板”

    1. 点击创建实例模板
    2. 对于名称,输入 gil4-backendeast1-template
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 12 (bookworm)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get
    4. 点击高级选项
    5. 点击网络并配置以下字段:
      1. 网络标记部分,输入 allow-sshload-balanced-backend
      2. 对于网络接口,请选择以下内容:
        • 网络NETWORK
        • 子网SUBNET_B
    6. 点击管理。将以下脚本输入启动脚本字段。

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      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
      systemctl restart apache2
      
    7. 点击创建

    8. 点击创建实例模板

    9. 对于名称,输入 gil4-backendwest1-template

    10. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 12 (bookworm)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get

    11. 点击高级选项

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

      1. 网络标记部分,输入 allow-sshload-balanced-backend
      2. 对于网络接口,请选择以下内容:
        • 网络NETWORK
        • 子网SUBNET_A
    13. 点击管理。将以下脚本输入启动脚本字段。

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      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
      systemctl restart apache2
      
    14. 点击创建

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

    进入“实例组”

    1. 点击创建实例组
    2. 选择 New managed instance group (stateless)(新的托管式实例组 [无状态])。如需了解详情,请参阅无状态或有状态 MIG
    3. 对于名称,输入 gl4-ilb-miga
    4. 对于位置,选择单个可用区
    5. 对于区域,请选择 REGION_A
    6. 对于可用区,请选择 ZONE_A
    7. 对于实例模板,请选择 gil4-backendwest1-template
    8. 指定要在组中创建的实例数。

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

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

      (可选)在界面的自动扩缩部分中,您可以将实例组配置为根据实例 CPU 使用情况自动添加或移除实例

    9. 点击创建

    10. 点击创建实例组

    11. 选择 New managed instance group (stateless)(新的托管式实例组 [无状态])。如需了解详情,请参阅无状态或有状态 MIG

    12. 对于名称,输入 gl4-ilb-migb

    13. 对于位置,选择单个可用区

    14. 对于区域,请选择 REGION_B

    15. 对于可用区,请选择 ZONE_B

    16. 对于实例模板,请选择 gil4-backendeast1-template

    17. 指定要在组中创建的实例数。

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

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

      (可选)在界面的自动扩缩部分中,您可以将实例组配置为根据实例 CPU 使用情况自动添加或移除实例

    18. 点击创建

gcloud

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

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

    gcloud compute instance-templates create gil4-backendwest1-template \
       --region=REGION_A \
       --network=NETWORK \
       --subnet=SUBNET_A \
       --tags=allow-ssh,load-balanced-backend \
       --image-family=debian-12 \
       --image-project=debian-cloud \
       --metadata=startup-script='#! /bin/bash
         apt-get update
         apt-get install apache2 -y
         a2ensite default-ssl
         a2enmod ssl
         vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         http://169.254.169.254/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    
    gcloud compute instance-templates create gil4-backendeast1-template \
        --region=REGION_B \
        --network=NETWORK \
        --subnet=SUBNET_B \
        --tags=allow-ssh,load-balanced-backend \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --metadata=startup-script='#! /bin/bash
          apt-get update
          apt-get install apache2 -y
          a2ensite default-ssl
          a2enmod ssl
          vm_hostname="$(curl -H "Metadata-Flavor:Google" \
          http://169.254.169.254/computeMetadata/v1/instance/name)"
          echo "Page served from: $vm_hostname" | \
          tee /var/www/html/index.html
          systemctl restart apache2'
    
  2. 使用 gcloud compute instance-groups managed create 命令在相应可用区中创建一个托管式实例组。

    gcloud compute instance-groups managed create gl4-ilb-miga \
        --zone=ZONE_A \
        --size=2 \
        --template=gil4-backendwest1-template
    
    gcloud compute instance-groups managed create gl4-ilb-migb \
        --zone=ZONE_B \
        --size=2 \
        --template=gil4-backendeast1-template
    

API

使用 instanceTemplates.insert 方法创建实例模板,并将 PROJECT_ID 替换为您的项目 ID。

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

{
  "name":"gil4-backendwest1-template",
  "properties":{
     "machineType":"e2-standard-2",
     "tags":{
       "items":[
         "allow-ssh",
         "load-balanced-backend"
       ]
     },
     "metadata":{
        "kind":"compute#metadata",
        "items":[
          {
            "key":"startup-script",
            "value":"#! /bin/bash\napt-get update\napt-get install
            apache2 -y\na2ensite default-ssl\na2enmod ssl\n
            vm_hostname=\"$(curl -H \"Metadata-Flavor:Google\"           
            \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\n
            echo \"Page served from: $vm_hostname\" | \\\ntee
            /var/www/html/index.html\nsystemctl restart apache2"
          }
        ]
     },
     "networkInterfaces":[
       {
         "network":"projects/PROJECT_ID/global/networks/NETWORK",
         "subnetwork":"regions/REGION_A/subnetworks/SUBNET_A",
         "accessConfigs":[
           {
             "type":"ONE_TO_ONE_NAT"
           }
         ]
       }
     ],
     "disks":[
       {
         "index":0,
         "boot":true,
         "initializeParams":{
           "sourceImage":"projects/debian-cloud/global/images/family/debian-12"
         },
         "autoDelete":true
       }
     ]
  }
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates

{
  "name":"gil4-backendeast1-template",
  "properties":{
     "machineType":"e2-standard-2",
     "tags":{
       "items":[
         "allow-ssh",
         "load-balanced-backend"
       ]
     },
     "metadata":{
        "kind":"compute#metadata",
        "items":[
          {
            "key":"startup-script",
            "value":"#! /bin/bash\napt-get update\napt-get install
            apache2 -y\na2ensite default-ssl\na2enmod ssl\n
            vm_hostname=\"$(curl -H \"Metadata-Flavor:Google\"           
            \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\n
            echo \"Page served from: $vm_hostname\" | \\\ntee
            /var/www/html/index.html\nsystemctl restart apache2"
          }
        ]
     },
     "networkInterfaces":[
       {
         "network":"projects/PROJECT_ID/global/networks/NETWORK",
         "subnetwork":"regions/REGION_B/subnetworks/SUBNET_B",
         "accessConfigs":[
           {
             "type":"ONE_TO_ONE_NAT"
           }
         ]
       }
     ],
     "disks":[
       {
         "index":0,
         "boot":true,
         "initializeParams":{
           "sourceImage":"projects/debian-cloud/global/images/family/debian-12"
         },
         "autoDelete":true
       }
     ]
  }
}

使用 instanceGroupManagers.insert 方法在每个可用区中创建一个托管式实例组,并将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/{zone}/instanceGroupManagers

{
  "name": "gl4-ilb-miga",
  "zone": "projects/PROJECT_ID/zones/ZONE_A",
  "instanceTemplate": "projects/PROJECT_ID/global/instanceTemplates/gil4-backendwest1-template",
  "baseInstanceName": "gl4-ilb-miga",
  "targetSize": 2
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/{zone}/instanceGroupManagers

{
  "name": "gl4-ilb-migb",
  "zone": "projects/PROJECT_ID/zones/ZONE_A",
  "instanceTemplate": "projects/PROJECT_ID/global/instanceTemplates/gil4-backendwest1-template",
  "baseInstanceName": "gl4-ilb-migb",
  "targetSize": 2
}

配置负载均衡器

下面的示例介绍了如何创建以下跨区域内部代理网络负载均衡器资源:

  • 全球 TCP 健康检查。
  • 与后端具有相同 MIG 的全球后端服务。
  • 全球目标代理。
  • 两条使用区域级 IP 地址的全球转发规则。对于转发规则的 IP 地址,请使用 SUBNET_ASUBNET_B IP 地址范围。如果您尝试使用代理专用子网,则转发规则创建会失败。

代理可用性

有时,Google Cloud 区域没有足够的代理容量来容纳新的负载均衡器。如果发生这种情况,Google Cloud 控制台会在您创建负载均衡器时提供一条代理可用性警告消息。如需解决此问题,您可以执行以下任一操作:

  • 为您的负载均衡器选择其他区域。如果您的后端位于其他区域,这是一种切实可行的做法。
  • 选择一个已分配有代理专用子网的 VPC 网络。
  • 等待容量问题的解决。

控制台

开始配置

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

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步
  4. 对于代理或直通,选择代理负载均衡器,然后点击下一步
  5. 公共或内部字段中,选择内部,然后点击下一步
  6. 跨区域或单区域部署字段中,选择最适合跨区域工作负载,然后点击下一步
  7. 点击配置

基本配置

  1. 为负载均衡器提供名称
  2. 对于网络,请选择 NETWORK

使用两条转发规则配置前端

  1. 点击前端配置
    1. 为转发规则提供名称
    2. Subnetwork region 列表中,选择 REGION_A

      预留代理专用子网

    3. 子网列表中,选择 SUBNET_A
    4. IP 地址列表中,点击创建 IP 地址。系统会打开预留静态内部 IP 地址页面。
      • 为静态 IP 地址提供名称
      • 静态 IP 地址列表中,选择让我选择
      • 自定义 IP 地址字段中,输入 10.1.2.99
      • 选择预留
  2. 点击完成
  3. 如需添加第二条转发规则,请点击添加前端 IP 和端口
    1. 为转发规则提供名称
    2. Subnetwork region 列表中,选择 REGION_B

      预留代理专用子网

    3. 子网列表中,选择 SUBNET_B
    4. IP 地址列表中,点击创建 IP 地址。系统会打开预留静态内部 IP 地址页面。
      • 为静态 IP 地址提供名称
      • 静态 IP 地址列表中,选择让我选择
      • 自定义 IP 地址字段中,输入 10.1.3.99
      • 选择预留
  4. 点击完成
配置后端服务
  1. 点击后端配置
  2. 创建或选择后端服务列表中,点击创建后端服务
  3. 为后端服务提供名称
  4. 对于 Protocol(协议),选择 TCP
  5. 对于已命名端口,输入 http
  6. 后端类型列表中,选择实例组
  7. 新后端部分:
    • 实例组列表中,选择 REGION_A 中的 gl4-ilb-miga
    • 端口号设置为 80
    • 点击完成
    • 如需添加其他后端,请点击添加后端
    • 实例组列表中,选择 REGION_B 中的 gl4-ilb-migb
    • 端口号设置为 80
    • 点击完成
  8. 健康检查列表中,点击创建健康检查
    • 名称字段中,输入 global-http-health-check
    • 协议设置为 HTTP
    • 端口设置为 80
    • 点击保存

检查配置

  1. 点击检查并最终确定
  2. 查看负载均衡器配置设置。
  3. 点击创建

gcloud

  1. 使用 gcloud compute health-checks create tcp 命令定义 TCP 健康检查。

    gcloud compute health-checks create tcp global-health-check \
       --use-serving-port \
       --global
    
  2. 使用 gcloud compute backend-services create 命令定义后端服务。

    gcloud compute backend-services create gl4-gilb-backend-service \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=TCP \
      --enable-logging \
      --logging-sample-rate=1.0 \
      --health-checks=global-health-check \
      --global-health-checks \
      --global
    
  3. 使用 gcloud compute backend-services add-backend 命令将后端添加到后端服务。

    gcloud compute backend-services add-backend gl4-gilb-backend-service \
      --balancing-mode=CONNECTION \
      --max-connections=50 \
      --instance-group=gl4-ilb-miga \
      --instance-group-zone=ZONE_A \
      --global
    
    gcloud compute backend-services add-backend gl4-gilb-backend-service \
      --balancing-mode=CONNECTION \
      --max-connections=50 \
      --instance-group=gl4-ilb-migb \
      --instance-group-zone=ZONE_B \
      --global
    
  4. 创建目标代理。

    使用 gcloud compute target-tcp-proxies create 命令创建目标代理。

    gcloud compute target-tcp-proxies create gilb-tcp-proxy \
      --backend-service=gl4-gilb-backend-service \
      --global
    
  5. 创建两条转发规则,一条规则使用 REGION_B 中的 VIP (10.1.2.99),另一条规则使用 REGION_A 中的 VIP (10.1.3.99)。如需了解详情,请参阅预留静态内部 IPv4 地址

    对于自定义网络,必须在转发规则中引用子网。请注意,这是虚拟机子网,而非代理子网。

    gcloud compute forwarding-rules create 命令与正确的标志结合使用。

    gcloud compute forwarding-rules create gil4forwarding-rule-a \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_A \
      --subnet-region=REGION_A \
      --address=10.1.2.99 \
      --ports=80 \
      --target-tcp-proxy=gilb-tcp-proxy \
      --global
    
    gcloud compute forwarding-rules create gil4forwarding-rule-b \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_B \
      --subnet-region=REGION_B \
      --address=10.1.3.99 \
      --ports=80 \
      --target-tcp-proxy=gilb-tcp-proxy \
      --global
    

API

healthChecks.insert 方法发出 POST 请求来创建健康检查,并将 PROJECT_ID 替换为您的项目 ID。

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

{
"name": "global-health-check",
"type": "TCP",
"httpHealthCheck": {
  "portSpecification": "USE_SERVING_PORT"
}
}

backendServices.insert 方法发出 POST 请求来创建全球后端服务,并将 PROJECT_ID 替换为您的项目 ID。

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

{
"name": "gl4-gilb-backend-service",
"backends": [
  {
    "group": "projects/PROJECT_ID/zones/ZONE_A/instanceGroups/gl4-ilb-miga",
    "balancingMode": "CONNECTION"
  },
  {
    "group": "projects/PROJECT_ID/zones/ZONE_B/instanceGroups/gl4-ilb-migb",
    "balancingMode": "CONNECTION"
  }
],
"healthChecks": [
  "projects/PROJECT_ID/regions/global/healthChecks/global-health-check"
],
"loadBalancingScheme": "INTERNAL_MANAGED"
}

targetTcpProxies.insert 方法发出 POST 请求来创建目标 TCP 代理,并将 PROJECT_ID 替换为您的项目 ID。

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

{
"name": "l4-ilb-proxy",
}

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

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

{
"name": "gil4forwarding-rule-a",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_A/subnetworks/SUBNET_A",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules

{
"name": "gil4forwarding-rule-b",
"IPAddress": "10.1.3.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_B/subnetworks/SUBNET_B",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}

globalForwardingRules.insert 方法发出 POST 请求来创建转发规则,并将 PROJECT_ID 替换为您的项目 ID。

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

{
"name": "gil4forwarding-rule-a",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_A/subnetworks/SUBNET_A",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules

{
"name": "gil4forwarding-rule-b",
"IPAddress": "10.1.3.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_B/subnetworks/SUBNET_B",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}

测试负载均衡器

创建虚拟机实例以测试连接性

  1. REGION_BREGION_A 区域中创建客户端虚拟机:

    gcloud compute instances create l4-ilb-client-a \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --network=NETWORK \
        --subnet=SUBNET_A \
        --zone=ZONE_A \
        --tags=allow-ssh
    
    gcloud compute instances create l4-ilb-client-b \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --network=NETWORK \
        --subnet=SUBNET_B \
        --zone=ZONE_B \
        --tags=allow-ssh
    
  2. 使用 SSH 连接到每个客户端实例。

    gcloud compute ssh l4-ilb-client-a --zone=ZONE_A
    
    gcloud compute ssh l4-ilb-client-b --zone=ZONE_B
    
  3. 验证 IP 地址是否传送其主机名

    • 验证客户端虚拟机是否可以访问以下两个 IP 地址。该命令应该会成功,并返回传送请求的后端虚拟机的名称:

      curl 10.1.2.99
      
      curl 10.1.3.99
      

测试故障切换

  1. REGION_B 中的后端健康状况不佳或无法访问时,验证故障切换到 REGION_A 区域的后端。如需模拟故障切换,请从 REGION_B 中移除所有后端:

    gcloud compute backend-services remove-backend gl4-gilb-backend-service \
      --instance-group=gl4-ilb-migb \
      --instance-group-zone=ZONE_B \
      --global
    
  2. 使用 SSH 连接到 REGION_B 中的客户端虚拟机。

    gcloud compute ssh l4-ilb-client-b \
       --zone=ZONE_B
    
  3. REGION_B 区域中的负载均衡 IP 地址发送请求。命令输出会显示来自 REGION_A 中的后端虚拟机的响应:

    {
    RESULTS=
    for i in {1..100}
    do
      RESULTS="$RESULTS:$(curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:10.1.3.99:443)"
    done
    echo "***"
    echo "*** Results of load-balancing to 10.1.3.99: "
    echo "***"
    echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
    echo
    }
    

其他配置选项

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

用于保留客户端连接信息的 PROXY 协议

内部代理网络负载均衡器会终止来自客户端的 TCP 连接并创建与虚拟机实例的新连接。默认情况下,系统不会保留原始客户端 IP 地址和端口信息。

要保留原始连接信息并将其发送到您的实例,请启用 PROXY 协议(版本 1)。此协议将包含来源 IP 地址、目标 IP 地址和端口号的附加标头作为请求的一部分发送给实例。

请确保内部代理网络负载均衡器的后端实例运行的是支持 ProXY 协议标头的 HTTP 或 HTTPS 服务器。如果 HTTP 或 HTTPS 服务器未配置为支持 PROXY 协议标头,则后端实例将返回空响应。例如,PROXY 协议不适用于 Apache HTTP Server 软件。您可以使用其他 Web 服务器软件,例如 Nginx。

如果您为用户流量设置了 PROXY 协议,则还必须为健康检查设置此协议。如果您检查健康状况并在同一端口上传送内容,请将健康检查的 --proxy-header 设置为与您的负载均衡器设置相匹配。

PROXY 协议标头通常是一行用户可读的文本,格式如下:

PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n

以下是 PROXY 协议的示例:

PROXY TCP4 192.0.2.1 198.51.100.1 15221 110\r\n

在上面的示例中,客户端 IP 为 192.0.2.1,负载均衡 IP 为 198.51.100.1,客户端端口为 15221,目标端口为 110

在客户端 IP 未知的情况下,负载均衡器将使用以下格式生成 PROXY 协议标头:

PROXY UNKNOWN\r\n

更新目标 TCP 代理的 PROXY 协议标头

此页面上的负载均衡器设置示例介绍了如何在创建内部代理网络负载均衡器时启用 PROXY 协议标头。按照以下步骤更改现有目标 TCP 代理的 PROXY 协议标头。

控制台

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

    转到“负载均衡”

  2. 点击您的负载均衡器对应的 修改

  3. 点击前端配置

  4. 代理协议字段的值更改为开启

  5. 点击更新以保存更改。

gcloud

在以下命令中,修改 --proxy-header 字段并将其设置为 NONEPROXY_V1,具体取决于您的要求。

gcloud compute target-ssl-proxies update int-tcp-target-proxy \
    --proxy-header=[NONE | PROXY_V1]

在多个内部转发规则中使用同一 IP 地址

如果多个内部转发规则共用同一内部 IP 地址,您必须预留该 IP 地址,并将其 --purpose 标志设置为 SHARED_LOADBALANCER_VIP

gcloud

gcloud compute addresses create SHARED_IP_ADDRESS_NAME \
    --region=REGION \
    --subnet=SUBNET_NAME \
    --purpose=SHARED_LOADBALANCER_VIP

启用会话亲和性

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

以下流程介绍了如何为示例负载均衡器更新后端服务,以便后端服务使用客户端 IP 地址亲和性或生成的 Cookie 亲和性。

启用客户端 IP 亲和性后,负载均衡器会根据使用客户端 IP 地址和负载均衡器 IP 地址(内部转发规则的内部 IP 地址)创建的哈希,将特定客户端的请求定向到同一后端虚拟机。

控制台

如需启用客户端 IP 地址会话亲和性,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入负载均衡页面。
    进入“负载均衡”
  2. 点击后端
  3. 点击您为此示例创建的后端服务的名称,然后点击修改
  4. 后端服务详情页面上,点击高级配置
  5. 会话亲和性下,从菜单中选择客户端 IP
  6. 点击更新

gcloud

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

gcloud compute backend-services update BACKEND_SERVICE \
    --global \
    --session-affinity=CLIENT_IP

启用连接排空

您可以在后端服务上启用连接排空,以确保在终止、手动移除或由自动扩缩器移除正在处理流量的实例时,对用户造成的干扰最小。如需详细了解连接排空,请参阅启用连接排空文档。

后续步骤