设置使用共享 VPC 的内部应用负载均衡器

本文档展示了在共享 VPC 环境中设置内部应用负载均衡器的两个示例配置:

  • 第一个示例是在一个服务项目中创建所有负载均衡器组件和后端。
  • 第二个示例是在一个服务项目中创建负载均衡器的前端组件和网址映射,而在其他服务项目中创建负载均衡器的后端服务和后端。这种类型的部署(其中网址映射引用其他项目中的后端服务)称为跨项目服务引用。

这两个示例都需要相同的前期配置来授予权限并设置共享 VPC,然后才能开始创建负载均衡器。

这些不是内部应用负载均衡器唯一支持的共享 VPC 配置。如需了解其他有效的共享 VPC 架构,请参阅共享 VPC 架构。

如果您不想使用共享 VPC 网络,请参阅设置内部应用负载均衡器。

须知事项

  1. 阅读共享 VPC 概览。
  2. 阅读内部应用负载均衡器概览,包括共享 VPC 架构部分。

所需权限

在共享 VPC 网络上设置负载均衡器需要管理员进行一些初始设置和预配。完成初始设置后,服务项目所有者可执行以下操作之一:

  • 在服务项目中部署负载均衡器的所有组件及其后端。
  • 在可由其他服务或宿主项目中的网址映射引用的服务项目中部署负载均衡器的后端组件(后端服务和后端)。

本部分汇总了按照本指南在共享 VPC 网络上设置负载均衡器所需的权限。

设置共享 VPC

以下任务需要以下角色:

  1. 执行一次性管理任务,例如设置共享 VPC 和启用宿主项目。
  2. 执行管理任务:每次您想要添加新的服务项目时都必须重复执行这些管理任务。这包括关联服务项目、预配和配置网络资源以及向服务项目管理员授予访问权限。

这些任务必须在共享 VPC 宿主项目中执行。我们建议 Shared VPC Admin 也成为共享 VPC 宿主项目的所有者。这将自动授予 Network Admin 和 Security Admin 角色。

任务 所需角色
设置共享 VPC,启用宿主项目并向服务项目管理员授予访问权限 Shared VPC Admin
在共享 VPC 宿主项目中创建子网并向服务项目管理员授予访问权限 Network Admin
添加和移除防火墙规则 Security Admin

预配子网后,宿主项目所有者必须将宿主项目中的 Network User 角色授予需要使用这些资源的任何人(通常是服务项目管理员、开发者或服务账号)。

任务 所需角色
使用属于宿主项目的 VPC 网络和子网 Network User

可以在项目级层或针对单个子网授予此角色。我们建议您针对单个子网授予此角色。如果针对项目授予此角色,则将向您授予权限来访问宿主项目的 VPC 网络中的所有当前子网和未来子网。

部署负载均衡器和后端

服务项目管理员需要服务项目中的以下角色才能创建负载均衡资源和后端。这些权限会自动授予给服务项目所有者或编辑者。

授予的服务项目中的角色
任务 所需角色
创建负载均衡器组件 Network Admin
创建实例 Instance Admin
创建和修改 SSL 证书 Security Admin

前提条件

在此部分,您需要执行以下步骤:

  1. 在宿主项目中配置网络和子网。
  2. 在宿主项目中设置共享 VPC。

您无需在每次创建新负载均衡器时都执行本部分中的步骤。但是,在继续创建负载均衡器之前,您必须确保可以访问此处所述的资源。

在宿主项目中配置网络和子网

您需要一个包含两个子网的共享 VPC 网络:一个用于负载均衡器的前端和后端,另一个用于负载均衡器的代理。

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

  • 网络。网络名为 lb-network。

  • 用于负载均衡器的前端和后端的子网。us-west1 区域中名为 lb-frontend-and-backend-subnet 的子网使用 10.1.2.0/24 作为其主要 IP 地址范围。

  • 代理子网。us-west1 区域中名为 proxy-only-subnet 的子网使用 10.129.0.0/23 作为其主要 IP 地址范围。

为负载均衡器的前端和后端配置子网

您无需在每次创建新负载均衡器时都执行此步骤。您只需确保服务项目可以访问共享 VPC 网络中的子网(以及代理专用子网)。

本部分中的所有步骤都必须在宿主项目中执行。

控制台

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

    转到 VPC 网络页面

  2. 点击创建 VPC 网络。
  3. 对于名称,输入 lb-network。
  4. 在子网部分中执行以下操作:

    1. 将子网创建模式设置为自定义。
    2. 在新子网部分中,输入以下信息:

      • 名称:lb-frontend-and-backend-subnet
      • 区域:us-west1

      • IP 地址范围:10.1.2.0/24

    3. 点击完成。

  5. 点击创建。

gcloud

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

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 在 us-west1 区域的 lb-network 网络中创建子网:

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

Terraform

  1. 创建 VPC 网络:

    # Shared VPC network
    resource "google_compute_network" "lb_network" {
      name                    = "lb-network"
      provider                = google-beta
      project                 = "my-host-project-id"
      auto_create_subnetworks = false
    }

  2. 在 us-west1 区域中创建子网:

    # Shared VPC network - backend subnet
    resource "google_compute_subnetwork" "lb_frontend_and_backend_subnet" {
      name          = "lb-frontend-and-backend-subnet"
      provider      = google-beta
      project       = "my-host-project-id"
      region        = "us-west1"
      ip_cidr_range = "10.1.2.0/24"
      role          = "ACTIVE"
      network       = google_compute_network.lb_network.id
    }

配置代理专用子网

代理专用子网用于 lb-network VPC 网络中 us-west1 区域内所有基于 Envoy 的区域负载均衡器。在每个网络中,每个区域只能有一个代理专用子网处于活跃状态。

如果此网络中的 us-west1 区域已预留代理专用子网,请勿执行此步骤。

本部分中的所有步骤都必须在宿主项目中执行。

控制台

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

    转到 VPC 网络页面

  2. 点击共享 VPC 网络的名称:lb-network。
  3. 点击添加子网。
  4. 对于名称,输入 proxy-only-subnet。
  5. 对于区域,请选择 us-west1。
  6. 将用途设置为区域级代管式代理。
  7. 对于 IP 地址范围,输入 10.129.0.0/23。
  8. 点击添加。

gcloud

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

gcloud compute networks subnets create proxy-only-subnet \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=us-west1 \
    --network=lb-network \
    --range=10.129.0.0/23

Terraform

创建代理专用子网:

# Shared VPC network - proxy-only subnet
resource "google_compute_subnetwork" "proxy_only_subnet" {
  name          = "proxy-only-subnet"
  provider      = google-beta
  project       = "my-host-project-id"
  region        = "us-west1"
  ip_cidr_range = "10.129.0.0/23"
  role          = "ACTIVE"
  purpose       = "REGIONAL_MANAGED_PROXY"
  network       = google_compute_network.lb_network.id
}

向服务项目管理员授予对后端子网的访问权限

服务项目管理员需要 lb-frontend-and-backend-subnet 子网的访问权限,以便他们可以预配负载均衡器的后端。

共享 VPC 管理员必须向服务项目管理员(或者部署使用该子网的资源和后端的开发者)授予后端子网的访问权限。如需查看相关说明,请参阅有权访问部分子网的服务项目管理员。

在宿主项目中配置防火墙规则

此示例使用以下防火墙规则:
  • fw-allow-health-check。入站流量规则,适用于正在进行负载均衡的实例,允许来自 Google Cloud健康检查系统(130.211.0.0/22 和 35.191.0.0/16)的所有 TCP 流量。此示例使用目标标记 load-balanced-backend 来标识该规则应该应用于的实例。
  • fw-allow-proxies。适用于负载均衡实例的入站流量规则,该规则允许从负载均衡器的代管式代理发送到端口 80、443 和 8080 的 TCP 流量。此示例使用目标标记 load-balanced-backend 来标识它应该应用到的实例。
  • fw-allow-ssh。适用于负载均衡实例的入站流量规则,该规则允许从任何地址到 TCP 端口 22 的传入 SSH 连接。您可以为此规则选择限制性更高的来源 IP 范围。例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 范围。此示例使用目标标记 allow-ssh 来标识该防火墙规则应该应用于的虚拟机 (VM)。
如果不使用上述防火墙规则,则默认拒绝入站流量规则会阻止传入后端实例的流量。

本部分中的所有步骤都必须在宿主项目中执行。

控制台

  1. 在 Google Cloud 控制台中,前往防火墙政策页面。

    前往“防火墙政策”

  2. 点击创建防火墙规则,以创建允许 Google Cloud 健康检查的规则:
    • 名称:fw-allow-health-check
    • 网络:lb-network
    • 流量方向:入站
    • 匹配时执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记:load-balanced-backend
    • 来源过滤条件:IPv4 范围
    • 来源 IPv4 范围:130.211.0.0/22 和 35.191.0.0/16
    • 协议和端口:
      • 选择指定的协议和端口。
      • 勾选 TCP,然后输入 80 作为端口号。
      • 最佳实践是将此规则限制为仅使用与健康检查所使用的协议和端口匹配的协议和端口。如果您将 tcp:80 用于协议和端口,则 Google Cloud 可以使用 HTTP 通过端口 80 联系您的虚拟机,但无法使用 HTTPS 通过端口 443 联系这些虚拟机。

  3. 点击创建。
  4. 点击创建防火墙规则,以创建允许 Google Cloud 健康检查的规则:
    • 名称:fw-allow-proxies
    • 网络:lb-network
    • 流量方向:入站
    • 匹配时执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记:load-balanced-backend
    • 来源过滤条件:IPv4 范围
    • 来源 IPv4 范围:10.129.0.0/23
    • 协议和端口:
      • 选择指定的协议和端口。
      • 勾选 TCP,然后输入 80, 443, 8080 作为端口号。
  5. 点击创建。
  6. 点击创建防火墙规则,以创建允许 Google Cloud 健康检查的规则:
    • 名称:fw-allow-ssh
    • 网络:lb-network
    • 流量方向:入站
    • 匹配时执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记:allow-ssh
    • 来源过滤条件:IPv4 范围
    • 来源 IPv4 范围:0.0.0.0/0
    • 协议和端口:
      • 选择指定的协议和端口。
      • 勾选 TCP,然后输入 22 作为端口号。
  7. 点击创建。

gcloud

  1. 创建 fw-allow-health-check 防火墙规则以允许Google Cloud 健康检查。本示例允许来自健康检查探测工具的所有 TCP 流量。但是,您可以根据自己的需求配置一组较小范围的端口。

    gcloud compute firewall-rules create fw-allow-health-check \
       --network=lb-network \
       --action=allow \
       --direction=ingress \
       --source-ranges=130.211.0.0/22,35.191.0.0/16 \
       --target-tags=load-balanced-backend \
       --rules=tcp
    
  2. 创建 fw-allow-proxies 防火墙规则以允许来自 Envoy 代理专用子网的流量到达您的后端。

    gcloud compute firewall-rules create fw-allow-proxies \
       --network=lb-network \
       --action=allow \
       --direction=ingress \
       --source-ranges=10.129.0.0/23 \
       --target-tags=load-balanced-backend \
       --rules=tcp:80,tcp:443,tcp:8080
    

  3. 创建 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
    

Terraform

  1. 创建防火墙规则以允许 Google Cloud 健康检查。

    resource "google_compute_firewall" "fw_allow_health_check" {
      name          = "fw-allow-health-check"
      provider      = google-beta
      project       = "my-host-project-id"
      direction     = "INGRESS"
      network       = google_compute_network.lb_network.id
      source_ranges = ["130.211.0.0/22", "35.191.0.0/16"]
      allow {
        protocol = "tcp"
      }
      target_tags = ["load-balanced-backend"]
    }

  2. 创建防火墙规则以允许来自 Envoy 代理专用子网的流量到达您的后端。

    resource "google_compute_firewall" "fw_allow_proxies" {
      name          = "fw-allow-proxies"
      provider      = google-beta
      project       = "my-host-project-id"
      direction     = "INGRESS"
      network       = google_compute_network.lb_network.id
      source_ranges = ["10.129.0.0/23"]
      allow {
        protocol = "tcp"
        ports    = ["80", "443", "8080"]
      }
      target_tags = ["load-balanced-backend"]
    }

  3. 创建防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。

    resource "google_compute_firewall" "fw_allow_ssh" {
      name          = "fw-allow-ssh"
      provider      = google-beta
      project       = "my-host-project-id"
      direction     = "INGRESS"
      network       = google_compute_network.lb_network.id
      source_ranges = ["0.0.0.0/0"]
      allow {
        protocol = "tcp"
        ports    = ["22"]
      }
      target_tags = ["allow-ssh"]
    }

在宿主项目中设置共享 VPC

此步骤涉及启用共享 VPC 宿主项目、共享宿主项目的子网,并将服务项目关联到宿主项目,以便服务项目可以使用共享 VPC 网络。如需在宿主项目中设置共享 VPC,请参阅以下页面:

这些说明的其余部分假定您已设置共享 VPC。这包括为您的组织设置 IAM 政策,以及指定宿主项目和服务项目。

在设置共享 VPC 并启用宿主项目和服务项目之前,请勿继续操作。

完成此前提条件部分中定义的步骤后,您可以采用以下任意一项设置:

在服务项目中配置负载均衡器

此示例会创建一个内部应用负载均衡器,其中所有负载均衡组件(转发规则、目标代理、网址映射和后端服务)和后端都在服务项目中创建。

内部应用负载均衡器的网络资源(例如代理专用子网和后端实例的子网)是在宿主项目中创建的。后端实例的防火墙规则也是在宿主项目中创建的。

图 1. 共享 VPC 中的内部应用负载均衡器
图 1. 共享 VPC 中的内部应用负载均衡器

本部分介绍如何设置负载均衡器和后端。这些步骤应由服务项目管理员(或在服务项目中操作的开发者)执行,无需宿主项目管理员参与。本部分中的步骤与设置内部应用负载均衡器的标准步骤大致类似。

此页面上的示例明确设置内部应用负载均衡器转发规则的预留内部 IP 地址,而不是允许分配临时内部 IP 地址。我们建议的最佳实践是,为转发规则预留 IP 地址。

创建托管式实例组后端

本部分介绍如何创建模板和托管式实例组。托管式实例组提供运行示例内部应用负载均衡器的后端服务器的虚拟机实例。来自客户端的流量在经过负载均衡处理后传送到这些后端服务器。出于演示目的,后端会传送其自己的主机名。

控制台

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

    转到“实例模板”

    1. 点击创建实例模板。
    2. 对于名称,输入 l7-ilb-backend-template。
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 12 (bookworm)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get。如果您需要更改启动磁盘,请点击更改。
      1. 在操作系统部分,选择 Debian。
      2. 在版本部分,选择一个可用的 Debian 映像,例如 Debian GNU/Linux 12 (bookworm)。
      3. 点击选择。
    4. 点击高级选项,然后点击网络。
    5. 输入以下网络标记:allow-ssh,load-balanced-backend。
    6. 在网络接口部分,选择与我共享的网络(通过宿主项目:HOST_PROJECT_ID)。
    7. 从 lb-network 网络中选择 lb-frontend-and-backend-subnet 子网。
    8. 点击管理。对于管理,将以下脚本插入到启动脚本字段中。
       #! /bin/bash
       apt-get update
       apt-get install apache2 -y
       a2ensite default-ssl
       a2enmod ssl
       vm_hostname="$(curl -H "Metadata-Flavor:Google" 
      http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" |
      tee /var/www/html/index.html systemctl restart apache2
    9. 点击创建。
  2. 创建托管式实例组。在 Google Cloud 控制台中,前往实例群组页面。

    进入“实例组”

    1. 点击创建实例组。
    2. 选择新的托管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG。
    3. 对于名称,输入 l7-ilb-backend-example。
    4. 对于位置,选择单个可用区。
    5. 对于区域,请选择 us-west1。
    6. 对于可用区,请选择 us-west1-a。
    7. 对于实例模板,请选择 l7-ilb-backend-template。
    8. 指定要在组中创建的实例数。

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

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

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

    9. 点击创建。

gcloud

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

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

    gcloud compute instance-templates create l7-ilb-backend-template \
    --region=us-west1 \
    --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
    --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
    --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://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2' \
    --project=SERVICE_PROJECT_ID
    
  2. 使用 gcloud compute instance-groups managed create 命令在相应可用区中创建一个托管式实例组。

    gcloud compute instance-groups managed create l7-ilb-backend-example \
        --zone=us-west1-a \
        --size=2 \
        --template=l7-ilb-backend-template \
        --project=SERVICE_PROJECT_ID
    

Terraform

  1. 创建虚拟机实例模板。

    # Instance template
    resource "google_compute_instance_template" "default" {
      name     = "l7-ilb-backend-template"
      provider = google-beta
      project  = "my-service-project-id"
      region   = "us-west1"
      # For machine type, using small. For more options check https://cloud.google.com/compute/docs/machine-types
      machine_type = "e2-small"
      tags         = ["allow-ssh", "load-balanced-backend"]
      network_interface {
        network    = google_compute_network.lb_network.id
        subnetwork = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
        access_config {
          # add external ip to fetch packages like apache2, ssl
        }
      }
      disk {
        source_image = "debian-cloud/debian-12"
        auto_delete  = true
        boot         = true
      }
    
      # install apache2 and serve a simple web page
      metadata = {
        startup-script = <<EOF
        #! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo a2enmod ssl
        vm_hostname="$(curl -H "Metadata-Flavor:Google" \
        http://metadata.google.internal/computeMetadata/v1/instance/name)"
        sudo echo "Page served from: $vm_hostname" | \
        tee /var/www/html/index.html
        sudo systemctl restart apache2
        EOF
      }
    }
  2. 创建托管式实例组。

    对于 HTTP:

    # MIG
    resource "google_compute_instance_group_manager" "default" {
      name               = "l7-ilb-backend-example"
      provider           = google-beta
      project            = "my-service-project-id"
      zone               = "us-west1-a"
      base_instance_name = "vm"
      target_size        = 2
      version {
        instance_template = google_compute_instance_template.default.id
        name              = "primary"
      }
      named_port {
        name = "http"
        port = 80
      }
    }

    对于 HTTPS:

    # MIG
    resource "google_compute_instance_group_manager" "default" {
      name               = "l7-ilb-backend-example"
      provider           = google-beta
      project            = "my-service-project-id"
      zone               = "us-west1-a"
      base_instance_name = "vm"
      target_size        = 2
      version {
        instance_template = google_compute_instance_template.default.id
        name              = "primary"
      }
      named_port {
        name = "https"
        port = 443
      }
    }

配置负载均衡器

本部分介绍如何创建内部应用负载均衡器资源:

  • HTTP 健康检查
  • 将托管式实例组用作后端的后端服务
  • 网址映射
  • SSL 证书(仅 HTTPS 必须提供)
  • 目标代理
  • 转发规则

代理可用性

根据使用同一共享 VPC 网络的服务项目数量,较之每个 Google Cloud 项目托管自己的网络所在的网络部署模型,您可能会更快地达到配额或限制。

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

  • 等待容量问题的解决。
  • 请与您的 Google Cloud 销售团队联系以提高这些限额。

控制台

将上下文切换到服务项目

  1. 在 Google Cloud 控制台中,转信息中心页面。

    转到信息中心

  2. 点击页面顶部的请选择:列表。在出现的请选择:窗口中,选择您想要在其中创建负载均衡器的服务项目。

选择负载均衡器类型

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

    转到“负载均衡”

  2. 点击创建负载均衡器。
  3. 在负载均衡器的类型字段中,选择应用负载均衡器 (HTTP/HTTPS),然后点击下一步。
  4. 在公共或内部字段中,选择内部,然后点击下一步。
  5. 在跨区域或单区域部署字段中,选择最适合区域级工作负载,然后点击下一步。
  6. 点击配置。

基本配置

  1. 对于负载均衡器的名称,请输入 l7-ilb-shared-vpc。
  2. 对于区域,请选择 us-west1。
  3. 对于网络,选择 lb-network(来自项目:HOST_PROJECT_ID)。

    如果您看到共享 VPC 网络中需要代理专用子网警告,请确认宿主项目管理员已在 lb-network 共享 VPC 网络中的 us-west1 区域创建 proxy-only-subnet。即使您无权查看此页面上的代理专用子网,负载均衡器创建也会成功。

  4. 不关闭窗口继续操作。

配置后端

  1. 点击后端配置。
  2. 在创建或选择后端服务菜单中,选择创建后端服务。
  3. 将后端服务的名称设置为 l7-ilb-backend-service。
  4. 将后端类型设置为实例组。
  5. 在健康检查列表中,选择创建健康检查,然后输入以下信息:
    1. 名称:l7-ilb-basic-check
    2. 协议:HTTP
    3. 端口:80
  6. 点击创建。
  7. 在新后端部分:

    1. 将实例组设置为 l7-ilb-backend-example。
    2. 将端口号设置为 80。
    3. 将均衡模式设置为利用率。
    4. 点击完成。
  8. 点击创建。

配置路由规则

  • 点击路由规则。确保 l7-ilb-backend-service 是任何不匹配的主机和任何不匹配的路径的唯一后端服务。

如需了解流量管理,请参阅设置流量管理。

配置前端

对于 HTTP:

  1. 点击前端配置。
  2. 将名称设置为 l7-ilb-forwarding-rule。
  3. 将协议设置为 HTTP。
  4. 将子网设置为 lb-frontend-and-backend-subnet。 请勿为前端选择代理专用子网,即使它是列表中的选项也是如此。
  5. 将端口设置为 80。
  6. 点击 IP 地址菜单,然后点击创建 IP 地址。
  7. 在预留静态内部 IP 地址面板中,提供以下详细信息:
    1. 对于名称,请输入 ip-address-shared-vpc。
    2. 对于静态 IP 地址,点击让我选择。对于自定义 IP 地址,输入 10.1.2.99。
    3. (可选)如果要与不同前端共享此 IP 地址,请将用途设置为共享。
  8. 点击完成。

对于 HTTPS:

如果您在客户端和负载均衡器之间使用 HTTPS,则需要一个或多个 SSL 证书资源来配置代理。如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。内部应用负载均衡器目前不支持由 Google 管理的证书。

  1. 点击前端配置。
  2. 在名称字段中,输入 l7-ilb-forwarding-rule。
  3. 在协议字段中,选择 HTTPS (includes HTTP/2)。
  4. 将子网设置为 lb-frontend-and-backend-subnet。 请勿为前端选择代理专用子网,即使它是列表中的选项也是如此。
  5. 确保将端口设置为 443,以允许 HTTPS 流量。
  6. 点击 IP 地址菜单,然后点击创建 IP 地址。
  7. 在预留静态内部 IP 地址面板中,提供以下详细信息:
    1. 对于名称,请输入 ip-address-shared-vpc。
    2. 对于静态 IP 地址,点击让我选择。对于自定义 IP 地址,输入 10.1.2.99。
    3. (可选)如果要与不同前端共享此 IP 地址,请将用途设置为共享。
  8. 点击证书列表。
    1. 如果您已经拥有要用作主要 SSL 证书的自行管理的 SSL 证书资源,请从菜单中选择该证书。
    2. 否则,请选择创建新证书。
      1. 填写名称 l7-ilb-cert。
      2. 在相应字段中上传您的 PEM 格式的文件:
        • 公钥证书
        • 证书链
        • 私钥
      3. 点击创建。
  9. 如需添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
    1. 点击添加证书。
    2. 从证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
  10. 点击完成。

检查并最终确定配置

  • 点击创建。

gcloud

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

    gcloud compute health-checks create http l7-ilb-basic-check \
       --region=us-west1 \
       --use-serving-port \
       --project=SERVICE_PROJECT_ID
    
  2. 使用 gcloud compute backend-services create 命令定义后端服务。

    gcloud compute backend-services create l7-ilb-backend-service \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=HTTP \
      --health-checks=l7-ilb-basic-check \
      --health-checks-region=us-west1 \
      --region=us-west1 \
      --project=SERVICE_PROJECT_ID
    
  3. 使用 gcloud compute backend-services add-backend 命令将后端添加到后端服务。

    gcloud compute backend-services add-backend l7-ilb-backend-service \
      --balancing-mode=UTILIZATION \
      --instance-group=l7-ilb-backend-example \
      --instance-group-zone=us-west1-a \
      --region=us-west1 \
      --project=SERVICE_PROJECT_ID
    
  4. 使用 gcloud compute url-maps create 命令创建网址映射。

    gcloud compute url-maps create l7-ilb-map \
      --default-service=l7-ilb-backend-service \
      --region=us-west1 \
      --project=SERVICE_PROJECT_ID
    
  5. 创建目标代理。

    对于 HTTP:

    对于内部 HTTP 负载均衡器,使用 gcloud compute target-http-proxies create 命令创建目标代理。

    gcloud compute target-http-proxies create l7-ilb-proxy \
      --url-map=l7-ilb-map \
      --url-map-region=us-west1 \
      --region=us-west1 \
      --project=SERVICE_PROJECT_ID
    

    对于 HTTPS:

    如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。内部应用负载均衡器目前不支持由 Google 管理的证书。

    将文件路径分配给变量名称。

    export LB_CERT=path to PEM-formatted file
    
    export LB_PRIVATE_KEY=path to PEM-formatted file
    

    使用 gcloud compute ssl-certificates create 命令创建区域 SSL 证书。

    gcloud compute ssl-certificates create l7-ilb-cert \
      --certificate=$LB_CERT \
      --private-key=$LB_PRIVATE_KEY \
      --region=us-west1
    

    使用区域 SSL 证书通过 gcloud compute target-https-proxies create 命令创建目标代理。

    gcloud compute target-https-proxies create l7-ilb-proxy \
      --url-map=l7-ilb-map \
      --region=us-west1 \
      --ssl-certificates=l7-ilb-cert \
      --project=SERVICE_PROJECT_ID
    
  6. 创建转发规则。

    对于自定义网络,必须在转发规则中引用子网。

    对于转发规则的 IP 地址,请使用 lb-frontend-and-backend-subnet。如果您尝试使用代理专用子网,则无法创建转发规则。

    对于 HTTP:

    使用带有正确标志的 gcloud compute forwarding-rules create 命令。

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
      --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
      --address=IP_ADDRESS_NAME \
      --ports=80 \
      --region=us-west1 \
      --target-http-proxy=l7-ilb-proxy \
      --target-http-proxy-region=us-west1 \
      --project=SERVICE_PROJECT_ID
    

    对于 HTTPS:

    使用带有正确标志的 gcloud compute forwarding-rules create 命令。

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
      --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
      --address=IP_ADDRESS_NAME \
      --ports=443 \
      --region=us-west1 \
      --target-https-proxy=l7-ilb-proxy \
      --target-https-proxy-region=us-west1 \
      --project=SERVICE_PROJECT_ID
    

Terraform

  1. 定义 HTTP 健康检查。

    对于 HTTP:

    # health check
    resource "google_compute_health_check" "default" {
      name               = "l7-ilb-basic-check"
      provider           = google-beta
      project            = "my-service-project-id"
      timeout_sec        = 1
      check_interval_sec = 1
      http_health_check {
        port = "80"
      }
    }

    对于 HTTPS:

    # health check
    resource "google_compute_health_check" "default" {
      name               = "l7-ilb-basic-check"
      provider           = google-beta
      project            = "my-service-project-id"
      timeout_sec        = 1
      check_interval_sec = 1
      https_health_check {
        port = "443"
      }
    }

  2. 定义后端服务。

    # backend service
    resource "google_compute_region_backend_service" "default" {
      name                  = "l7-ilb-backend-service"
      provider              = google-beta
      project               = "my-service-project-id"
      region                = "us-west1"
      protocol              = "HTTP"
      load_balancing_scheme = "INTERNAL_MANAGED"
      timeout_sec           = 10
      health_checks         = [google_compute_health_check.default.id]
      backend {
        group           = google_compute_instance_group_manager.default.instance_group
        balancing_mode  = "UTILIZATION"
        capacity_scaler = 1.0
      }
    }
  3. 创建网址映射。

    # URL map
    resource "google_compute_region_url_map" "default" {
      name            = "l7-ilb-map"
      provider        = google-beta
      project         = "my-service-project-id"
      region          = "us-west1"
      default_service = google_compute_region_backend_service.default.id
    }
  4. 创建目标代理。

    对于 HTTP:

    # HTTP target proxy
    resource "google_compute_region_target_http_proxy" "default" {
      name     = "l7-ilb-proxy"
      provider = google-beta
      project  = "my-service-project-id"
      region   = "us-west1"
      url_map  = google_compute_region_url_map.default.id
    }

    对于 HTTPS:创建区域 SSL 证书

    如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。内部应用负载均衡器目前不支持由 Google 管理的证书。

    # Use self-signed SSL certificate
    resource "google_compute_region_ssl_certificate" "default" {
      name        = "l7-ilb-cert"
      provider    = google-beta
      project     = "my-service-project-id"
      region      = "us-west1"
      private_key = file("sample-private.key") # path to PEM-formatted file
      certificate = file("sample-server.cert") # path to PEM-formatted file
    }

    使用地区 SSL 证书创建目标代理

    # HTTPS target proxy
    resource "google_compute_region_target_https_proxy" "default" {
      name             = "l7-ilb-proxy"
      provider         = google-beta
      project          = "my-service-project-id"
      region           = "us-west1"
      url_map          = google_compute_region_url_map.default.id
      ssl_certificates = [google_compute_region_ssl_certificate.default.id]
    }
  5. 创建转发规则。

    对于自定义网络,必须在转发规则中引用子网。

    对于 HTTP:

    # Forwarding rule
    resource "google_compute_forwarding_rule" "default" {
      name                  = "l7-ilb-forwarding-rule"
      provider              = google-beta
      project               = "my-service-project-id"
      region                = "us-west1"
      ip_protocol           = "TCP"
      port_range            = "80"
      load_balancing_scheme = "INTERNAL_MANAGED"
      target                = google_compute_region_target_http_proxy.default.id
      network               = google_compute_network.lb_network.id
      subnetwork            = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
      network_tier          = "PREMIUM"
      depends_on            = [google_compute_subnetwork.lb_frontend_and_backend_subnet]
    }

    对于 HTTPS:

    # Forwarding rule
    resource "google_compute_forwarding_rule" "default" {
      name                  = "l7-ilb-forwarding-rule"
      provider              = google-beta
      project               = "my-service-project-id"
      region                = "us-west1"
      ip_protocol           = "TCP"
      port_range            = "443"
      load_balancing_scheme = "INTERNAL_MANAGED"
      target                = google_compute_region_target_https_proxy.default.id
      network               = google_compute_network.lb_network.id
      subnetwork            = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
      network_tier          = "PREMIUM"
      depends_on            = [google_compute_subnetwork.lb_frontend_and_backend_subnet]
    }

测试负载均衡器

如需测试负载均衡器,请先创建一个示例客户端虚拟机。然后,与虚拟机建立 SSH 会话,并将来自此虚拟机的流量发送到负载均衡器。

创建测试虚拟机实例

客户端可位于宿主项目或任何连接的服务项目中。在此示例中,您将通过在服务项目中部署客户端虚拟机来测试负载均衡器是否正常运行。客户端必须使用同一共享 VPC 网络,而且与负载均衡器位于同一个区域。

控制台

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

    转到虚拟机实例

  2. 点击创建实例。

  3. 将名称设置为 client-vm。

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

  5. 点击高级选项,然后点击网络。

  6. 输入以下网络标记:allow-ssh,load-balanced-backend。

  7. 在网络接口部分,选择与我共享的网络(通过宿主项目:HOST_PROJECT_ID)。

  8. 从 lb-network 网络中选择 lb-frontend-and-backend-subnet 子网。

  9. 点击创建。

gcloud

创建测试虚拟机实例。

gcloud compute instances create client-vm \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
    --zone=us-west1-a \
    --tags=allow-ssh \
    --project=SERVICE_PROJECT_ID

Terraform

创建测试虚拟机实例。

resource "google_compute_instance" "vm_test" {
  name         = "client-vm"
  provider     = google-beta
  project      = "my-service-project-id"
  zone         = "us-west1-a"
  machine_type = "e2-small"
  tags         = ["allow-ssh"]
  network_interface {
    network    = google_compute_network.lb_network.id
    subnetwork = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
  }
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-12"
    }
  }
  lifecycle {
    ignore_changes = [
      metadata["ssh-keys"]
    ]
  }
}

将流量发送到负载均衡器

使用 SSH 连接到您刚刚创建的实例,通过测试确定可以通过内部应用负载均衡器的转发规则 IP 地址访问后端的 HTTP(S) 服务,并且流量正在后端实例之间进行负载均衡。

  1. 通过 SSH 连接到客户端实例。

    gcloud compute ssh client-vm \
       --zone=us-west1-a
    
  2. 验证 IP 地址提供其主机名。将 LB_IP_ADDRESS 替换为负载均衡器的 IP 地址。

    curl LB_IP_ADDRESS
    

    对于 HTTPS 测试,请将 curl 替换为以下内容:

    curl -k -s 'https://LB_IP_ADDRESS:443'
    

    -k 标志会导致 curl 跳过证书验证。

配置具有跨项目后端服务的负载均衡器

本页面上的上一个示例展示了如何设置共享 VPC 部署,其中所有负载均衡器组件及其后端都在服务项目中创建。

借助内部应用负载均衡器,您还可以配置共享 VPC 部署,其中,一个宿主项目或服务项目中的网址映射可引用位于共享 VPC 环境中的多个服务项目的后端服务(和后端)。这称为跨项目服务引用。

您可以参考本部分中的步骤来配置此处列出的任何受支持组合:

  • 宿主项目中的转发规则、目标代理和网址映射,以及服务项目中的后端服务
  • 服务项目中的转发规则、目标代理和网址映射,以及另一个服务项目中的后端服务

跨项目服务引用可用于实例组、无服务器 NEG 或任何其他受支持的后端类型。如果您使用的是无服务器 NEG,则需要在您打算创建负载均衡器的前端的 VPC 网络中创建虚拟机。如需查看示例,请参阅“使用 Cloud Run 设置内部应用负载均衡器”中的在特定子网中创建虚拟机实例。

设置要求

此示例在两个不同的服务项目中配置示例负载均衡器及其前端和后端。

如果尚未执行此操作,您必须完成设置共享 VPC 的所有必要步骤,并配置此示例所需的网络、子网和防火墙规则。如需了解相关说明,请参阅以下内容:

图 2. 不同服务项目中的负载均衡器前端和后端
图 2. 不同服务项目中的负载均衡器前端和后端

在服务项目 B 中创建后端和后端服务

本部分中的所有步骤都必须在服务项目 B 中执行。

控制台

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

    转到“实例模板”

    1. 点击创建实例模板。
    2. 输入实例模板的名称:cross-ref-backend-template。
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 12 (bookworm)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get。如果您需要更改启动磁盘,请点击更改。
      1. 在操作系统部分,选择 Debian。
      2. 在版本部分,选择一个可用的 Debian 映像,例如 Debian GNU/Linux 12 (bookworm)。
      3. 点击选择。
    4. 点击高级选项,然后点击网络。
    5. 输入以下网络标记:allow-ssh,load-balanced-backend。
    6. 在网络接口部分,选择与我共享的网络(通过宿主项目:HOST_PROJECT_ID)。
    7. 从 lb-network 网络中选择 lb-frontend-and-backend-subnet 子网。
    8. 点击管理。对于管理,将以下脚本插入到启动脚本字段中。
      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" 
      http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" |
      tee /var/www/html/index.html systemctl restart apache2
    9. 点击创建。
  2. 创建托管式实例组。在 Google Cloud 控制台中,前往实例群组页面。

    进入“实例组”

    1. 点击创建实例组。
    2. 选择新的托管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG。
    3. 输入实例组的名称:cross-ref-ig-backend。
    4. 对于位置,选择单个可用区。
    5. 对于区域,请选择 us-west1。
    6. 对于可用区,请选择 us-west1-a。
    7. 对于实例模板,请选择 cross-ref-backend-template。
    8. 指定要在组中创建的实例数。

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

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

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

    9. 点击创建。

  3. 创建区域后端服务。在执行此步骤的过程中,我们还将创建健康检查,并将后端添加到后端服务。在 Google Cloud 控制台中,前往后端页面。

    前往“后端”

    1. 点击创建区域级后端服务。
    2. 输入后端服务的名称:cross-ref-backend-service。
    3. 对于区域,选择 us-west1。
    4. 对于负载均衡器类型,选择区域内部应用负载均衡器 (INTERNAL_MANAGED)。
    5. 将后端类型设置为实例组。
    6. 在健康检查列表中,点击创建健康检查,然后输入以下信息:
      1. 名称:cross-ref-http-health-check
      2. 协议:HTTP
      3. 端口:80
    7. 点击创建。
    8. 在后端部分中,将网络设置为 lb-network。
    9. 点击添加后端,然后设置以下字段:
      1. 将实例组设置为 cross-ref-ig-backend。
      2. 输入端口号:80。
      3. 将平衡模式设置为利用率。
      4. 点击完成。
    10. 点击继续。
    11. 可选:在添加权限部分,输入其他项目中的 Load Balancer Admin 的 IAM 主账号(通常是电子邮件地址),以便他们能够为自己项目中的负载均衡器使用此后端服务。如果没有添加此权限,则无法进行跨项目服务引用。

      如果您无权为此项目中的后端服务设置访问权限控制政策,您现在还是可以创建后端服务,之后可由一个授权用户来执行此步骤(如向 Load Balancer Admin 授予使用后端服务的权限部分所述)。本部分还介绍了如何授予对此项目中全部后端服务的访问权限,这样就避免了每次创建新的后端服务时都需要单独授予访问权限这一繁琐步骤。

    12. 点击创建。

gcloud

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

    gcloud compute instance-templates create BACKEND_IG_TEMPLATE \
        --region=us-west1 \
        --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
        --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
        --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://metadata.google.internal/computeMetadata/v1/instance/name)"
        echo "Page served from: $vm_hostname" | \
        tee /var/www/html/index.html
        systemctl restart apache2' \
        --project=SERVICE_PROJECT_B_ID
    

    请替换以下内容:

    • BACKEND_IG_TEMPLATE:实例组模板的名称。
    • SERVICE_PROJECT_B_ID:在其中创建了负载均衡器的后端和后端服务的服务项目 B 的项目 ID。
    • HOST_PROJECT_ID:共享 VPC 宿主项目的项目 ID。
  2. 使用 gcloud compute instance-groups managed create 命令在相应可用区中创建一个托管式实例组。

    gcloud compute instance-groups managed create BACKEND_MIG \
        --zone=us-west1-a \
        --size=2 \
        --template=BACKEND_IG_TEMPLATE \
        --project=SERVICE_PROJECT_B_ID
    

    请替换以下内容:

    • BACKEND_MIG:后端实例组的名称。
  3. 使用 gcloud compute health-checks create http 命令定义 HTTP 健康检查。

    gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
      --region=us-west1 \
      --use-serving-port \
      --project=SERVICE_PROJECT_B_ID
    

    请替换以下内容:

    • HTTP_HEALTH_CHECK_NAME:HTTP 健康检查的名称。
  4. 使用 gcloud compute backend-services create 命令定义后端服务。

    gcloud compute backend-services create BACKEND_SERVICE_NAME \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=HTTP \
      --health-checks=HTTP_HEALTH_CHECK_NAME \
      --health-checks-region=us-west1 \
      --region=us-west1 \
      --project=SERVICE_PROJECT_B_ID
    

    请替换以下内容:

    • BACKEND_SERVICE_NAME:在服务项目 B 中创建的后端服务的名称。
  5. 使用 gcloud compute backend-services add-backend 命令将后端添加到后端服务。

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --balancing-mode=UTILIZATION \
      --instance-group=BACKEND_MIG \
      --instance-group-zone=us-west1-a \
      --region=us-west1 \
      --project=SERVICE_PROJECT_B_ID
    

Terraform

  1. 创建一个实例模板。

    # Instance template
    resource "google_compute_instance_template" "default" {
      name     = "l7-ilb-backend-template"
      provider = google-beta
      project  = "my-service-project-b-id"
      region   = "us-west1"
      # For machine type, using small. For more options check https://cloud.google.com/compute/docs/machine-types
      machine_type = "e2-small"
      tags         = ["allow-ssh", "load-balanced-backend"]
      network_interface {
        network    = google_compute_network.lb_network.id
        subnetwork = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
        access_config {
          # add external ip to fetch packages like apache2, ssl
        }
      }
      disk {
        source_image = "debian-cloud/debian-12"
        auto_delete  = true
        boot         = true
      }
    
      # install apache2 and serve a simple web page
      metadata = {
        startup-script = <<EOF
        #! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo a2enmod ssl
        vm_hostname="$(curl -H "Metadata-Flavor:Google" \
        http://metadata.google.internal/computeMetadata/v1/instance/name)"
        sudo echo "Page served from: $vm_hostname" | \
        tee /var/www/html/index.html
        sudo systemctl restart apache2
        EOF
      }
    }
  2. 创建托管式实例组。

    对于 HTTP

    # MIG
    resource "google_compute_instance_group_manager" "default" {
      name               = "l7-ilb-backend-example"
      provider           = google-beta
      project            = "my-service-project-b-id"
      zone               = "us-west1-a"
      base_instance_name = "vm"
      target_size        = 2
      version {
        instance_template = google_compute_instance_template.default.id
        name              = "primary"
      }
      named_port {
        name = "http"
        port = 80
      }
    }

    对于 HTTPS

    # MIG
    resource "google_compute_instance_group_manager" "default" {
      name               = "l7-ilb-backend-example"
      provider           = google-beta
      project            = "my-service-project-b-id"
      zone               = "us-west1-a"
      base_instance_name = "vm"
      target_size        = 2
      version {
        instance_template = google_compute_instance_template.default.id
        name              = "primary"
      }
      named_port {
        name = "https"
        port = 443
      }
    }
  3. 为后端创建健康检查。

    对于 HTTP

    # health check
    resource "google_compute_health_check" "default" {
      name               = "l7-ilb-basic-check"
      provider           = google-beta
      project            = "my-service-project-b-id"
      timeout_sec        = 1
      check_interval_sec = 1
      http_health_check {
        port = "80"
      }
    }

    对于 HTTPS

    # health check
    resource "google_compute_health_check" "default" {
      name               = "l7-ilb-basic-check"
      provider           = google-beta
      project            = "my-service-project-b-id"
      timeout_sec        = 1
      check_interval_sec = 1
      https_health_check {
        port = "443"
      }
    }
  4. 创建区域后端服务。

    # backend service
    resource "google_compute_region_backend_service" "default" {
      name                  = "l7-ilb-backend-service"
      provider              = google-beta
      project               = "my-service-project-b-id"
      region                = "us-west1"
      protocol              = "HTTP"
      load_balancing_scheme = "INTERNAL_MANAGED"
      timeout_sec           = 10
      health_checks         = [google_compute_health_check.default.id]
      backend {
        group           = google_compute_instance_group_manager.default.instance_group
        balancing_mode  = "UTILIZATION"
        capacity_scaler = 1.0
      }
    }

在服务项目 A 中创建负载均衡器前端和网址映射

本部分中的所有步骤都必须在服务项目 A 中执行。

控制台

选择负载均衡器类型

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

    转到“负载均衡”

  2. 点击创建负载均衡器。
  3. 在负载均衡器的类型字段中,选择应用负载均衡器 (HTTP/HTTPS),然后点击下一步。
  4. 在公共或内部字段中,选择内部,然后点击下一步。
  5. 在跨区域或单区域部署字段中,选择最适合区域级工作负载,然后点击下一步。
  6. 点击配置。

基本配置

  1. 输入负载均衡器的名称。
  2. 对于区域,请选择 us-west1。
  3. 对于网络,选择 lb-network(来自项目:HOST_PROJECT_NAME)。

    如果您看到共享 VPC 网络中需要代理专用子网警告,请确认宿主项目管理员已在 lb-network 共享 VPC 网络中的 us-west1 区域创建 proxy-only-subnet。即使您无权查看此页面上的代理专用子网,负载均衡器创建也会成功。

  4. 不关闭窗口继续操作。

配置后端

  1. 点击后端配置。
  2. 点击跨项目后端服务。
  3. 对于项目 ID,输入服务项目 B 的项目 ID。
  4. 从选择后端服务列表中,选择您要使用的服务项目 B 中的后端服务。对于此示例,输入 cross-ref-backend-service。
  5. 点击确定。

配置路由规则

  • 点击路由规则。确保 cross-ref-backend-service 是任何不匹配的主机和任何不匹配的路径的唯一后端服务。

如需了解流量管理,请参阅设置流量管理。

配置前端

为使跨项目服务引用正常工作,前端必须使用用于创建后端服务的共享 VPC 宿主项目中的同一网络 (lb-network)。

对于 HTTP:

  1. 点击前端配置。
  2. 输入转发规则的名称:cross-ref-http-forwarding-rule。
  3. 将协议设置为 HTTP。
  4. 将子网设置为 lb-frontend-and-backend-subnet。 请勿为前端选择代理专用子网,即使它是列表中的选项也是如此。
  5. 将端口设置为 80。
  6. 点击 IP 地址菜单,然后点击创建 IP 地址。
  7. 在预留静态内部 IP 地址面板中,提供以下详细信息:
    1. 对于名称,请输入 cross-ref-ip-address。
    2. 对于静态 IP 地址,点击让我选择。对于自定义 IP 地址,输入 10.1.2.98。
    3. (可选)如果要与不同前端共享此 IP 地址,请将用途设置为共享。
  8. 点击完成。

对于 HTTPS:

如果您在客户端和负载均衡器之间使用 HTTPS,则需要一个或多个 SSL 证书资源来配置代理。如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。内部应用负载均衡器目前不支持由 Google 管理的证书。

  1. 点击前端配置。
  2. 输入转发规则的名称:cross-ref-https-forwarding-rule。
  3. 在协议字段中,选择 HTTPS (includes HTTP/2)。
  4. 将子网设置为 lb-frontend-and-backend-subnet。 请勿为前端选择代理专用子网,即使它是列表中的选项也是如此。
  5. 确保将端口设置为 443,以允许 HTTPS 流量。
  6. 点击 IP 地址菜单,然后点击创建 IP 地址。
  7. 在预留静态内部 IP 地址面板中,提供以下详细信息:
    1. 对于名称,请输入 cross-ref-ip-address。
    2. 对于静态 IP 地址,点击让我选择。对于自定义 IP 地址,输入 10.1.2.98。
    3. (可选)如果要与不同前端共享此 IP 地址,请将用途设置为共享。
  8. 点击证书列表。
    1. 如果您已经拥有要用作主要 SSL 证书的自行管理的 SSL 证书资源,请从菜单中选择该证书。
    2. 否则,请选择创建新证书。
      1. 输入 SSL 证书的名称。
      2. 在相应字段中上传您的 PEM 格式的文件:
        • 公钥证书
        • 证书链
        • 私钥
      3. 点击创建。
  9. 如需添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
    1. 点击添加证书。
    2. 从证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
  10. 点击完成。

检查并最终确定配置

  • 点击创建。

测试负载均衡器

创建负载均衡器后,使用测试负载均衡器中所述的步骤来测试负载均衡器。

gcloud

  1. 可选:在创建包含交叉引用后端服务的负载均衡器之前,请先确定您要引用的后端服务是否可以使用网址映射进行引用:

    gcloud compute backend-services list-usable \
        --region=us-west1 \
        --project=SERVICE_PROJECT_B_ID
    
  2. 创建网址映射,并将默认服务设置为在服务项目 B 中创建的后端服务。

    gcloud compute url-maps create URL_MAP_NAME \
        --default-service=projects/SERVICE_PROJECT_B_ID/regions/us-west1/backendServices/BACKEND_SERVICE_NAME \
        --region=us-west1 \
        --project=SERVICE_PROJECT_A_ID
    

    请替换以下内容:

    • URL_MAP_NAME:网址映射的名称。
    • BACKEND_SERVICE_NAME:在服务项目 B 中创建的后端服务的名称。
    • SERVICE_PROJECT_B_ID:在其中创建了负载均衡器的后端和后端服务的服务项目 B 的项目 ID。
    • SERVICE_PROJECT_A_ID:在其中创建了负载均衡器前端的服务项目 A 的项目 ID。

    如果您没有服务项目 B 中后端服务的 compute.backendServices.use 权限,网址映射创建会失败。

  3. 创建目标代理。

    对于 HTTP:

    gcloud compute target-http-proxies create HTTP_TARGET_PROXY_NAME \
      --url-map=URL_MAP_NAME \
      --url-map-region=us-west1 \
      --region=us-west1 \
      --project=SERVICE_PROJECT_A_ID
    

    请替换以下内容:

    • HTTP_TARGET_PROXY_NAME:目标 HTTP 代理的名称。

    对于 HTTPS:

    使用 gcloud compute ssl-certificates create 命令创建区域 SSL 证书。

    gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
      --certificate=PATH_TO_CERTIFICATE \
      --private-key=PATH_TO_PRIVATE_KEY \
      --region=us-west1 \
      --project=SERVICE_PROJECT_A_ID
    

    请替换以下内容:

    • SSL_CERTIFICATE_NAME:SSL 证书资源的名称。
    • PATH_TO_CERTIFICATE:PEM 格式的本地 SSL 证书文件的路径。
    • PATH_TO_PRIVATE_KEY:PEM 格式的本地 SSL 证书私钥的路径。

    使用区域 SSL 证书通过 gcloud compute target-https-proxies create 命令创建目标代理。

    gcloud compute target-https-proxies create HTTPS_TARGET_PROXY_NAME \
      --url-map=URL_MAP_NAME \
      --region=us-west1 \
      --ssl-certificates=SSL_CERTIFICATE_NAME \
      --project=SERVICE_PROJECT_A_ID
    

    请替换以下内容:

    • HTTPS_TARGET_PROXY_NAME:目标 HTTPS 代理的名称。
  4. 创建转发规则。 为使跨项目服务引用正常工作,转发规则必须使用用于创建后端服务的共享 VPC 宿主项目中的同一网络 (lb-network)。

    对于 HTTP:

    gcloud compute forwarding-rules create HTTP_FORWARDING_RULE_NAME \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
      --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
      --address=IP_ADDRESS_CROSS_REF \
      --ports=80 \
      --region=us-west1 \
      --target-http-proxy=HTTP_TARGET_PROXY_NAME \
      --target-http-proxy-region=us-west1 \
      --project=SERVICE_PROJECT_A_ID
    

    请替换以下内容:

    • HTTP_FORWARDING_RULE_NAME:用于处理 HTTP 流量的转发规则的名称。

    对于 HTTPS:

    gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
      --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
      --address=IP_ADDRESS_CROSS_REF \
      --ports=443 \
      --region=us-west1 \
      --target-https-proxy=HTTPS_TARGET_PROXY_NAME \
      --target-https-proxy-region=us-west1 \
      --project=SERVICE_PROJECT_A_ID
    

    请替换以下内容:

    • HTTPS_FORWARDING_RULE_NAME:用于处理 HTTPS 流量的转发规则的名称。
  5. 如需测试负载均衡器,请使用测试负载均衡器中所述的步骤。

Terraform

  1. 创建网址映射。

    # URL map
    resource "google_compute_region_url_map" "default" {
      name            = "l7-ilb-map"
      provider        = google-beta
      project         = "my-service-project-a-id"
      region          = "us-west1"
      default_service = google_compute_region_backend_service.default.id
    }
  2. 创建目标代理。

    对于 HTTP

    # HTTP target proxy
    resource "google_compute_region_target_http_proxy" "default" {
      name     = "l7-ilb-proxy"
      provider = google-beta
      project  = "my-service-project-a-id"
      region   = "us-west1"
      url_map  = google_compute_region_url_map.default.id
    }

    对于 HTTPS

    创建区域性 SSL 证书

    # Use self-signed SSL certificate
    resource "google_compute_region_ssl_certificate" "default" {
      name        = "l7-ilb-cert"
      provider    = google-beta
      project     = "my-service-project-a-id"
      region      = "us-west1"
      private_key = file("sample-private.key") # path to PEM-formatted file
      certificate = file("sample-server.cert") # path to PEM-formatted file
    }

    使用地区 SSL 证书创建目标代理

    # HTTPS target proxy
    resource "google_compute_region_target_https_proxy" "default" {
      name             = "l7-ilb-proxy"
      provider         = google-beta
      project          = "my-service-project-a-id"
      region           = "us-west1"
      url_map          = google_compute_region_url_map.default.id
      ssl_certificates = [google_compute_region_ssl_certificate.default.id]
    }
  3. 创建转发规则。

    对于 HTTP

    # Forwarding rule
    resource "google_compute_forwarding_rule" "default" {
      name                  = "l7-ilb-forwarding-rule"
      provider              = google-beta
      project               = "my-service-project-a-id"
      region                = "us-west1"
      ip_protocol           = "TCP"
      port_range            = "80"
      load_balancing_scheme = "INTERNAL_MANAGED"
      target                = google_compute_region_target_http_proxy.default.id
      network               = google_compute_network.lb_network.id
      subnetwork            = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
      network_tier          = "PREMIUM"
      depends_on            = [google_compute_subnetwork.lb_frontend_and_backend_subnet]
    }

    对于 HTTPS

    # Forwarding rule
    resource "google_compute_forwarding_rule" "default" {
      name                  = "l7-ilb-forwarding-rule"
      provider              = google-beta
      project               = "my-service-project-a-id"
      region                = "us-west1"
      ip_protocol           = "TCP"
      port_range            = "443"
      load_balancing_scheme = "INTERNAL_MANAGED"
      target                = google_compute_region_target_https_proxy.default.id
      network               = google_compute_network.lb_network.id
      subnetwork            = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
      network_tier          = "PREMIUM"
      depends_on            = [google_compute_subnetwork.lb_frontend_and_backend_subnet]
    }
  4. 如需测试负载均衡器,请使用测试负载均衡器中所述的步骤。

向负载均衡器管理员授予使用后端服务的权限

如果您希望负载均衡器引用其他服务项目中的后端服务,则 Load Balancer Admin 必须具有 compute.backendServices.use 权限。如需授予此权限,您可以使用名为 Compute Load Balancer Services User (roles/compute.loadBalancerServiceUser) 的预定义 IAM 角色。此角色必须由服务项目管理员授予,可以在项目级层或个别后端服务级层应用。

如果您在创建后端服务时已在后端服务级层授予了所需的权限,则不需要执行此步骤。您可以跳过此部分,也可以继续阅读此部分以了解如何授予对项目中所有后端服务的访问权限,这样您就无需在每次创建新的后端服务时都授予访问权限。

在此示例中,服务项目 B 中的 Service Project Admin 必须运行以下任一命令,以向服务项目 A 中的 Load Balancer Admin 授予 compute.backendServices.use 权限。可以在项目级层(针对项目中的所有后端服务)授予该权限,也可以针对个别后端服务授予该权限。

控制台

项目级权限

请按照以下步骤授予对项目中所有后端服务的权限。

您需要拥有 compute.regionBackendServices.setIamPolicy 和 resourcemanager.projects.setIamPolicy 权限才能完成此步骤。

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  2. 选择您的项目。

  3. 点击授予访问权限。

  4. 在新的主账号字段中,输入主账号的电子邮件地址或其他标识符。

  5. 在选择角色列表中,选择 Compute Load Balancer Services User。

  6. 可选:为角色添加条件。

  7. 点击保存。

针对个别后端服务的资源级权限

请按照以下步骤授予对项目中个别后端服务的权限。

您需要拥有 compute.regionBackendServices.setIamPolicy 权限才能完成此步骤。

  1. 在 Google Cloud 控制台中,前往后端页面。

    前往“后端”

  2. 从后端列表中,选择要授予访问权限的后端服务,然后点击权限。

  3. 点击添加主账号。

  4. 在新的主账号字段中,输入主账号的电子邮件地址或其他标识符。

  5. 在选择角色列表中,选择 Compute Load Balancer Services User。

  6. 点击保存。

gcloud

项目级权限

请按照以下步骤授予对项目中所有后端服务的权限。

您需要拥有 compute.regionBackendServices.setIamPolicy 和 resourcemanager.projects.setIamPolicy 权限才能完成此步骤。

gcloud projects add-iam-policy-binding SERVICE_PROJECT_B_ID \
    --member="user:LOAD_BALANCER_ADMIN" \
    --role="roles/compute.loadBalancerServiceUser"

针对个别后端服务的资源级权限

在后端服务级层,服务项目管理员可以使用以下任一命令来授予 Compute Load Balancer Services User 角色 (roles/compute.loadBalancerServiceUser)。

您需要拥有 compute.regionBackendServices.setIamPolicy 权限才能完成此步骤。

gcloud projects add-iam-policy-binding SERVICE_PROJECT_B_ID \
    --member="user:LOAD_BALANCER_ADMIN" \
    --role="roles/compute.loadBalancerServiceUser" \
    --condition='expression=resource.name=="projects/SERVICE_PROJECT_B_ID/regions/us-west1/backend-services/BACKEND_SERVICE_NAME",title=Shared VPC condition'

或

gcloud compute backend-services add-iam-policy-binding BACKEND_SERVICE_NAME \
    --member="user:LOAD_BALANCER_ADMIN" \
    --role="roles/compute.loadBalancerServiceUser" \
    --project=SERVICE_PROJECT_B_ID \
    --region=us-west1

如需使用这些命令,请将 LOAD_BALANCER_ADMIN 替换为用户的主账号,例如 test-user@gmail.com。

通过使用条件并指定条件特性,您还可以配置 IAM 权限,使其仅应用于部分区域后端服务。

如需查看引用特定共享 VPC 后端服务的网址映射,请按以下步骤操作:

gcloud

如需查看引用区域级共享 VPC 后端服务的资源,请运行以下命令:

gcloud compute backend-services describe BACKEND_SERVICE_NAME \
    --region REGION

替换以下内容:

  • BACKEND_SERVICE_NAME:负载均衡器后端服务的名称
  • REGION:负载均衡器所在的区域

在命令输出中,查看 usedBy 字段,其中显示了引用后端服务的资源,如以下示例所示:

id: '123456789'
kind: compute#backendService
loadBalancingScheme: INTERNAL_MANAGED
...
usedBy:
-   reference: https://www.googleapis.com/compute/v1/projects/my-project/region/us-central1/urlMaps/my-url-map

后续步骤