设置具有虚拟机实例组后端的区域外部 HTTP(S) 负载均衡器

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本文档介绍了如何为 Compute Engine 虚拟机上运行的服务配置区域级外部 HTTP(S) 负载均衡器。

由于区域级外部 HTTP(S) 负载均衡器允许您在特定区域中创建负载均衡器,因此它们通常用于具有管辖区合规性要求的工作负载。需要访问标准网络层级出站流量的工作负载是区域级外部 HTTP(S) 负载均衡器的另一常见用例,因为区域级外部 HTTP(S) 负载均衡器支持标准网络服务层级。

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

权限

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

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

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

设置概览

您可以按照以下总体配置流程所述配置区域级外部 HTTP(S) 负载均衡器。以下带编号的步骤对应于该图中的标号。

区域级外部 HTTP(S) 负载均衡器编号组件(点击可放大)
区域级外部 HTTP(S) 负载均衡器编号组件(点击可放大)

如上图所示,该示例在 us-west1 区域的 VPC 网络中创建了一个区域级外部 HTTP(S) 负载均衡器,其中包含一项后端服务和两个后端实例组。

上图显示了以下信息:

  1. 包含两个子网的 VPC 网络:

    1. 一个子网用于后端(实例组)。该子网的主要 IP 地址范围为 10.1.2.0/24

    2. 一个子网是 us-west1 区域中的代理专用子网。您必须在其中使用区域级外部 HTTP(S) 负载均衡器的 VPC 网络的每个区域中创建一个代理专用子网。该区域的代理专用子网会在该区域的所有区域级负载均衡器之间共享。对于从负载均衡器发送到服务后端的数据包,系统会从该代理专用子网分配其来源地址。在本示例中,该区域中代理专用子网的主要 IP 地址范围为 10.129.0.0/23,这是建议的子网大小。如需了解详情,请参阅代理专用子网

  2. 允许在您的网络中使用代理专用子网流量的防火墙规则。这意味着添加一条规则以允许来自 10.129.0.0/23(在此示例中为代理专用子网的范围)的 TCP 端口 804438080 流量。用于健康检查探测的另一个防火墙规则。

  3. 后端实例。

  4. 实例组:

    1. Compute Engine 虚拟机部署所用的托管式实例组或非托管式实例组
    2. GKE 部署所用的 NEG

    在每个可用区中,您可以根据自己的部署要求组合使用各种后端组。

  5. 用于报告后端就绪情况的区域健康检查。

  6. 用于监控后端使用情况和运行状况的区域性后端服务。

  7. 区域网址映射,用于解析请求的网址,并根据请求网址的主机和路径将请求转发到特定后端服务。

  8. 区域目标 HTTP 或 HTTPS 代理,用于接收用户请求并将其转发到网址映射。对于 HTTPS,请配置区域 SSL 证书资源。如果您配置 HTTPS 负载均衡,则目标代理会使用 SSL 证书来解密 SSL 流量。目标代理可以通过 HTTP 或 HTTPS 将流量转发到您的实例。

  9. 包含负载均衡器外部 IP 地址的转发规则,用于将每个传入请求转发到目标代理。

    与该转发规则关联的外部 IP 地址使用 gcloud compute addresses create 命令进行预留,如预留负载均衡器的 IP 地址中所述。

配置网络和子网

您需要一个包含两个子网的 VPC 网络:一个用于负载均衡器的后端,另一个用于负载均衡器的代理。区域级外部 HTTP(S) 负载均衡器是区域性的。对于 VPC 网络中的流量,如果其来源所在的子网与负载均衡器位于同一区域,那么该流量会被路由到负载均衡器。

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

  • 网络:网络是名为 lb-network自定义模式 VPC 网络

  • 后端子网us-west1 区域中名为 backend-subnet 的子网使用 10.1.2.0/24 作为其主要 IP 地址范围。

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

为后端配置网络和子网

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

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

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

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

gcloud

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

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

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

Terraform

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

resource "google_compute_network" "default" {
  name                    = "lb-network"
  auto_create_subnetworks = false
  routing_mode            = "REGIONAL"
}

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

resource "google_compute_subnetwork" "default" {
  name                       = "backend-subnet"
  ip_cidr_range              = "10.1.2.0/24"
  network                    = google_compute_network.default.id
  private_ipv6_google_access = "DISABLE_GOOGLE_ACCESS"
  purpose                    = "PRIVATE"
  region                     = "us-west1"
  stack_type                 = "IPV4_ONLY"
}

API

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

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
    {
     "routingConfig": {
       "routingMode": "REGIONAL"
     },
     "name": "lb-network",
     "autoCreateSubnetworks": false
    }
    
  2. subnetworks.insert 方法发出 POST 请求,并将 PROJECT_ID 替换为您的项目 ID。

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

配置代理专用子网

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

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

控制台

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

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

  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

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

resource "google_compute_subnetwork" "proxy_only" {
  name          = "proxy-only-subnet"
  ip_cidr_range = "10.129.0.0/23"
  network       = google_compute_network.default.id
  purpose       = "REGIONAL_MANAGED_PROXY"
  region        = "us-west1"
  role          = "ACTIVE"
}

API

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

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks
{
  "name": "proxy-only-subnet",
  "ipCidrRange": "10.129.0.0/23",
  "network": "projects/PROJECT_ID/global/networks/lb-network",
  "region": "projects/PROJECT_ID/regions/us-west1",
  "purpose": "REGIONAL_MANAGED_PROXY",
  "role": "ACTIVE"
}

配置防火墙规则

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

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

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

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

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

控制台

  1. 在 Google Cloud 控制台中,进入防火墙规则页面。

    进入“防火墙规则”

  2. 点击创建防火墙规则 以创建允许 Google Cloud 健康检查的规则:

    • 名称fw-allow-health-check
    • 网络lb-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 联系这些虚拟机。
  3. 点击创建

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

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

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 规则以允许区域级外部 HTTP(S) 负载均衡器的代理连接到您的后端。将 source-ranges 设置为代理专用子网的分配范围,例如 10.129.0.0/23

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

Terraform

如需创建防火墙规则,请使用 google_compute_firewall 资源。

resource "google_compute_firewall" "default" {
  name = "fw-allow-health-check"
  allow {
    protocol = "tcp"
  }
  direction     = "INGRESS"
  network       = google_compute_network.default.id
  priority      = 1000
  source_ranges = ["130.211.0.0/22", "35.191.0.0/16"]
  target_tags   = ["load-balanced-backend"]
}
resource "google_compute_firewall" "allow_proxy" {
  name = "fw-allow-proxies"
  allow {
    ports    = ["443"]
    protocol = "tcp"
  }
  allow {
    ports    = ["80"]
    protocol = "tcp"
  }
  allow {
    ports    = ["8080"]
    protocol = "tcp"
  }
  direction     = "INGRESS"
  network       = google_compute_network.default.id
  priority      = 1000
  source_ranges = ["10.129.0.0/23"]
  target_tags   = ["load-balanced-backend"]
}

API

通过向 firewalls.insert 方法发出 POST 请求以创建 fw-allow-health-check 防火墙规则,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "name": "fw-allow-health-check",
  "network": "projects/PROJECT-ID/global/networks/lb-network",
  "sourceRanges": [
    "130.211.0.0/22",
    "35.191.0.0/16"
  ],
  "targetTags": [
    "load-balanced-backend"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp"
    }
  ],
  "direction": "INGRESS"
}

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

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "name": "fw-allow-proxies",
  "network": "projects/PROJECT_ID/global/networks/lb-network",
  "sourceRanges": [
    "10.129.0.0/23"
  ],
  "targetTags": [
    "load-balanced-backend"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    },
    {
      "IPProtocol": "tcp",
      "ports": [
        "443"
      ]
    },
    {
      "IPProtocol": "tcp",
      "ports": [
        "8080"
      ]
    }
  ],
  "direction": "INGRESS"
}

使用基于虚拟机的服务配置区域级外部 HTTP(S) 负载均衡器

本部分介绍了在 Compute Engine 虚拟机上运行的服务需要的配置。客户端虚拟机中的应用会访问您在转发规则中配置的虚拟 IP 地址 (VIP)。当您的客户端应用向此 IP 地址和端口发送流量时,它们的请求会根据您的区域级外部 HTTP(S) 负载均衡器的网址映射转发到您的后端虚拟机 (VM)。

此页面上的示例明确创建区域级外部 HTTP(S) 负载均衡器转发规则的预留外部 IP 地址,而不是允许分配临时外部 IP 地址。我们建议的最佳实践是,为转发规则预留 IP 地址。

创建代管式实例组后端

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

控制台

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

    转到“实例模板”

    1. 点击创建实例模板
    2. 对于名称,输入 l7-xlb-backend-template
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (buster)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get
    4. 管理、安全、磁盘、网络、单租户部分,在管理标签页上,将以下脚本插入到启动脚本字段。

      #! /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://169.254.169.254/computeMetadata/v1/instance/name)"
      sudo echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      sudo systemctl restart apache2
      
    5. 网络部分中,对于网络,选择 lb-network,对于子网,选择 backend-subnet

    6. 添加以下网络标记:load-balanced-backend

    7. 点击创建

  2. 创建代管式实例组。在 Google Cloud Console 中,转到实例组页面。

    进入“实例组”

    1. 点击创建实例组
    2. 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG
    3. 对于名称,输入 l7-xlb-backend-example
    4. 对于位置,选择单个可用区
    5. 对于区域,请选择 us-west1
    6. 对于可用区,请选择 us-west1-a
    7. 对于实例模板,请选择 l7-xlb-backend-template
    8. 对于自动扩缩模式,选择“开启:在实例组中添加和移除实例”

      实例数下限设置为 2,并将实例数上限设置为 2 或更大。

    9. 点击创建

gcloud

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

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

    gcloud compute instance-templates create l7-xlb-backend-template \
    --region=us-west1 \
    --network=lb-network \
    --subnet=backend-subnet \
    --tags=load-balanced-backend \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --metadata=startup-script='#! /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://169.254.169.254/computeMetadata/v1/instance/name)"
    sudo echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    sudo systemctl restart apache2'
    
  2. 使用 gcloud compute instance-groups managed create 命令在该可用区中创建一个代管式实例组。

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

Terraform

如需创建实例模板,请使用 google_compute_instance_template 资源。

resource "google_compute_instance_template" "default" {
  name = "l7-xlb-backend-template"
  disk {
    auto_delete  = true
    boot         = true
    device_name  = "persistent-disk-0"
    mode         = "READ_WRITE"
    source_image = "projects/debian-cloud/global/images/family/debian-10"
    type         = "PERSISTENT"
  }
  labels = {
    managed-by-cnrm = "true"
  }
  machine_type = "n1-standard-1"
  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://169.254.169.254/computeMetadata/v1/instance/name)"
    sudo echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    sudo systemctl restart apache2
    EOF
  }
  network_interface {
    access_config {
      network_tier = "PREMIUM"
    }
    network    = google_compute_network.default.id
    subnetwork = google_compute_subnetwork.default.id
  }
  region = "us-west1"
  scheduling {
    automatic_restart   = true
    on_host_maintenance = "MIGRATE"
    provisioning_model  = "STANDARD"
  }
  service_account {
    email  = "default"
    scopes = ["https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring.write", "https://www.googleapis.com/auth/pubsub", "https://www.googleapis.com/auth/service.management.readonly", "https://www.googleapis.com/auth/servicecontrol", "https://www.googleapis.com/auth/trace.append"]
  }
  tags = ["load-balanced-backend"]
}

如需创建代管式实例组,请使用 google_compute_instance_group_manager 资源。

resource "google_compute_instance_group_manager" "default" {
  name = "l7-xlb-backend-example"
  zone = "us-west1-a"
  named_port {
    name = "http"
    port = 80
  }
  version {
    instance_template = google_compute_instance_template.default.id
    name              = "primary"
  }
  base_instance_name = "vm"
  target_size        = 2
}

API

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

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates
    {
     "name":"l7-xlb-backend-template",
     "properties": {
       "machineType":"e2-standard-2",
       "tags": {
         "items":[
           "load-balanced-backend"
         ]
       },
       "metadata": {
         "kind":"compute#metadata",
         "items":[
           {
             "key":"startup-script",
             "value":"#! /bin/bash\nsudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\nsudo echo \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nsudo systemctl restart apache2"
           }
         ]
       },
       "networkInterfaces":[
         {
           "network":"projects/PROJECT_ID/global/networks/lb-network",
           "subnetwork":"regions/us-west1/subnetworks/backend-subnet",
           "accessConfigs":[
             {
               "type":"ONE_TO_ONE_NAT"
             }
           ]
         }
       ],
       "disks": [
         {
           "index":0,
           "boot":true,
           "initializeParams": {
             "sourceImage":"projects/debian-cloud/global/images/family/debian-10"
           },
           "autoDelete":true
         }
       ]
     }
    }
    
  2. 使用 instanceGroupManagers.insert 方法在每个可用区中创建一个代管式实例组,注意要将 PROJECT_ID 替换为您的项目 ID。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/{zone}/instanceGroupManagers
    {
     "name": "l7-xlb-backend-example",
     "zone": "projects/PROJECT_ID/zones/us-west1-a",
     "instanceTemplate": "projects/PROJECT_ID/global/instanceTemplates/l7-xlb-backend-template",
     "baseInstanceName": "l7-xlb-backend-example",
     "targetSize": 2
    }
    

向实例组添加已命名端口

对于您的实例组,定义一个 HTTP 服务并将端口名称映射到相关端口上。负载均衡器的后端服务会将流量转发到已命名的端口。

控制台

  1. 在 Google Cloud Console 中,转到实例组页面。

    进入“实例组”

  2. 点击实例组的名称(在此示例中为 l7-xlb-backend-example)。

  3. 在实例组的概览页面上,点击修改

  4. 点击指定端口名称映射

  5. 点击添加项目

  6. 对于端口名称,请输入 http。对于端口号,请输入 80

  7. 点击保存

gcloud

使用 gcloud compute instance-groups set-named-ports 命令。

gcloud compute instance-groups set-named-ports l7-xlb-backend-example \
    --named-ports http:80 \
    --zone us-west1-a

Terraform

named_port 特性包含在代管式实例组示例中。

预留负载均衡器的 IP 地址

控制台

  1. 在 Google Cloud 控制台中,进入预留静态地址页面。

    进入“预留静态地址”

  2. 为新地址选择一个名称

  3. 对于网络服务层级,请选择标准

  4. IP 版本部分,选择 IPv4。IPv6 地址仅限为全球地址,只适用于全球负载均衡器。

  5. 对于类型,请选择区域

  6. 对于区域,选择 us-west1

  7. 附加目标选项设置为。创建负载均衡器后,此 IP 地址将关联到负载均衡器的转发规则。

  8. 点击预留以预留该 IP 地址。

gcloud

  1. 如需使用 gcloud compute 预留静态外部 IP 地址,请使用 compute addresses create 命令

    gcloud compute addresses create ADDRESS_NAME  \
       --region=us-west1 \
       --network-tier=STANDARD
    

    替换以下内容:

    • ADDRESS_NAME:您要为此地址指定的名称。
    • REGION:您要预留此地址的区域。此区域应与负载均衡器所在的区域相同。所有区域级 IP 地址均为 IPv4
  2. 使用 compute addresses describe 命令可以查看结果:

    gcloud compute addresses describe ADDRESS_NAME
    

Terraform

如需预留 IP 地址,请使用 google_compute_address 资源。

resource "google_compute_address" "default" {
  name         = "address-name"
  address_type = "EXTERNAL"
  network_tier = "STANDARD"
  region       = "us-west1"
}

如需了解如何应用或移除 Terraform 配置,请参阅使用 Terraform 配置

API

如需创建区域 IPv4 地址,请调用区域 addresses.insert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses

请求正文应包含以下内容:

{
  "name": "ADDRESS_NAME"
  "networkTier": "STANDARD"
  "region": "us-west1"
}

替换以下内容:

  • ADDRESS_NAME:地址的名称
  • REGION:此请求的区域名称
  • PROJECT_ID:此请求的项目 ID

配置负载均衡器

下面的示例介绍了如何创建以下区域级外部 HTTP(S) 负载均衡器资源:

  • HTTP 健康检查
  • 将代管实例组用作后端的后端服务
  • 网址映射
    • 如果为目标 HTTP(S) 代理定义了区域,请务必参阅区域网址映射。区域网址映射根据您为传入网址的主机和路径定义的规则将请求路由到区域后端服务。区域网址映射只能由同一区域中的区域目标代理规则引用。
  • SSL 证书(适用于 HTTPS)
  • 目标代理
  • 转发规则

代理可用性

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

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

控制台

  1. 在 Google Cloud 控制台中,进入创建负载均衡器页面。

    进入“创建负载均衡器”

  2. HTTP(S) 负载均衡卡中,点击开始配置

  3. 面向互联网或仅限内部部分,选择从互联网到我的虚拟机或无服务器服务。此设置表明负载均衡器是外部 HTTP(S) 负载均衡器。

  4. 高级流量管理部分中:

    1. 选择具有高级流量管理功能的 HTTP(S) 负载均衡器
    2. 选择区域级 HTTP(S) 负载均衡器
  5. 点击继续

创建区域级外部 HTTP(S) 负载均衡器

  1. 对于负载均衡器的名称,请输入 regional-l7-xlb
  2. 对于区域,请选择 us-west1
  3. 对于网络,请选择 lb-network

预留代理专用子网

对于区域级外部 HTTP(S) 负载均衡器,请预留代理专用子网:

  1. 点击 Reserve a Subnet(预留子网)。
  2. 对于名称,输入 proxy-only-subnet

  3. 对于 IP 地址范围,输入 10.129.0.0/23

  4. 点击添加

配置前端

对于 HTTP:

  1. 点击前端配置
  2. 名称设置为 l7-xlb-forwarding-rule
  3. 协议设置为 HTTP
  4. 端口设置为 80
  5. 选择您在预留负载均衡器的 IP 地址中创建的 IP 地址
  6. 点击完成

对于 HTTPS:

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

  1. 点击前端配置
  2. 名称字段中,输入 l7-xlb-forwarding-rule
  3. 协议字段中,选择 HTTPS (includes HTTP/2)
  4. 确保将端口设置为 443
  5. 选择您在预留负载均衡器的 IP 地址中创建的 IP 地址
  6. 证书列表中,执行以下操作:
    1. 如果您已拥有自行管理的 SSL 证书资源,请选择主要 SSL 证书。
    2. 点击创建新证书
      1. 名称字段中,输入 l7-xlb-cert
      2. 在相应字段中上传您的 PEM 格式的文件:
        • 公钥证书
        • 证书链
        • 私钥
      3. 点击创建
  7. 可选:如需添加除了主要 SSL 证书之外的其他证书,请执行以下操作:
    1. 点击添加证书
    2. 如果您已有证书,请从证书列表中选择。
    3. 可选:点击创建新证书,然后按照上一步中指定的说明操作。
  8. SSL 政策列表中选择一项 SSL 政策。如果您尚未创建任何 SSL 政策,则应用默认 GCP SSL 政策
  9. 点击完成

配置后端服务

  1. 点击后端配置
  2. 创建或选择后端服务菜单中,选择创建后端服务
  3. 将后端服务的名称设置为 l7-xlb-backend-service
  4. 对于协议,选择 HTTP
  5. 对于已命名端口,输入 http
  6. 后端类型设置为实例组
  7. 新后端部分:
    1. 实例组设置为 l7-xlb-backend-example
    2. 端口号设置为 80
    3. 平衡模式设置为利用率
    4. 点击完成
  8. 健康检查列表中,点击创建健康检查
    1. 名称设置为 l7-xlb-basic-check
    2. 协议设置为 HTTP
    3. 端口设置为 80
    4. 点击保存
  9. 点击创建

配置路由规则

  1. 点击路由规则
  2. 对于模式,选择简单主机和路径规则
  3. 确保 l7-xlb-backend-service 是任何不匹配的主机和任何不匹配的路径的唯一后端服务。

检查配置

检查负载均衡器,确保其已按需要配置,然后点击创建

gcloud

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

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

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

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

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

    对于 HTTP

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

    gcloud compute target-http-proxies create l7-xlb-proxy \
      --url-map=regional-l7-xlb-map \
      --url-map-region=us-west1 \
      --region=us-west1
    

    对于 HTTPS

    如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。区域级外部 HTTP(S) 负载均衡器不支持由 Google 管理的证书。

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

      export LB_CERT=path to PEM-formatted file
      
      export LB_PRIVATE_KEY=path to PEM-formatted file
      
    2. 使用 gcloud compute ssl-certificates create 命令创建区域 SSL 证书。

      gcloud compute ssl-certificates create l7-xlb-cert \
       --certificate=$LB_CERT \
       --private-key=$LB_PRIVATE_KEY \
       --region=us-west1
      
    3. 使用区域 SSL 证书通过 gcloud compute target-https-proxies create 命令创建目标代理。

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

    对于 HTTP

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

    gcloud compute forwarding-rules create l7-xlb-forwarding-rule \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --network-tier=STANDARD \
      --network=lb-network \
      --address=ADDRESS_NAME \
      --ports=80 \
      --region=us-west1 \
      --target-http-proxy=l7-xlb-proxy \
      --target-http-proxy-region=us-west1
    

    对于 HTTPS

    使用带有正确标志的 gcloud compute forwarding-rules create 命令创建转发规则。

    gcloud compute forwarding-rules create l7-xlb-forwarding-rule \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --network-tier=STANDARD \
      --network=lb-network \
      --address=ADDRESS_NAME \
      --ports=443 \
      --region=us-west1 \
      --target-https-proxy=l7-xlb-proxy \
      --target-https-proxy-region=us-west1
    

Terraform

如需创建健康检查,请使用 google_compute_region_health_check 资源。

resource "google_compute_region_health_check" "default" {
  name               = "l7-xlb-basic-check"
  check_interval_sec = 5
  healthy_threshold  = 2
  http_health_check {
    port_specification = "USE_SERVING_PORT"
    proxy_header       = "NONE"
    request_path       = "/"
  }
  region              = "us-west1"
  timeout_sec         = 5
  unhealthy_threshold = 2
}

如需创建后端服务,请使用 google_compute_region_backend_service 资源。

resource "google_compute_region_backend_service" "default" {
  name                  = "l7-xlb-backend-service"
  region                = "us-west1"
  load_balancing_scheme = "EXTERNAL_MANAGED"
  health_checks         = [google_compute_region_health_check.default.id]
  protocol              = "HTTP"
  session_affinity      = "NONE"
  timeout_sec           = 30
  backend {
    group           = google_compute_instance_group_manager.default.instance_group
    balancing_mode  = "UTILIZATION"
    capacity_scaler = 1.0
  }
}

如需创建网址映射,请使用 google_compute_region_url_map 资源。

resource "google_compute_region_url_map" "default" {
  name            = "regional-l7-xlb-map"
  region          = "us-west1"
  default_service = google_compute_region_backend_service.default.id
}

如需创建目标 HTTP 代理,请使用 google_compute_region_target_http_proxy 资源。

resource "google_compute_region_target_http_proxy" "default" {
  name    = "l7-xlb-proxy"
  region  = "us-west1"
  url_map = google_compute_region_url_map.default.id
}

如需创建转发规则,请使用 google_compute_forwarding_rule 资源。

resource "google_compute_forwarding_rule" "default" {
  name       = "l7-xlb-forwarding-rule"
  provider   = google-beta
  depends_on = [google_compute_subnetwork.proxy_only]
  region     = "us-west1"

  ip_protocol           = "TCP"
  load_balancing_scheme = "EXTERNAL_MANAGED"
  port_range            = "80"
  target                = google_compute_region_target_http_proxy.default.id
  network               = google_compute_network.default.id
  ip_address            = google_compute_address.default.id
  network_tier          = "STANDARD"
}

如需了解如何应用或移除 Terraform 配置,请参阅使用 Terraform 配置

API

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

POST https://compute.googleapis.com/compute/v1/projects/<var>PROJECT_ID</var>/regions/{region}/healthChecks
{
  "name": "l7-xlb-basic-check",
  "type": "HTTP",
  "httpHealthCheck": {
    "portSpecification": "USE_SERVING_PORT"
  }
}

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

POST https://compute.googleapis.com/compute/v1/projects/<var>PROJECT_ID</var>/regions/us-west1/backendServices
{
  "name": "l7-xlb-backend-service",
  "backends": [
    {
      "group": "projects/<var>PROJECT_ID</var>/zones/us-west1-a/instanceGroups/l7-xlb-backend-example",
      "balancingMode": "UTILIZATION"
    }
  ],
  "healthChecks": [
    "projects/<var>PROJECT_ID</var>/regions/us-west1/healthChecks/l7-xlb-basic-check"
  ],
  "loadBalancingScheme": "EXTERNAL_MANAGED"
}

regionUrlMaps.insert 方法发出 POST 请求以创建网址映射,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/v1/projects/<var>PROJECT_ID</var>/regions/us-west1/urlMaps
{
  "name": "regional-l7-xlb-map",
  "defaultService": "projects/<var>PROJECT_ID</var>/regions/us-west1/backendServices/l7-xlb-backend-service"
}

regionTargetHttpProxies.insert 方法发出 POST 请求以创建目标 HTTP 代理,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/targetHttpProxy
{
  "name": "l7-xlb-proxy",
  "urlMap": "projects/PROJECT_ID/global/urlMaps/regional-l7-xlb-map",
  "region": "us-west1"
}

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

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules
{
  "name": "l7-xlb-forwarding-rule",
  "IPAddress": "10.1.2.99",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "projects/PROJECT_ID/regions/us-west1/targetHttpProxies/l7-xlb-proxy",
  "loadBalancingScheme": "EXTERNAL_MANAGED",
  "network": "projects/PROJECT_ID/global/networks/lb-network",
  "networkTier": "STANDARD",
}

将您的网域连接到负载均衡器

创建负载均衡器后,请记好与负载均衡器关联的 IP 地址:例如 30.90.80.100。如需将您的网域指向负载均衡器,请使用您的网域注册服务创建 A 记录。如果您向 SSL 证书添加了多个网域,则必须为每个网域添加一条 A 记录,所有网域均指向负载均衡器的 IP 地址。例如,为 www.example.comexample.com 创建 A 记录:

NAME                  TYPE     DATA
www                   A        30.90.80.100
@                     A        30.90.80.100

如果您使用的是 Google Domains,请参阅 Google Domains 帮助页面了解详情。

测试负载均衡器

现在负载均衡服务已运行,您可以将流量发送到转发规则并会发现流量被分散到不同的实例。

控制台

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

    转到“负载均衡”

  2. 点击您刚刚创建的负载均衡器。
  3. 后端部分中,确认虚拟机运行状况良好。运行状况良好列应该会填充相应信息,指示两个虚拟机运行状况都良好 (2/2)。否则,请先尝试重新加载页面。Google Cloud 控制台可能需要一些时间才能指示虚拟机运行状况良好。如果几分钟后后端的健康状况仍然不佳,请检查防火墙配置以及分配给后端虚拟机的网络标记。
  4. 在 Google Cloud 控制台显示后端实例运行状况良好后,您可使用网络浏览器转到 https://IP_ADDRESS(或 http://IP_ADDRESS),来测试您的负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址
  5. 如果您使用自签名证书测试 HTTPS,您的浏览器将显示警告。您必须明确指示浏览器接受自签名证书。
  6. 您的浏览器应该会呈现一个页面,其中的内容显示提供该页面的实例的名称以及其可用区(例如,Page served from: lb-backend-example-xxxx)。如果您的浏览器未呈现此页面,请查看本指南中的配置设置。

gcloud

请记下预留的 IPv4 地址:

gcloud beta compute addresses describe ADDRESS_NAME \
    --format="get(address)" \
    --region="us-west1"

您可以使用网络浏览器转到 https://IP_ADDRESS(或 http://IP_ADDRESS)来测试您的负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址

如果您使用自签名证书来测试 HTTPS,您的浏览器将显示警告。您必须明确指示浏览器接受自签名证书。

您的浏览器应会打开一个页面,其中包含有关后端实例的极少量信息。如果您的浏览器没有打开此页面,请检查本指南中的配置设置。

其他配置选项

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

启用会话亲和性

这些过程介绍了如何为示例区域级外部 HTTP(S) 负载均衡器更新后端服务,以便后端服务使用生成的 Cookie 亲和性、标头字段亲和性或 HTTP Cookie 亲和性。

启用生成的 Cookie 亲和性后,负载均衡器会针对第一个请求发出一个 Cookie。对于具有相同 Cookie 的每个后续请求,负载均衡器会将请求定向到同一个后端虚拟机或端点。对于外部 HTTP(S) 负载均衡器,Cookie 名为 GCILB

启用标头字段亲和性时,负载均衡器会根据 --custom-request-header 标志中指定的 HTTP 标头的值将请求路由到 NEG 中的后端虚拟机或端点。仅当负载均衡位置政策为 RING_HASHMAGLEV 且后端服务的一致性哈希指定 HTTP 标头的名称时,标头字段亲和性才有效。

启用 HTTP Cookie 亲和性后,负载均衡器会根据带有可选 --affinity-cookie-ttl 标志的 HTTP_COOKIE 标志中指定的 HTTP Cookie,将请求路由到 NEG 中的后端虚拟机或端点。如果客户端未在其 HTTP 请求中提供 Cookie,则代理会生成 Cookie 并通过 Set-Cookie 标头将其返回给客户端。仅当负载均衡位置政策为 RING_HASHMAGLEV 且后端服务的一致性哈希指定 HTTP Cookie 时,HTTP Cookie 亲和性才有效。

控制台

如需针对后端服务启用或更改会话亲和性,请执行以下操作:

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

    进入“负载均衡”

  2. 点击您刚刚创建的负载均衡器。

  3. 点击后端

  4. 点击 l7-xlb-backend-service(您为此示例创建的后端服务的名称),然后点击修改

  5. 后端服务详情页面上,点击高级配置

  6. 对于会话亲和性,从菜单中选择所需的会话亲和性类型。

  7. 点击更新

gcloud

使用以下 gcloud 命令将 l7-xlb-backend-service 后端服务更新为不同类型的会话亲和性:

gcloud compute backend-services update l7-xlb-backend-service \
    --session-affinity=[GENERATED_COOKIE | HEADER_FIELD | HTTP_COOKIE | CLIENT_IP]
    --region=us-west1

API

如需设置会话亲和性,请向 regionBackendServices/patch 方法发出 PATCH 请求。

PATCH https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-west1/regionBackendServices/l7-xlb-backend-service
{
  "sessionAffinity": ["GENERATED_COOKIE" | "HEADER_FIELD" | "HTTP_COOKIE" | "CLIENT_IP" ]
}

后续步骤