设置 HTTPS 负载平衡器

本指南演示了如何创建符合以下条件的 Google Cloud HTTPS 负载平衡器:

  • 根据请求网址路径选择后端服务(基于内容的负载平衡)。
  • 将请求路由到靠近客户端的后端(跨区域负载平衡)。

在开始之前,请确保您已熟悉 HTTP(S) 负载平衡概念。

如需查看简化示例,请参阅设置简单的外部 HTTP 负载平衡器设置简单的外部 HTTPS 负载平衡器。如需查看高级路由示例(例如 HTTP 重写和重定向),请参阅为外部 HTTP(S) 负载平衡器设置流量管理

概览

本指南介绍如何创建负载平衡器,该负载平衡器根据请求网址中的路径引导流量并平衡多个区域的流量。您将在美国(us-central1-b 地区)和欧盟(eu-west1-b 地区)这两个区域总共创建八个 Compute Engine 实例,然后创建一个负载平衡器,用于将流量路由到这些实例。

按照说明完成操作后,您的负载平衡器配置如下:

  • 包含以 /video 开头的网址路径的流量会路由到一个后端服务。
  • 包含与上述格式不匹配的网址路径的流量会路由到另一个后端服务。

在本方法指南文档中,您将创建如下图所示的配置:

基于内容的 HTTPS 负载平衡和跨区域的 HTTPS 负载平衡(点击放大)
基于内容的 HTTPS 负载平衡和跨区域的 HTTPS 负载平衡(点击可放大)

图中事件顺序如下:

  1. 客户端访问 https://www.example.com/video/concert 网址,并向转发规则中定义的外部 IP 地址发送内容请求。请求可以使用 IPv4 或 IPv6;这两种协议有相应的转发规则。
  2. 转发规则将请求定向到目标 HTTPS 代理。
  3. 目标代理使用网址映射中指定的规则来确定用于接收请求的后端服务。包含 /video 的请求(例如 https://www.example.com/video/concert)会发送到 video-backend-service。其他任何网址路径都会发送到默认服务 web-backend-service
  4. 负载平衡器根据后端服务的实例组加载情况以及与客户端的邻近程度,确定哪个实例组应该处理请求,并将请求定向到该组中的某个实例。
  5. 该实例提供每个用户请求的内容。video 实例提供视频内容,而 www 实例则提供其他所有内容。

在此示例中,负载平衡器会接受来自客户端的 HTTPS 请求,并作为代理将这些请求以 HTTP 格式发送到后端。您还可以将负载平衡器配置为接受 HTTP 请求,以及在将请求代理到后端时使用 HTTPS。

准备工作

本指南中的说明需要用到项目。 如果您还没有项目,请立即设置一个。 这些说明将指导您创建自定义模式虚拟私有云 (VPC) 网络。 您还必须设置自定义防火墙规则,以允许流量到达实例。

如果您希望通过命令行进行操作,请安装 gcloud 命令行工具。如需了解该工具的概念信息和安装信息,请参阅 gcloud 概览

权限

要完成本指南中的步骤,您必须拥有在项目中创建 Compute Engine 实例的权限。您必须拥有项目的 Owner 或 Editor 角色,或者必须拥有以下 Compute Engine IAM 角色

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

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

设置

可选:创建新项目

建议拥有 resourcemanager.projects.create 权限的用户先创建一个新项目,然后再按照本方法指南的其余说明操作。这样可以简化本指南末尾的清理工作。

配置网络和子网

在此示例中,请使用以下 VPC 网络、区域和子网:

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

  • 两个不同区域中的子网:

    • us-subnet 使用 10.1.10.0/24 作为其主要 IP 地址范围,并且位于 us-central1 区域
    • eu-subnet 使用 10.1.11.0/24 作为其主要 IP 地址范围,并且位于 europe-west1 区域

如需创建示例网络和子网,请按照以下步骤操作:

控制台

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击创建 VPC 网络
  3. 输入 lb-network 作为名称
  4. 子网部分,创建第一个子网:
    • 子网创建模式设置为自定义
    • 新子网部分中,输入以下信息:
      • 名称us-subnet
      • 区域us-central1
      • IP 地址范围10.1.10.0/24
      • 点击完成
  5. 仍然在子网部分,点击添加子网并创建第二个子网:
    • 新子网部分中,输入以下信息:
      • 名称eu-subnet
      • 区域europe-west1
      • IP 地址范围10.1.11.0/24
      • 点击完成
  6. 点击创建

gcloud

  1. 创建自定义 VPC 网络:

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 创建 us-subnet

    gcloud compute networks subnets create us-subnet \
      --network=lb-network \
      --range=10.1.10.0/24 \
      --region=us-central1
    
  3. 创建 eu-subnet

    gcloud compute networks subnets create eu-subnet \
      --network=lb-network \
      --range=10.1.11.0/24 \
      --region=europe-west1
    

配置防火墙规则

默认的拒绝入站流量规则会阻止传入后端实例的流量,包括来自负载平衡器和 Google Cloud 运行状况检查系统的流量。您必须创建新的防火墙规则以替换默认的规则并允许流量到达您的实例。

在此示例中,您将创建以下防火墙规则:

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

  • fw-allow-health-check-and-proxy:入站流量规则,它适用于负载平衡实例,允许来自负载平衡器和 Google Cloud 运行状况检查系统(130.211.0.0/2235.191.0.0/16)的流量。此示例使用目标标记 allow-hc-and-proxy 来标识应该应用该规则的后端虚拟机。

控制台

  1. 转到 Google Cloud Console 中的“防火墙”页面。
    转到“防火墙”页面
  2. 点击创建防火墙规则,创建第一条防火墙规则:
    1. 输入 fw-allow-ssh 作为名称
    2. 网络下,选择 lb-network
    3. 目标下,选择指定的目标标记
    4. 使用 allow-ssh 填充目标标记字段。
    5. 来源过滤条件设置为 IP ranges
    6. 来源 IP 地址范围设置为 0.0.0.0/0
    7. 协议和端口下,选择指定的协议和端口
    8. 选中 tcp 旁边的复选框,然后输入端口号 22
    9. 点击创建
  3. 点击创建防火墙规则,创建第二条防火墙规则:
    1. 输入 fw-allow-health-check-and-proxy 作为名称
    2. 网络下,选择 lb-network
    3. 目标下,选择指定的目标标记
    4. 使用 allow-hc-and-proxy 填充目标标记字段。
    5. 来源过滤条件设置为 IP ranges
    6. 来源 IP 地址范围设置为 130.211.0.0/2235.191.0.0/16
    7. 协议和端口下,选择指定的协议和端口
    8. 选中 tcp 旁边的复选框,然后输入端口号 80,443
    9. 点击创建

gcloud

  1. 创建 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
    
  2. 创建 fw-allow-health-check-and-proxy 规则,以允许负载平衡器和 Google Cloud 运行状况检查与 TCP 端口 80443 上的后端实例进行通信:

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

创建实例

在此示例中,您将创建 8 个虚拟机实例 (VM):4 个用于提供视频内容,4 个用于提供其他所有内容。您使用启动脚本安装 Apache Web 服务器软件,并为每个实例分别提供唯一主页。注意,您可以在虚拟机上使用任何 Web 服务器;为方便起见,本例中安装了 Apache。

控制台

创建后端虚拟机

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 使用以下名称、区域和子网组合重复以下步骤,创建 8 个虚拟机。
    • 名称:www-us-01,区域:us-central1,子网:us-subnet
    • 名称:www-us-02,区域:us-central1,子网:us-subnet
    • 名称:video-us-01,区域:us-central1,子网:us-subnet
    • 名称:video-us-02,区域:us-central1,子网:us-subnet
    • 名称:www-eu-01,区域:europe-west1,子网:eu-subnet
    • 名称:www-eu-02,区域:europe-west1,子网:eu-subnet
    • 名称:video-eu-01,区域:europe-west1,子网:eu-subnet
    • 名称:video-eu-02,区域:europe-west1,子网:eu-subnet
  3. 点击创建实例
  4. 按照第 2 步中的说明设置名称区域。您可以选择该区域中的任何地区;此示例使用 us-central1 中的 us-central1-beurope-west1 中的 europe-west1-b
  5. 启动磁盘部分,确保所选映像为 Debian GNU/Linux 9 Stretch。如有必要,请点击变更以更改映像。
  6. 点击管理、安全、磁盘、网络、单独租用并进行以下更改:

    • 点击网络并添加以下网络标记allow-sshallow-hc-and-proxy
    • 点击网络接口下的“修改”按钮 () 并进行以下变更,然后点击完成
      • 网络lb-network
      • 子网:按照第 2 步中的说明选择子网。
      • 主要内部 IP:临时(自动)
      • 外部 IP:临时
    • 点击管理。在启动脚本字段中,复制并粘贴以下脚本内容。所有八个虚拟机的脚本内容均相同:

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      filter="{print \$NF}"
      vm_zone="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/zone \
      | awk -F/ "${filter}")"
      echo "Page on $vm_hostname in $vm_zone" | \
      tee /var/www/html/index.html
      echo "AliasMatch /video(.*)$ /var/www/html/index.html" | \
      tee /etc/apache2/conf-enabled/video.conf
      systemctl restart apache2
      
  7. 点击创建

创建实例组

  1. 转到 Google Cloud Console 中的“实例组”页面。
    转到“实例组”页面
  2. 使用以下组合重复执行以下步骤,以创建四个非托管式实例组,每个实例组包含两个虚拟机。
    • 实例组:ig-www-us,区域:us-central1,地区:us-central1-b,子网:us-subnet,虚拟机:www-us-01www-us-02
    • 实例组:ig-video-us,区域:us-central1,地区:us-central1-b,子网:us-subnet,虚拟机:video-us-01video-us-02
    • 实例组:ig-www-eu,区域:europe-west1,地区:europe-west1-b,子网:eu-subnet,虚拟机:www-eu-01www-eu-02
    • 实例组:ig-video-eu,区域:europe-west1,地区:europe-west1-b,子网:eu-subnet,虚拟机:video-eu-01video-eu-02
  3. 点击创建实例组,然后选择新建非托管式实例组
  4. 按照第 2 步中的说明设置名称
  5. 位置部分,选择第 2 步中指定的区域和地区。
  6. 对于网络,请输入 lb-network
  7. 对于子网,请输入第 2 步中说明的子网。
  8. 虚拟机实例部分中,添加第 2 步中说明的虚拟机。
  9. 点击创建

gcloud

  1. 使用以下名称、地区和子网组合重复运行以下命令,创建 8 个虚拟机。请相应地替换 vm-name、zone 和 subnet

    • 名称:www-us-01,地区:us-central1-b,子网:us-subnet
    • 名称:www-us-02,地区:us-central1-b,子网:us-subnet
    • 名称:video-us-01,地区:us-central1-b,子网:us-subnet
    • 名称:video-us-02,地区:us-central1-b,子网:us-subnet
    • 名称:www-eu-01,地区:europe-west1-b,子网:eu-subnet
    • 名称:www-eu-02,地区:europe-west1-b,子网:eu-subnet
    • 名称:video-eu-01,地区:europe-west1-b,子网:eu-subnet
    • 名称:video-eu-02,地区:europe-west1-b,子网:eu-subnet
    gcloud compute instances create vm-name \
        --zone=zone \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-hc-and-proxy \
        --subnet=subnet \
        --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    filter="{print \$NF}"
    vm_zone="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/zone \
    | awk -F/ "${filter}")"
    echo "Page on $vm_hostname in $vm_zone" | \
    tee /var/www/html/index.html
    echo "AliasMatch /video(.*)$ /var/www/html/index.html" | \
    tee /etc/apache2/conf-enabled/video.conf
    systemctl restart apache2'
    
  2. 使用以下名称和地区组合重复运行以下命令,以创建四个非托管式实例组。请相应地替换 instance-group-namezone

    • 实例组:ig-www-us,地区:us-central1-b
    • 实例组:ig-video-us,地区:us-central1-b
    • 实例组:ig-www-eu,地区:europe-west1-b
    • 实例组:ig-video-eu,地区:europe-west1-b
    gcloud compute instance-groups unmanaged create instance-group-name \
        --zone=zone
    
  3. 重复运行以下命令四次,并根据以下组合向每个实例组添加两个虚拟机。请相应地替换 instance-group-name、zone 和 instances

    • 实例组:ig-www-us,地区:us-central1-b,实例:www-us-01www-us-02
    • 实例组:ig-video-us,地区:us-central1-b,实例:video-us-01video-us-02
    • 实例组:ig-www-eu,地区:europe-west1-b,实例:www-eu-01www-eu-02
    • 实例组:ig-video-eu,地区:europe-west1-b,实例:video-eu-01video-eu-02
    gcloud compute instance-groups unmanaged add-instances instance-group-name \
        --zone=zone \
        --instances=instances
    

    以下示例展示了向第一个实例组添加两个实例的命令:

    gcloud compute instance-groups unmanaged add-instances ig-www-us \
        --zone=us-central1-b \
        --instances=www-us-01,www-us-02
    

保留外部 IP 地址

现在您的实例已启动并正在运行,请设置负载平衡所需的服务。在本部分中,您将创建两个全局静态外部 IP 地址,您的客户将使用这些地址访问负载平衡器。

控制台

  1. 转到 Google Cloud Console 中的“外部 IP 地址”页面。
    转到“外部 IP 地址”页面
  2. 点击预留静态地址以预留 IPv4 地址。
  3. 指定名称 lb-ipv4-1
  4. 将网络层级设置为优质
  5. IP 版本设置为 IPv4
  6. 类型设置为全局
  7. 点击保留
  8. 再次点击预留静态地址以预留 IPv6 地址。
  9. 指定名称 lb-ipv6-1
  10. 将网络层级设置为优质
  11. IP 版本设置为 IPv6
  12. 确保将类型设置为全局

    在此示例中,负载平衡器使用优质层级网络。 使用标准层级网络的负载平衡器将使用区域 IP 地址。标准层级无法使用 IPv6 地址。

  13. 点击保留

gcloud

  1. 预留 IPv4 地址:

    gcloud compute addresses create lb-ipv4-1 \
      --ip-version=IPV4 \
      --global
    
  2. 预留 IPv6 地址:

    gcloud compute addresses create lb-ipv6-1 \
      --ip-version=IPV6 \
      --global
    

配置负载平衡资源

负载平衡器功能包含多个连接的资源。 在本部分中,您将设置并连接这些资源。这些资源如下:

  • 命名端口 - 负载平衡器使用这些端口将流量导向您的实例组。
  • 运行状况检查 - 用于轮询您的实例,以查看其运行状况是否良好。负载平衡器仅向运行状况良好的实例发送流量。
  • 后端服务 - 用于跟踪容量、会话粘性和运行状况检查状态。后端服务根据容量和实例运行状况将请求定向到后端虚拟机或端点。
  • 网址映射 - 负载平衡器根据请求网址的主机和路径,使用该映射将请求定向到特定的后端服务。
  • SSL 证书资源。 SSL 证书资源包含 SSL 证书信息,负载平衡器在 HTTPS 客户端连接到 TLS 时使用这些信息终止 TLS。您可以使用多个 SSL 证书,这些证书可以是 Google 管理的 SSL 证书或自行管理的 SSL 证书的任意组合。您必须为所使用的每个证书创建一个 SSL 证书资源。
  • 目标 HTTPS 代理 - 负载平衡器使用该代理将您的网址映射和 SSL 证书与您的全局转发规则相关联。
  • 两条全局转发规则(IPv4 和 IPv6 各一条)- 用于保留全局外部 IP 地址资源。全局转发规则将传入的请求转发到目标代理。

控制台

为您的负载平衡器命名

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. HTTP(S) 负载平衡下,点击开始配置
  3. 面向互联网或仅限内部下,选择从互联网到我的虚拟机
  4. 点击继续
  5. 对于负载平衡器的名称,请输入 web-map
  6. 不关闭窗口继续操作。

www 实例配置后端服务和运行状况检查

负载平衡器需要两个后端服务,还需要进行运行状况检查,才能为这两个服务提供相关服务。在此示例中,负载平衡器终止来自客户端的 HTTPS 请求,并使用 HTTP 与后端进行通信。为此,您需要为后端协议和运行状况检查指定 HTTP。

www 实例配置后端服务

  1. 点击后端配置
  2. 创建或选择后端服务下拉菜单中,将鼠标指针悬停在后端服务上,然后选择创建后端服务
  3. 将后端服务的名称设置为 web-backend-service
  4. 确保将后端类型设置为实例组
  5. 协议下拉菜单中,选择 HTTP
  6. 已命名的端口字段中,输入 http
  7. 后端下,将实例组设置为 ig-www-us
  8. 对于负载平衡器和实例之间的流量,请将端口号设置为 80
  9. 保留其余字段的默认值。
  10. 点击新后端窗口底部的完成
  11. 点击添加后端 (Add backend) 并重复相关步骤,但是要选择实例组 ig-www-eu
  12. 不关闭窗口继续操作。

www 实例配置运行状况检查

  1. 运行状况检查下的后端配置窗口中,选择创建运行状况检查另创建一项运行状况检查
  2. 如需创建 HTTP 运行状况检查,请设置以下运行状况检查参数:
    • 名称http-basic-check-www
    • 协议HTTP
    • 端口80
  3. 点击保存并继续
  4. 点击创建

video 实例配置后端和运行状况检查

  1. 重复上述步骤,但将第二个后端服务命名为 video-backend-service,并为其分配 ig-video-usig-video-eu 实例组。
  2. 按照相同的步骤创建运行状况检查,但将运行状况检查命名为 http-basic-check-video。运行状况检查名称不得重复。

配置主机和路径规则

主机和路径规则用于配置负载平衡器的网址映射资源。

  1. 在屏幕左侧列中,点击主机和路径规则
  2. 第一行的右侧列中有 web-backend-service,并且该行已填充主机路径的默认规则 Any unmatched (default)
  3. 确保右侧列中有第二行且该行带有 video-backend-service。如果该行不存在,请点击添加主机和路径规则,然后从右侧列的下拉菜单中选择 video-backend-service。按照如下所示填充其他列:
    1. 主机设置为 *
    2. 路径字段中:
      1. 输入 /video,然后按 Tab 键。
      2. 输入 /video/*,然后按 Tab 键。

配置前端

前端配置部分用于为负载平衡器配置若干资源,包括转发规则和 SSL 证书。此外,它还可以用于选择在客户端和负载平衡器之间使用的协议。

在此示例中,您将在客户端和负载平衡器之间使用 HTTPS,因此您需要一个或多个 SSL 证书资源来配置代理。 请参阅 SSL 证书,了解如何创建 SSL 证书资源。我们建议您使用 Google 管理的证书。

  1. 新建 HTTP(S) 负载平衡器页面的左侧面板中,点击前端配置
  2. 名称字段中,输入 https-content-rule
  3. 协议字段中,选择 HTTPS
  4. 不关闭窗口继续操作。

配置 IPv4 转发规则

  1. IP 版本设置为 IPv4
  2. IP 地址中,选择您之前创建的 lb-ipv4-1
  3. 确保将端口设置为 443,以允许 HTTPS 流量。
  4. 点击证书下拉列表。
    1. 如果您已经拥有要用作主要 SSL 证书的自行管理的 SSL 证书资源,请从下拉菜单中选择该证书。
    2. 否则,请选择创建新证书
    3. 填写名称 www-ssl-cert
    4. 选择上传我的证书创建 Google 托管的证书。如需创建 Google 管理的证书,您必须拥具有一个网域。如果您没有网域,可以上传自己的证书以进行测试。
    5. 如果您选择了上传我的证书,请完成以下步骤。
      1. 公钥证书字段中,执行以下操作之一:
        • 点击上传按钮,然后选择您的 PEM 格式的证书文件。
        • 复制并粘贴 PEM 格式证书的内容。内容必须以 -----BEGIN CERTIFICATE----- 开头,并以 -----END CERTIFICATE----- 结尾。
      2. 对于证书链字段,请执行以下操作之一:
        • 点击上传按钮,然后选择 CA 的证书文件。 此文件应包含中间 CA 证书和根 CA 证书。
        • 复制并粘贴证书链的内容。链中的每个证书必须采用 PEM 格式,从 -----BEGIN CERTIFICATE----- 开头,并以 -----END CERTIFICATE----- 结尾。Google Cloud 不会为您验证证书链 - 您必须自行负责验证。
        • 如果您省略证书链,您的证书应由广受信任的 CA 签名,客户端将自动信任由此类 CA 签名的证书。
      3. 对于私钥证书字段,请执行以下操作之一:
        • 点击上传按钮,然后选择您的私钥。您的私钥必须采用 PEM 格式,且不受密码保护。
        • 复制并粘贴 PEM 格式的私钥内容。RSA 私钥必须以 -----BEGIN RSA PRIVATE KEY----- 开头,并以 -----END RSA PRIVATE KEY----- 结尾。ECDSA 私钥必须以 -----BEGIN EC PRIVATE KEY----- 开头,并以 -----END EC PRIVATE KEY----- 结尾。
      4. 点击创建
    6. 如果您选择了创建 Google 托管的证书,请输入网域
  5. 要添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
    1. 点击添加证书
    2. 证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
  6. 点击完成
  7. 不关闭窗口继续操作。

配置 IPv6 转发规则

  1. 点击添加前端 IP 和端口
  2. 输入 https-content-ipv6-rule 作为名称
  3. 如果要在客户端和负载平衡器之间使用 HTTPS,请在协议字段中选择 HTTPS。如果要在客户端和负载平衡器之间使用 HTTP,请选择 HTTP
  4. IP 版本设置为 IPv6
  5. IP 中,选择您之前创建的 lb-ipv6-1
  6. 必须使用默认端口 443
  7. 如果您已经拥有要使用的 SSL 证书资源,请从证书下拉菜单中选择该证书。如果没有,请选择创建新证书
    1. 填写名称 www-ssl-cert
    2. 在相应的字段中上传您的公钥证书(.crt 文件)、证书链(.csr 文件)、私钥(.key 文件)。
    3. 点击创建
  8. 如需添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
    1. 点击添加证书
    2. 证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
  9. 点击完成

审核并最终完成

  1. 新建 HTTP(S) 负载平衡器页面的左侧面板中,点击检查并最终确定
  2. 比较您的设置与您打算创建的内容。
  3. 如果看起来都正确,请点击创建以创建您的外部 HTTP(S) 负载平衡器。

gcloud

  1. 对于每个实例组,定义一个 HTTP 服务并将端口名称映射到相关端口上。配置完成后,负载平衡服务会将流量转发到已命名的端口。

    gcloud compute instance-groups unmanaged set-named-ports ig-video-us \
        --named-ports http:80 \
        --zone us-central1-b
    
    gcloud compute instance-groups unmanaged set-named-ports ig-www-us \
        --named-ports http:80 \
        --zone us-central1-b
    
    gcloud compute instance-groups unmanaged set-named-ports ig-video-eu \
        --named-ports http:80 \
        --zone europe-west1-b
    
    gcloud compute instance-groups unmanaged set-named-ports ig-www-eu \
        --named-ports http:80 \
        --zone europe-west1-b
    
  2. 创建运行状况检查。 如果您在负载平衡器和后端之间使用 HTTP,请使用 gcloud 命令来处理 HTTP。

    gcloud compute health-checks create http http-basic-check \
        --port 80
    
  3. 为每个内容提供方创建一个后端服务。将 --protocol 字段设置为 HTTP,因为我们使用 HTTP 来转到实例。对于运行状况检查,请使用我们前面创建的 http-basic-check 运行状况检查。

    gcloud compute backend-services create video-backend-service \
        --protocol HTTP \
        --health-checks http-basic-check \
        --global
    
    gcloud compute backend-services create web-backend-service \
        --protocol HTTP \
        --health-checks http-basic-check \
        --global
    
  4. 将您的实例组作为后端添加到后端服务。后端定义其包含的实例组的容量(最大后端利用率或每秒最多查询次数)。在此示例中,请将 balancing-mode 设置为 UTILIZATION,将 max-utilization 设置为 0.8,将 capacity-scaler 设置为 1。如果您希望排空后端服务,请将 capacity-scaler 设置为 0

    添加 ig-video-us 实例组:

    gcloud compute backend-services add-backend video-backend-service \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.8 \
        --capacity-scaler=1 \
        --instance-group=ig-video-us \
        --instance-group-zone=us-central1-b \
        --global
    

    添加 ig-video-eu 实例组:

    gcloud compute backend-services add-backend video-backend-service \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.8 \
        --capacity-scaler=1 \
        --instance-group=ig-video-eu \
        --instance-group-zone=europe-west1-b \
        --global
    

    添加 ig-www-us 实例组:

    gcloud compute backend-services add-backend web-backend-service \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.8 \
        --capacity-scaler=1 \
        --instance-group=ig-www-us \
        --instance-group-zone=us-central1-b \
        --global
    

    添加 ig-www-eu 实例组:

    gcloud compute backend-services add-backend web-backend-service \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.8 \
        --capacity-scaler=1 \
        --instance-group=ig-www-eu \
        --instance-group-zone=europe-west1-b \
        --global
    
  5. 创建网址映射将传入请求路由到相应的后端服务。在此示例中,通过 --path-rules 标志定义的请求路径映射会根据发送到您网站的每个请求中的网址路径拆分流量。与 --path-rules 列表中条目不匹配的流量将发送到 --default-service flag 中的条目。

    1. 创建网址映射:

      gcloud compute url-maps create web-map \
          --default-service web-backend-service
      
    2. 将路径匹配程序添加到您的网址映射并定义您的请求路径映射:

      gcloud compute url-maps add-path-matcher web-map \
          --default-service web-backend-service \
          --path-matcher-name pathmap \
          --path-rules="/video=video-backend-service,/video/*=video-backend-service"
      
  6. 创建要在 HTTPS 代理中使用的 SSL 证书资源。如需创建 Google 管理的证书,您必须拥具有一个网域。如果您没有网域,则可以使用自签名 SSL 证书进行测试。如需了解详情,请参阅 SSL 证书类型

    如果您要使用多个 SSL 证书,则必须为每个证书创建一个 SSL 证书资源。

    如需创建自行管理的 SSL 证书资源,请运行以下命令:

    gcloud compute ssl-certificates create www-ssl-cert \
        --certificate [CRT_FILE_PATH] \
        --private-key [KEY_FILE_PATH]
    

    如需创建 Google 管理的 SSL 证书资源,请运行以下命令:

    gcloud beta compute ssl-certificates create www-ssl-cert \
      --domains [DOMAIN]
    
  7. 创建一个目标 HTTPS 代理将请求路由到您的网址映射。该代理属于负载平衡器,保存用于 HTTPS 负载平衡的 SSL 证书,因此您还需要在此步骤中加载证书。

    gcloud compute target-https-proxies create https-lb-proxy \
        --url-map web-map --ssl-certificates www-ssl-cert
    
  8. 创建两个全局转发规则(分别用于您创建的两个 IP 地址),将传入请求路由到代理。

    gcloud compute forwarding-rules create https-content-rule \
        --address=lb-ipv4-1\
        --global \
        --target-https-proxy=https-lb-proxy \
        --ports=443
    
    gcloud compute forwarding-rules create https-content-ipv6-rule \
        --address=lb-ipv6-1 \
        --global \
        --target-https-proxy=https-lb-proxy \
        --ports=443
    

创建全局转发规则后,您的配置可能需要花费几分钟时间才能传播到全球范围。

将流量发送到您的实例

现在您已经配置了负载平衡服务,您可以开始将流量发送到转发规则并会发现流量进入不同的实例。

控制台和网络浏览器

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 点击 web-map,展开您刚创建的负载平衡器。
  3. 后端部分中,确认实例运行状况良好。运行状况良好列应会填充相应信息,指示每个实例组(共 4 个)中的两个实例运行状况均良好。否则,请先尝试重新加载页面。Cloud Console 可能需要一些时间才能指示实例运行状况良好。如果后端在几分钟后看起来运行状况不佳,请检查防火墙配置以及分配给后端实例的网络标记集。

  4. 记录负载平衡器的 IPv4 和 IPv6 地址:

    1. 转到 Google Cloud Console 中的“外部 IP 地址”页面。
      转到“外部 IP 地址”页面
    2. 名称下,找到名为 lb-ipv4-1lb-ipv6-1 的地址,然后记录外部地址列中的关联值。
  5. 如果您使用的是 Google 管理的证书,请执行下列操作:

    1. 创建以下 DNS 记录:

    2. 请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态

  6. 转到以下其中一项,以使用网络浏览器测试负载平衡器:

    • https://<var>ip-address</var>,其中 ip-address 是负载平衡器的 IPv4 地址。如果浏览器显示证书警告,您必须明确指示浏览器信任该证书。出现此警告的原因是证书通常配置了网域(而非 IP 地址)。

    • https://<var>fqdn</var>,其中 fqdn 是您为其配置了 DNS 以指向负载平衡器 IP 地址的完全限定域名 (FQDN)。如果您使用的是自行管理的自签名 SSL 证书或自行管理且由自定义证书授权机构 (CA) 签名的 SSL 证书,则浏览器会显示证书警告,除非您明确将其配置为信任该证书或其 CA。如需详细了解自行管理的证书,请参阅创建私钥和证书

    您的浏览器应该会打开一个页面,其中会显示提供该页面的实例的名称及其地区(例如,Page on www-us-02 in us-central1-b)。

  7. 在浏览器中,转到以下任一位置:

    • https://<var>ip-address</var>/video,其中 ip-address 是负载平衡器的 IPv4 地址。

    • https://<var>fqdn</var>/video,其中 fqdn 是您为其配置了 DNS 以指向负载平衡器 IP 地址的 FQDN。

    您的浏览器应会呈现一个页面,其中的内容显示提供该页面的视频实例的名称及其地区(例如 Page on video-us-02 in us-central1-b

gcloud 和使用 curl

  1. 记录负载平衡器的 IPv4 和 IPv6 地址:

    gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global
    
    gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global
    
  2. 如果您使用的是 Google 管理的证书,请执行下列操作:

    1. 创建以下 DNS 记录:

    2. 请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态

      gcloud beta compute ssl-certificates list
      
  3. 使用 curl 命令测试以下网址的响应。请将 ip-address 替换为负载平衡器的 IPv4 地址

    curl -k https://ip-address
    
    curl -k https://ip-address/video/
    
  4. 使用 curl 命令测试以下网址的响应。请将 ip-address 替换为负载平衡器的 IPv6 地址。对于 IPv6,您必须使用方括号 ([]) 将地址括起来并使用 -g 标志停用全球传播功能(例如 curl -g -6 "https://[2001:DB8::]/"

    curl -k -g -6 https://[ip-address]
    
    curl -k -g -6 https://[ip-address]/video/
    

测试跨区域功能

要模拟位于其他地理位置的用户,您可以连接到其他区域中的某个虚拟机实例,然后从该实例运行 curl 命令以查看请求转到该区域中最接近它的一个实例。

如果您连接到 www-us-01,则运行 curl 命令会显示请求将转到 us-central1 中的实例。输出将如下所示:Page on www-us-02 in us-central1-b

如果您连接到 www-eu-01,则运行 curl 命令会显示请求将转到 europe-west1 中的实例。输出将如下所示:Page on www-eu-02 in europe-west1-b

您可以从位于世界各地的客户端系统执行测试。如果某个区域中的后端运行状况不佳或达到容量上限,则 HTTPS 负载平衡器会自动将流量发送到最接近的下一个区域

其他配置选项

本部分对配置示例进行了详细讲解,提供了一些其他替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。

启用会话亲和性

这些过程演示了如何为每个后端服务配置不同类型的会话亲和性:

  • web-backend-service 的客户端 IP 地址会话亲和性
  • video-backend-service 的 HTTP Cookie 会话亲和性

启用客户端 IP 亲和性后,负载平衡器会根据从客户端的 IP 地址创建的哈希,将特定客户端的请求定向到同一后端虚拟机。

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

控制台

要为 web-backend-service 启用客户端 IP 会话亲和性,请执行以下操作:

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 点击后端
  3. 点击 web-backend-service(您为此示例创建的其中一个后端服务的名称),然后点击修改
  4. 后端服务详情页面上,点击高级配置
  5. 会话亲和性下,从菜单中选择客户端 IP
  6. 点击保存

要为 video-backend-service 启用生成的 Cookie 会话亲和性,请执行以下操作:

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 点击后端
  3. 点击 video-backend-service(您为此示例创建的其中一个后端服务的名称),然后点击修改
  4. 后端服务详情页面上,点击高级配置
  5. 会话亲和性下,从菜单中选择生成的 Cookie
  6. 点击更新

gcloud

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

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

使用以下 gcloud 命令更新 video-backend-service 后端服务,指定生成的 Cookie 会话亲和性:

gcloud compute backend-services update video-backend-service \
    --session-affinity=GENERATED_COOKIE \
    --global

API

要设置客户端 IP 会话亲和性,请向 backendServices/patch 方法发出 PATCH 请求。

PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/web-backend-service
{
  "sessionAffinity": "CLIENT_IP"
}

要设置生成的 Cookie 会话亲和性,请向 backendServices/patch 方法发出 PATCH 请求。

PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/video-backend-service
{
  "sessionAffinity": "GENERATED_COOKIE"
}

从后端虚拟机中移除外部 IP 地址

Google Cloud HTTP(S) 负载平衡使用后端的内部 IP 地址和特殊的负载平衡器路由与后端进行通信。后端实例不需要使用外部 IP 地址与负载平衡器进行通信。您可以通过从后端实例中移除外部 IP 地址来提高安全性。

要从后端实例移除外部 IP 地址,请按照这些指示操作。

如果您需要使用 SSH 连接到没有外部 IP 地址的后端实例,请参阅连接到没有外部 IP 地址的实例

清理

完成本 HTTP(S) 负载平衡教程后,您可以删除自己创建的 Cloud Load Balancing 资源,这样您以后就不必继续为这些资源付费了。如果这些资源是在自己的项目中创建的,则您可以删除整个项目。否则,您可以逐个删除这些资源。

删除项目

控制台

  1. 转到 Google Cloud Console 中的“项目”页面。
    转到“项目”页面
  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入 project-id,然后点击关闭以删除项目

gcloud

运行以下命令,将 project_id 替换为您的项目 ID:

gcloud projects delete project-id

逐个删除资源

控制台

删除负载平衡器

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 选中 web-map 旁边的复选框。
  3. 点击页面顶部的删除按钮。
  4. 选中其他所有资源(包括后端服务、运行状况检查和 SSL 证书)旁边的复选框。
  5. 点击删除负载平衡器和所选的资源

删除实例组

  1. 转到 Google Cloud Console 中的“实例组”页面。
    转到“实例组”页面
  2. 选中顶部名称旁边的复选框,以选择所有实例组。
  3. 点击删除
  4. 在确认窗口中,点击删除

释放外部 IP 地址

  1. 转到 Google Cloud Console 中的“外部 IP 地址”页面。
    转到“外部 IP 地址”页面
  2. 选中 lb-ipv4-1lb-ipv6-1 旁边的复选框。
  3. 点击释放静态地址
  4. 在确认窗口中,点击删除

删除防火墙规则

  1. 转到 Google Cloud Console 中的“防火墙”页面。
    转到“防火墙”页面
  2. 选中 fw-allow-health-check-and-proxyfw-allow-ssh 旁边的复选框。
  3. 点击删除
  4. 在确认窗口中,点击删除

删除虚拟机实例

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 选中顶部名称旁边的复选框,以选择所有实例。
  3. 点击删除
  4. 在确认窗口中,点击删除

删除 VPC 网络

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击 lb-network
  3. 在网络详细信息页面上,点击删除 VPC 网络
  4. 在确认窗口中,点击删除

gcloud

删除负载平衡器

如需删除负载平衡器,您需要删除它的每个组件。

  1. 删除转发规则:

    gcloud compute forwarding-rules delete https-content-rule \
        --global
    
    gcloud compute forwarding-rules delete https-content-ipv6-rule \
        --global
    
  2. 删除全局外部 IP 地址:

    gcloud compute addresses delete lb-ipv4-1 \
        --global
    
    gcloud compute addresses delete lb-ipv6-1 \
        --global
    
  3. 删除目标代理:

    gcloud compute target-https-proxies delete https-lb-proxy
    
  4. 删除 SSL 证书:

    gcloud compute ssl-certificates delete www-ssl-cert
    
  5. 删除网址映射:

    gcloud compute url-maps delete web-map
    
  6. 删除后端服务:

    gcloud compute backend-services delete web-backend-service \
        --global
    
    gcloud compute backend-services delete video-backend-service \
        --global
    
  7. 删除运行状况检查:

    gcloud compute health-checks delete http-basic-check
    

您已删除所有负载平衡器资源。

删除实例组

使用以下名称和地区组合重复运行以下命令,以删除四个非托管式实例组。请相应地替换 instance-group-namezone

  • 名称:ig-www-us,地区:us-central1-b
  • 名称:ig-video-us,地区:us-central1-b
  • 名称:ig-www-eu,地区:europe-west1-b
  • 名称:ig-video-eu,地区:europe-west1-b
gcloud compute instance-groups unmanaged delete instance-group-name \
   --zone=zone

删除虚拟机实例

使用以下名称和地区组合重复运行以下命令,以删除八个虚拟机。请相应地替换 vm-name 和 zone

  • 名称:www-us-01,地区:us-central1-b
  • 名称:www-us-02,地区:us-central1-b
  • 名称:video-us-01,地区:us-central1-b
  • 名称:video-us-02,地区:us-central1-b
  • 名称:www-eu-01,地区:europe-west1-b
  • 名称:www-eu-02,地区:europe-west1-b
  • 名称:video-eu-01,地区:europe-west1-b
  • 名称:video-eu-02,地区:europe-west1-b
gcloud compute instances delete vm-name \
   --zone=zone

删除防火墙规则

删除两条防火墙规则:

gcloud compute firewall-rules delete fw-allow-health-check-and-proxy
gcloud compute firewall-rules delete fw-allow-ssh

删除 VPC 网络

  1. 删除 us-subnet

    gcloud compute networks subnets delete us-subnet \
    --region=us-central1
    
  2. 删除 eu-subnet

    gcloud compute networks subnets delete eu-subnet \
    --region=europe-west1
    
  3. 删除 VPC 网络:

    gcloud compute networks delete lb-network
    

您已删除在此项目中设置的所有资源。

后续步骤