设置外部 HTTPS 负载平衡器

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

本设置指南介绍了如何使用已启用 IAP 的 Compute Engine 代管式实例组后端创建外部 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 Console 中,转到实例模板页面。

    转到“实例模板”

  2. 点击创建实例模板

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

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

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

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

  6. 管理、安全、磁盘、网络、单独租用下的管理标签页上,将以下脚本插入到启动脚本字段。

    #! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo 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
    
  7. 网络标签页上,添加网络标记 allow-health-check

  8. 点击创建

gcloud

  1. 创建模板。

    gcloud compute instance-templates create TEMPLATE_NAME \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-9 \
       --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
         sudo 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'
    

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

控制台

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

    转到“实例组”页面

  2. 点击创建实例组
  3. 在左侧选择新建代管式实例组(无状态)
  4. 对于名称,输入 lb-backend-example
  5. 位置下方,选择单个区域
  6. 对于地区,选择您的首选地区。本示例使用 us-east1
  7. 对于区域,选择 us-east1-b
  8. 实例模板下方,选择实例模板 lb-backend-template
  9. 自动扩缩模式下,选择不自动调节
  10. 实例数下,输入 2
  11. 如需创建新的实例组,请点击创建

gcloud

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

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

向实例组添加已命名端口

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

控制台

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

    转到“实例组”页面

  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

配置防火墙规则

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

控制台

  1. 在 Google Cloud Console 中,转到防火墙页面。

    转到“防火墙”页面

  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

预留外部 IP 地址

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

控制台

  1. 在 Google Cloud Console 中,转到外部 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

设置负载均衡器

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

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

控制台

开始配置
  1. 在 Google Cloud Console 中,转到负载均衡页面。
    转到“负载均衡”
  2. HTTP(S) 负载均衡下,点击开始配置
  3. 面向互联网或仅限内部下,选择从互联网到我的虚拟机
  4. 全球性或区域级下,选择全球 HTTP(S) 负载均衡器(传统版)
  5. 点击继续
  6. 对于负载均衡器名称,请输入 web-map-httpsweb-map-http 等内容。
  7. 点击后端配置
    1. 创建或选择后端服务和后端存储桶下,选择后端服务 > 创建后端服务
    2. 为您的后端服务添加名称,例如 web-backend-service
    3. 协议下,选择 HTTP
    4. 已命名端口中输入 http
    5. 后端 > 新后端 > 实例组中,选择您的实例组 lb-backend-example
    6. 端口号中输入 80
    7. 保留其他默认设置。
    8. 健康检查下,选择创建健康检查,然后为您的健康检查添加一个名称,例如 http-basic-check
    9. 将协议设置为 HTTP,然后点击保存并继续
    10. 保留其他默认设置。
    11. 点击创建
  8. 主机和路径规则中,保留默认设置。
  9. 前端配置中,使用以下值:
    1. 协议设置为 HTTPSHTTP
    2. IP 地址设置为您之前创建的 lb-ipv4-1
    3. 确保将端口设置为 443 以允许 HTTPS 流量,或者设置为 80 以允许 HTTP 流量。
    4. 如果您选择了 HTTPS,请执行以下操作:
      1. 点击证书,然后选择您的主要 SSL 证书。
      2. (可选)选中启用从 HTTP 到 HTTPS 的重定向复选框以启用从端口 80 到端口 443 的重定向。

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

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

    5. 点击完成
  10. 点击检查并最终确定
  11. 配置完负载均衡器后,点击创建
  12. 等待负载均衡器完成创建。

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

  13. 点击负载均衡器的名称。
  14. 负载均衡器详情屏幕上,记下负载均衡器的 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
        

设置 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
        

在外部 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 Console 中,转到负载均衡页面。

    转到“负载均衡”页面

  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

后续步骤