设置外部 HTTPS 负载均衡器

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

以下后端类型支持使用 Identity-Aware Proxy (IAP) 的外部 HTTP (S) 负载平衡:

本设置指南介绍如何创建一个启用了 IAP 后端的 Compute Engine 代管式实例组后端的外部 HTTP(S) 负载均衡器。

如果此示例与您的使用场景不匹配,请参阅以下页面之一:

如需了解一般概念,请参阅外部 HTTP(S) 负载均衡概览

如果您是全球外部 HTTP(S) 负载均衡器(经典版)的现有用户,则在规划使用全球外部 HTTP(S) 负载均衡器的新部署时,请确保查看规划向全球外部 HTTP(S) 负载均衡器的迁移

负载均衡器拓扑

对于 HTTPS 负载均衡器,您需要创建下图所示的配置。

使用代管式实例组 (MIG) 后端的 HTTPS 负载均衡器。
图 1. 使用代管式实例组 (MIG) 后端的 HTTPS 负载均衡器(点击可放大)

对于 HTTP 负载均衡器,您需要创建下图所示的配置。

使用代管式实例组 (MIG) 后端的 HTTP 负载均衡器。
图 2. 使用代管式实例组 (MIG) 后端的 HTTP 负载均衡器(点击可放大)

图中的事件顺序如下所示:

  1. 客户端将内容请求发送到转发规则中定义的外部 IPv4 地址。
  2. 对于 HTTPS 负载均衡器,转发规则会将请求定向到目标 HTTPS 代理

    对于 HTTP 负载均衡器,转发规则会将请求定向到目标 HTTP 代理

  3. 目标代理使用网址映射中的规则确定单个后端服务接收所有请求。

  4. 负载均衡器确定后端服务只有一个实例组,并将请求定向到该组中的虚拟机实例。

  5. 该虚拟机提供用户请求的内容。

准备工作

在创建负载均衡器之前,请先完成以下步骤。

设置 SSL 证书资源

对于 HTTPS 负载均衡器,按照以下说明创建 SSL 证书资源:

我们建议您使用 Google 管理的证书。

此示例假设您已有一个名为 www-ssl-cert 的 SSL 证书资源。

设置权限

为完成本指南中的步骤,您必须拥有在项目中创建 Compute Engine 实例、防火墙规则和预留 IP 地址的权限。您必须具有 Project Owner 或 Project Editor 角色,或者必须具有以下 Compute Engine IAM 角色

任务 所需角色
创建实例 Instance Admin
添加和移除防火墙规则 Security Admin
创建负载均衡器组件 Network Admin
创建项目(可选) Project Creator

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

创建代管式实例组

如需使用 Compute Engine 后端设置负载均衡器,您的虚拟机必须属于某个实例组。本指南介绍了如何创建由一组运行有 Apache 的 Linux 虚拟机组成的代管实例组,然后设置负载均衡。 代管式实例组根据您指定的实例模板创建每个代管式实例。

这个代管式实例组提供运行外部 HTTP(S) 负载均衡器的后端服务器的虚拟机。出于演示目的,后端会传送其各自的主机名。

在创建代管式实例组之前,请先创建实例模板。

控制台

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

    转到“实例模板”

  2. 点击创建实例模板

  3. 对于名称,输入 lb-backend-template

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

  5. 请勿配置防火墙选项。

    由于外部 HTTP(S) 负载均衡器是代理,因此您无需在防火墙下选择允许 HTTPS 流量允许 HTTP 流量。在配置防火墙规则中,您将为此负载均衡器创建唯一必要的防火墙规则。

  6. 点击高级选项

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

    1. 对于网络标记,请输入 allow-health-check
  8. 点击管理。将以下脚本输入启动脚本字段。

    #! /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
    
  9. 点击创建

gcloud

  1. 创建模板。

    gcloud compute instance-templates create TEMPLATE_NAME \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --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://metadata.google.internal/computeMetadata/v1/instance/name)"
       sudo echo "Page served from: $vm_hostname" | \
       tee /var/www/html/index.html
       sudo systemctl restart apache2'
    

Terraform

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

resource "google_compute_instance_template" "default" {
  name = "lb-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-11"
    type         = "PERSISTENT"
  }
  labels = {
    managed-by-cnrm = "true"
  }
  machine_type = "n1-standard-1"
  metadata = {
    startup-script = "#! /bin/bash\n     sudo apt-get update\n     sudo apt-get install apache2 -y\n     sudo a2ensite default-ssl\n     sudo a2enmod ssl\n     vm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\n   http://169.254.169.254/computeMetadata/v1/instance/name)\"\n   sudo echo \"Page served from: $vm_hostname\" | \\\n   tee /var/www/html/index.html\n   sudo systemctl restart apache2"
  }
  network_interface {
    access_config {
      network_tier = "PREMIUM"
    }
    network    = "global/networks/default"
    subnetwork = "regions/us-east1/subnetworks/default"
  }
  region = "us-east1"
  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 = ["allow-health-check"]
}

创建代管式实例组并选择实例模板。

控制台

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

    转到“实例组”页面

  2. 点击创建实例组
  3. 在左侧选择新建代管式实例组(无状态)
  4. 对于名称,输入 lb-backend-example
  5. 位置下方,选择单个可用区
  6. 对于区域,选择您的首选区域。本示例使用 us-east1
  7. 对于区域,选择 us-east1-b
  8. 实例模板下方,选择实例模板 lb-backend-template
  9. 对于自动扩缩模式,选择“开启:在实例组中添加和移除实例”

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

  10. 如需创建新的实例组,请点击创建

gcloud

  1. 基于模板创建代管实例组。

    gcloud compute instance-groups managed create lb-backend-example \
    --template=TEMPLATE_NAME --size=2 --zone=us-east1-b
    

Terraform

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

resource "google_compute_instance_group_manager" "default" {
  name = "lb-backend-example"
  zone = "us-east1-b"
  named_port {
    name = "http"
    port = 80
  }
  version {
    instance_template = google_compute_instance_template.default.id
    name              = "primary"
  }
  base_instance_name = "vm"
  target_size        = 2
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

向实例组添加已命名端口

对于您的实例组,定义一个 HTTP 服务并将端口名称映射到相关端口上。负载均衡服务会将流量转发到已命名的端口。 如需了解详情,请参阅已命名的端口

控制台

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

    转到“实例组”页面

  2. 点击实例组的名称(在此示例中为 lb-backend-example)。
  3. 在实例组的概览页面上,点击修改
  4. 端口映射下,点击添加端口
    1. 对于端口名称,请输入 http。对于端口号,请输入 80
  5. 点击保存

gcloud

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

gcloud compute instance-groups set-named-ports lb-backend-example \
    --named-ports http:80 \
    --zone us-east1-b

Terraform

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

配置防火墙规则

在此示例中,您将创建 fw-allow-health-check 防火墙规则。这是一种入站流量规则,允许来自 Google Cloud 健康检查系统(130.211.0.0/2235.191.0.0/16)的流量。此示例使用目标标记 allow-health-check 来标识虚拟机。

控制台

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

    转到“防火墙”页面

  2. 点击创建防火墙规则以创建防火墙规则。
  3. 对于名称,输入 fw-allow-health-check
  4. 网络下,选择默认
  5. 目标下,选择指定的目标标记
  6. 使用 allow-health-check 填充目标标记字段。
  7. 来源过滤条件设置为 IPv4 范围
  8. 来源 IPv4 范围设置为 130.211.0.0/2235.191.0.0/16
  9. 协议和端口下,选择指定的协议和端口
  10. 选中 TCP 复选框,然后输入端口号 80
  11. 点击创建

gcloud

gcloud compute firewall-rules create fw-allow-health-check \
    --network=default \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --target-tags=allow-health-check \
    --rules=tcp:80

Terraform

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

resource "google_compute_firewall" "default" {
  name          = "fw-allow-health-check"
  direction     = "INGRESS"
  network       = "global/networks/default"
  priority      = 1000
  source_ranges = ["130.211.0.0/22", "35.191.0.0/16"]
  target_tags   = ["allow-health-check"]
  allow {
    ports    = ["80"]
    protocol = "tcp"
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

保留外部 IP 地址

现在您的实例已启动并正在运行,接下来请设置一个全局静态外部 IP 地址,以供客户用来访问您的负载均衡器。

控制台

  1. 在 Google Cloud 控制台中,转到外部 IP 地址页面。

    转到“外部 IP 地址”页面

  2. 如需预留 IPv4 地址,请点击预留静态地址
  3. 对于名称,输入 lb-ipv4-1
  4. 网络服务层级设置为优质
  5. IP 版本设置为 IPv4
  6. 类型设置为全局
  7. 点击预留

gcloud

gcloud compute addresses create lb-ipv4-1 \
    --ip-version=IPV4 \
    --network-tier=PREMIUM \
    --global

请记下预留的 IPv4 地址:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

Terraform

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

resource "google_compute_global_address" "default" {
  name       = "lb-ipv4-1"
  ip_version = "IPV4"
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

设置负载均衡器

在此示例中,您将在客户端和负载均衡器之间使用 HTTP 或 HTTPS。对于 HTTPS,您需要一个或多个 SSL 证书资源来配置代理。我们建议您使用 Google 管理的证书。

即使您在前端使用 HTTPS,也可以在后端使用 HTTP。Google 会自动对 Google Front End (GFE) 前端与 Google Cloud VPC 网络中的后端之间的流量进行加密

控制台

开始配置
  1. 在 Google Cloud 控制台中,转到负载均衡页面。
    转到“负载均衡”
  2. HTTP(S) 负载均衡下,点击开始配置
  3. 面向互联网或仅限内部下,选择从互联网到我的虚拟机
  4. 全球性或区域级下,选择全球 HTTP(S) 负载均衡器(传统版)
  5. 点击继续
  6. 对于负载均衡器名称,请输入 web-map-httpsweb-map-http 等内容。
前端配置
  1. 点击前端配置
  2. 协议设置为 HTTPSHTTP
  3. IP 地址设置为您之前创建的 lb-ipv4-1
  4. 确保将端口设置为 443 以允许 HTTPS 流量,或者设置为 80 以允许 HTTP 流量。
  5. 如果您选择了 HTTPS,请执行以下操作:
    1. 点击证书,然后选择您的主要 SSL 证书。
    2. (可选)要创建 SSL 政策,请执行以下操作:
      1. SSL 政策列表中,选择创建政策
      2. 将 SSL 政策的名称设置为 my-ssl-policy
      3. 对于最低的 TLS 版本,请选择 TLS 1.0
      4. 对于配置文件,请选择新型。您将看到已启用的功能已停用的功能
      5. 点击保存
      如果您尚未创建任何 SSL 政策,则系统会应用默认的 GCP SSL 政策
    3. (可选)选中启用从 HTTP 到 HTTPS 的重定向复选框以启用从端口 80 到端口 443 的重定向。

      启用此复选框会创建一个额外的部分 HTTP 负载均衡器,它使用与 HTTPS 负载均衡器相同的 IP 地址,并将传入 HTTP 请求重定向到负载均衡器的 HTTPS 前端。

      只有在选择 HTTPS 协议并使用预留 IP 地址时,才能选中此复选框。

  6. 点击完成
后端配置
  1. 点击后端配置
  2. 创建或选择后端服务和后端存储分区下,选择后端服务 > 创建后端服务
  3. 为您的后端服务添加名称,例如 web-backend-service
  4. 协议下,选择 HTTP
  5. 已命名端口中输入 http
  6. 后端 > 新后端 > 实例组中,选择您的实例组 lb-backend-example
  7. 端口号中输入 80
  8. 保留其他默认设置。
  9. 健康检查下,选择创建健康检查,然后为您的健康检查添加一个名称,例如 http-basic-check
  10. 将协议设置为 HTTP,然后点击保存
  11. 可选:配置默认的后端安全政策。默认安全政策会限制超出用户配置阈值的流量。如需详细了解默认安全政策,请参阅速率限制概览

    1. 如需停用 Google Cloud Armor 默认安全政策,请在后端安全政策列表菜单中选择 None
    2. 安全部分中,选择默认安全政策
    3. 政策名称字段中,接受自动生成的名称或输入安全政策的名称。
    4. 请求数字段中,接受默认请求数,或输入介于 110,000 之间的整数。
    5. 间隔字段中,选择间隔。
    6. 对密钥实施字段中,选择以下值之一:全部IP 地址X-Forwarded-For IP 地址。如需详细了解这些选项,请参阅确定客户端以进行速率限制
  12. 保留其他默认设置。
  13. 点击创建
主机和路径规则

对于主机和路径规则,保留默认设置。

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

等待负载均衡器创建完毕。

如果您已创建 HTTPS 负载均衡器并选中了启用从 HTTP 到 HTTPS 的重定向复选框,您还将看到使用 -redirect 后缀创建的 HTTP 负载均衡器。

  1. 点击负载均衡器的名称。
  2. 负载均衡器详情屏幕上,记下负载均衡器的 IP:端口

gcloud

  1. 创建健康检查
      gcloud compute health-checks create http http-basic-check \
          --port 80
      
  2. 创建后端服务
      gcloud compute backend-services create web-backend-service \
          --load-balancing-scheme=EXTERNAL \
          --protocol=HTTP \
          --port-name=http \
          --health-checks=http-basic-check \
          --global
      
  3. 将您的实例组作为后端添加到后端服务。
      gcloud compute backend-services add-backend web-backend-service \
          --instance-group=lb-backend-example \
          --instance-group-zone=us-east1-b \
          --global
      
  4. 对于 HTTP,请创建一项网址映射,将传入的请求路由到默认后端服务。
      gcloud compute url-maps create web-map-http \
          --default-service web-backend-service
      
  5. 对于 HTTPS,请创建网址映射以将传入请求路由到默认后端服务。
      gcloud compute url-maps create web-map-https \
          --default-service web-backend-service
      

设置 HTTPS 前端

对于 HTTP 负载均衡器,请跳过此部分。
  1. 对于 HTTPS,如果您尚未创建全球 SSL 证书资源,请创建该资源,如下所示:
  2. 对于 HTTPS,请创建目标 HTTPS 代理以将请求路由到您的网址映射。该代理属于负载均衡器,保存用于 HTTPS 负载均衡器的 SSL 证书,因此您还需要在此步骤中加载证书。
      gcloud compute target-https-proxies create https-lb-proxy \
          --url-map=web-map-https \
          --ssl-certificates=www-ssl-cert
      
  3. 对于 HTTPS,请创建一条全局转发规则,将传入请求路由到代理。
      gcloud compute forwarding-rules create https-content-rule \
          --load-balancing-scheme=EXTERNAL \
          --network-tier=PREMIUM \
          --address=lb-ipv4-1 \
          --global \
          --target-https-proxy=https-lb-proxy \
          --ports=443
      
  4. (可选)对于 HTTPS,请创建全局 SSL 政策并将其附加到 HTTPS 代理。
    如需创建全局 SSL 政策,请执行以下操作:
      gcloud compute ssl-policies create my-ssl-policy \
          --profile MODERN \
          --min-tls-version 1.0
      
    如需将 SSL 政策附加到全局目标 HTTPS 代理,请执行以下操作:
      gcloud compute target-https-proxies update https-lb-proxy \
          --ssl-policy my-ssl-policy
      

设置 HTTP 前端

对于 HTTPS 负载均衡器,请跳过此部分。

  1. 对于 HTTP,请创建一个目标 HTTP 代理,将请求路由到您的网址映射。
      gcloud compute target-http-proxies create http-lb-proxy \
          --url-map=web-map-http
      
  2. 对于 HTTP,请创建一条全局转发规则,将传入请求路由到代理。
      gcloud compute forwarding-rules create http-content-rule \
          --load-balancing-scheme=EXTERNAL \
          --address=lb-ipv4-1 \
          --global \
          --target-http-proxy=http-lb-proxy \
          --ports=80
      

Terraform

  1. 如需创建健康检查,请使用 google_compute_health_check 资源。

    resource "google_compute_health_check" "default" {
      name               = "http-basic-check"
      check_interval_sec = 5
      healthy_threshold  = 2
      http_health_check {
        port               = 80
        port_specification = "USE_FIXED_PORT"
        proxy_header       = "NONE"
        request_path       = "/"
      }
      timeout_sec         = 5
      unhealthy_threshold = 2
    }
  2. 如需创建后端服务,请使用 google_compute_backend_service 资源。

    此示例使用 load_balancing_scheme="EXTERNAL_MANAGED",这将设置具有高级流量管理功能的全球外部 HTTP(S) 负载均衡器。如需创建全球外部 HTTP(S) 负载均衡器(传统版),请务必先将 load_balancing_scheme 更改为 EXTERNAL,之后再运行脚本。

    resource "google_compute_backend_service" "default" {
      name                            = "web-backend-service"
      connection_draining_timeout_sec = 0
      health_checks                   = [google_compute_health_check.default.id]
      load_balancing_scheme           = "EXTERNAL_MANAGED"
      port_name                       = "http"
      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
      }
    }
  3. 如需创建网址映射,请使用 google_compute_url_map 资源。

    resource "google_compute_url_map" "default" {
      name            = "web-map-http"
      default_service = google_compute_backend_service.default.id
    }
  4. 如需创建目标 HTTP 代理,请使用 google_compute_target_http_proxy 资源。

    resource "google_compute_target_http_proxy" "default" {
      name    = "http-lb-proxy"
      url_map = google_compute_url_map.default.id
    }
  5. 如需创建转发规则,请使用 google_compute_global_forwarding_rule 资源。

    此示例使用 load_balancing_scheme="EXTERNAL_MANAGED",这将设置具有高级流量管理功能的全球外部 HTTP(S) 负载均衡器。如需创建全球外部 HTTP(S) 负载均衡器(传统版),请务必先将 load_balancing_scheme 更改为 EXTERNAL,之后再运行脚本。

    resource "google_compute_global_forwarding_rule" "default" {
      name                  = "http-content-rule"
      ip_protocol           = "TCP"
      load_balancing_scheme = "EXTERNAL_MANAGED"
      port_range            = "80-80"
      target                = google_compute_target_http_proxy.default.id
      ip_address            = google_compute_global_address.default.id
    }

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

在外部 HTTP(S) 负载均衡器上启用 IAP

您可以将 IAP 配置为启用或停用(默认)。如果设置为启用,您必须为 oauth2-client-idoauth2-client-secret 提供值。

如需启用 IAP,请更新后端服务以添加具有 oauth2-client-idoauth2-client-secret--iap=enabled 标志。

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --iap=enabled,oauth2-client-id=ID,oauth2-client-secret=SECRET \
    --global

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

创建负载均衡器后,请记下与负载均衡器关联的 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. 对于 HTTPS,如果您使用的是 Google 管理的证书,请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态
  5. 在 Google Cloud 控制台显示后端实例运行状况良好后,您可使用网络浏览器转到 https://IP_ADDRESS(或 http://IP_ADDRESS),来测试您的负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址
  6. 如果您使用自签名证书来测试 HTTPS,您的浏览器将显示警告。您必须明确指示浏览器接受自签名证书。
  7. 您的浏览器应该会呈现一个页面,其中的内容显示提供该页面的实例的名称以及其可用区(例如,Page served from: lb-backend-example-xxxx)。如果您的浏览器未呈现此页面,请查看本指南中的配置设置。

gcloud

gcloud compute addresses describe lb-ipv4-1 \
   --format="get(address)" \
   --global

几分钟后,您可以通过运行以下 curl 命令来测试设置。

curl http://IP_ADDRESS

curl https://HOSTNAME

后续步骤