为高可用性应用使用负载平衡功能

本教程介绍了如何将负载平衡功能与区域托管实例组结合使用,以便将流量从繁忙或不可用的虚拟机实例重定向到其他位置,让您即使在地区服务中断时也能确保高可用性。

区域托管实例组可在多个地区的多个实例上分发应用。全局负载平衡器通过单个 IP 地址跨多个区域引导流量。通过使用这两项服务在多个地区分发应用,您可以帮助确保应用即使在极端情况下(如地区服务中断时)也可用。

负载平衡器可用于引导各种类型的流量。本教程介绍了如何创建可引导外部 HTTP 流量的全局负载平衡器,但其中的大部分内容仍与其他类型的负载平衡器相关。如需了解可以使用负载平衡器引导的其他类型的流量,请参阅 Cloud Load Balancing 的类型

本教程包含一系列详细步骤,说明了如何在区域托管实例组上启动 Web 应用,如何配置网络访问权限,如何创建用于将流量引导至 Web 应用的负载平衡器,以及如何通过模拟地区服务中断来观察负载平衡器。完成本教程需要大约 45 分钟,具体取决于您对这些功能的熟悉程度。

目标

  • 在区域托管实例组上启动演示 Web 应用。
  • 配置可跨多个地区引导 HTTP 流量的全局负载平衡器。
  • 通过模拟地区服务中断来观察负载平衡器的效果。

费用

本教程使用 GCP 的收费组件,包括:

  • Compute Engine

您可使用价格计算器根据您的预计使用情况来估算费用。 GCP 新用户可能有资格免费试用

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 选择或创建 Google Cloud Platform 项目。

    转到“管理资源”页面

  3. 确保您的 Google Cloud Platform 项目已启用结算功能。

    了解如何启用结算功能

应用架构

该应用包括以下 Compute Engine 组件:

  • VPC 网络:GCP 内可通过自己的路由和防火墙规则提供全局连接的虚拟网络。
  • 防火墙规则:借助 GCP 防火墙,您可以允许或拒绝流向您的实例的流量。
  • 实例模板:用于在托管实例组中创建各个虚拟机实例的模板。
  • 区域托管实例组:可跨多个地区运行同一应用的一组虚拟机实例。
  • 全局静态外部 IP 地址:可以在外部网络上访问并且可以挂接到全局资源的静态 IP 地址。
  • 全局负载平衡器:允许后端实例跨多个区域分布的负载平衡器。如果您的用户需要访问相同的应用和内容,并且您希望使用单个 Anycast IP 地址提供访问权限,请使用全局负载平衡器。
  • 运行状况检查:负载平衡器用来评估应用在每个虚拟机实例上的响应能力的政策。

启动 Web 应用

本教程使用一个存储在 GitHub 上的 Web 应用。如果您想详细了解该应用的实现方式,请参阅 Google Cloud Platform GitHub 代码库

通过在实例模板中添加启动脚本的方式在实例组中的每个虚拟机上启动 Web 应用。此外,在专用 VPC 网络中运行实例组,以防止本教程中的防火墙规则干扰您的项目中运行的任何现有资源。

创建 VPC 网络

使用 VPC 网络可防止项目中的现有资源受到您针对本教程创建的资源的影响。 此外,为了限制传入流量,使它必须通过负载平衡器,也需要用到 VPC 网络。

创建 VPC 网络,以封装演示 Web 应用的防火墙规则:

  1. 转到 GCP Console 中的 VPC 网络页面。
    转到“VPC 网络”页面
  2. 点击创建 VPC 网络
  3. 名称下,输入 web-app-vpc
  4. 子网创建模式设置为自动。

  5. 点击页面底部的创建

等到 VPC 网络创建完成后再继续。

创建防火墙规则

VPC 网络创建后,设置防火墙规则以允许 HTTP 流量进入 VPC 网络:

  1. 转到 GCP Console 中的防火墙页面。
    转到“防火墙”页面
  2. 点击创建防火墙规则
  3. 名称下,输入 allow-web-app-http
  4. 网络设置为 web-app-vpc
  5. 目标下,选择网络中的所有实例。
  6. 来源过滤条件设置为 IP ranges
  7. 来源 IP 地址范围下,输入 0.0.0.0/0 以允许所有 IP 地址访问。
  8. 端口和协议下,选择指定的协议和端口。
    选中 tcp 并输入 80允许访问 HTTP 流量
  9. 点击创建

创建实例模板

创建将用于创建一组虚拟机实例的模板。基于模板创建的每个实例都会通过脚本启动演示 Web 应用。

  1. 转到 GCP Console 中的实例模板页面。
    转到“实例模板”页面
  2. 点击创建实例模板
  3. 名称下,输入 load-balancing-web-app-template
  4. 机器配置下,将机器类型设置为 f1-micro
  5. 启动磁盘下,将映像设置为 Debian GNU/Linux 9 (stretch)
  6. 防火墙下,选择允许 HTTP 流量。
  7. 点击管理、安全、磁盘、网络、单独租用以显示高级设置。
  8. 点击管理标签页。在自动化下,输入以下启动脚本

    sudo apt-get update && sudo apt-get install git gunicorn3 python3-pip -y
    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    cd python-docs-samples/compute/managed-instances/demo
    sudo pip3 install -r requirements.txt
    sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon
    

    该脚本用于在实例启动时获取、安装和启动 Web 应用。

  9. 点击网络标签页。在网络下,选择 web-app-vpc。这会强制使用此模板创建的每个实例在先前创建的网络上运行。

  10. 点击创建

等到模板创建完成后再继续。

创建区域托管实例组

如需运行 Web 应用,请使用实例模板创建区域托管实例组:

  1. 转到 GCP Console 中的实例组页面。
    转到“实例组”页面
  2. 点击创建实例组
  3. 名称下,输入 load-balancing-web-app-group
  4. 位置下,选择多个地区。

  5. 区域下,选择 us-central1。

  6. 点击配置地区下拉菜单以显示地区。 选择以下地区:

    • us-central1-b
    • us-central1-c
    • us-central1-f
  7. 实例模板下,选择 load-balancing-web-app-template

  8. 自动扩缩下,选择关闭。

  9. 实例数设置为 6

  10. 实例重新分配下,选择开启。

  11. 自动修复和运行状况检查下,选择不检查运行状况。

  12. 点击创建。这会使您返回实例组页面。

  13. 验证您的实例在正确运行演示 Web 应用,具体步骤如下:

    1. 实例组页面上,点击 load-balancing-web-app-group 以查看该组中的实例。
    2. 外部 IP 下,点击一个 IP 地址以连接到相应实例。 浏览器会打开一个新的标签页,其中显示演示 Web 应用:

      演示 Web 应用的屏幕截图,其中列出了有关实例的信息并具有操作按钮。

      完成后,关闭演示 Web 应用所在的浏览器标签页。

配置负载平衡器

为了使用负载平衡器将流量引导至您的 Web 应用,必须保留一个外部 IP 地址来接收所有传入流量。然后,创建一个负载平衡器,用于接受来自该 IP 地址的流量,并将该流量重定向到实例组。

保留静态 IP 地址

使用全局静态外部 IP 地址为负载平衡器提供单一入口点,以接收所有用户流量。即使您更改或删除任何关联的 GCP 资源,Compute Engine 也会保留静态 IP 地址。这样一来,Web 应用始终具有同一入口点,即使 Web 应用的其他部分可能发生更改也是如此。

  1. 转到 GCP Console 中的外部 IP 地址页面。
    转到“外部 IP 地址”页面
  2. 点击保留静态地址
  3. 名称下,输入 web-app-ipv4
  4. IP 版本设置为 IPv4。
  5. 类型设置为全局。
  6. 点击保留

创建负载平衡器

本部分介绍了创建可引导 HTTP 流量的全局负载平衡器所需的步骤。

此负载平衡器使用前端接收传入流量,使用后端将此流量分配到运行状况良好的实例。由于负载平衡器由多个组件组成,因此此任务分为下列几部分:

  • 后端配置
  • 前端配置
  • 检查并最终确定

完成创建负载平衡器的所有步骤。

  1. 转到 GCP Console 中的创建负载平衡器页面。
    转到“创建负载平衡器”页面
  2. HTTP(S) 负载平衡下,点击开始配置。
  3. 面向互联网或仅限内部下,选择从互联网到我的虚拟机。然后,点击继续。
  4. 对于负载平衡器的名称,请输入 web-app-load-balancer

后端配置

  1. 新建 HTTP(S) 负载平衡器页面的左侧面板中,点击后端配置。
  2. 点击创建或选择后端服务和后端存储分区以打开下拉菜单。点击后端服务,然后点击创建后端服务
  3. 在新窗口中,对于后端应用的名称,输入 web-app-backend
  4. 实例组设置为 load-balancing-web-app-group
  5. 端口号设置为 80。这允许 HTTP 流量在负载平衡器和实例组之间传输。
  6. 平衡模式下,选择利用率。
  7. 点击完成以创建后端。
  8. 为负载平衡器的后端创建运行状况检查:

    1. 运行状况检查下,从下拉菜单中选择创建运行状况检查(或另创建一项运行状况检查)。系统会打开一个新窗口。
    2. 在新窗口中的名称下,输入 web-app-load-balancer-check
    3. 协议设置为 HTTP。
    4. 端口下,输入 80
    5. 对于本教程,将请求路径设置为 /health,这是演示 Web 应用应该响应的路径。
    6. 设置以下运行状况判断标准

      1. 检查间隔设置为 3 秒。这定义了从一次探测开始到下一次探测开始之间的时间间隔。
      2. 超时设置为 3 秒。这定义了 GCP 等待探测响应的时间。其值必须小于或等于检查间隔时间。
      3. 状况良好判断阈值设置为连续成功 2 次。这定义了要将实例视为运行状况良好必须成功的连续探测次数。
      4. 状况不佳判断阈值设置为连续失败 2 次。这定义了要将实例视为运行状况不佳所必须失败的连续探测次数。
    7. 点击保存并继续以创建运行状况检查。

  9. 点击创建以创建后端服务。

前端配置

  1. 新建 HTTP(S) 负载平衡器页面的左侧面板中,点击前端配置。
  2. 前端配置页面的名称下,输入 web-app-ipv4-frontend
  3. 协议设置为 HTTP
  4. IP 版本设置为 IPv4
  5. IP 地址设置为 web-app-ipv4
  6. 端口设置为 80
  7. 点击完成以创建前端。

检查并最终确定

  1. 在创建负载平衡器之前验证负载平衡设置:

    1. 新建 HTTP(S) 负载平衡器页面的左侧面板中,点击检查并最终确定。
    2. 检查并最终确定页面上,验证以下后端设置:

      • 后端服务web-app-backend
      • 端点协议HTTP
      • 运行状况检查web-app-load-balancer-check
      • 实例组load-balancing-web-app-group
    3. 在同一页面上,验证前端使用协议为 HTTP 的 IP 地址。

  2. 新建 HTTP(S) 负载平衡器页面的左侧面板中,点击创建以完成负载平衡器的创建。

您可能需要等待几分钟,以便负载平衡器完成创建。

模拟地区服务中断

您可以通过模拟地区服务中断时的大面积不可用情况来观察负载平衡器的功能。此模拟的工作原理是强制位于指定地区的所有实例在 /health 请求路径上报告运行状况不佳这一状态。当这些实例报告运行状况不佳这一状态时,它们将无法通过负载平衡运行状况检查,从而提示负载平衡器停止将流量引导到其中。

  1. 监控负载平衡器将流量引导至哪些地区。

    1. 在 GCP Console 中使用 Cloud Shell 打开一个终端。

      打开 Cloud Shell

      Cloud Shell 将在 GCP Console 的底部打开。该会话可能需要几秒钟来完成初始化。

    2. 保存负载平衡器的静态外部 IP 地址:

      1. 通过在终端中输入以下命令,从负载平衡器的前端转发规则中获取外部 IP 地址:

        gcloud compute forwarding-rules list | grep web-app-ipv4-frontend
        

        从输出结果中复制 EXTERNAl_IP_ADDRESS

        web-server-ipv4-frontend    EXTERNAl_IP_ADDRESS    TCP    web-app-load-balancer-target-proxy
        
      2. 创建一个本地 bash 变量:

        export LOAD_BALANCER_IP=EXTERNAl_IP_ADDRESS
        

        其中,EXTERNAl_IP_ADDRESS 是您复制的外部 IP 地址。

    3. 如需监控负载平衡器将流量引导至哪些地区,请运行以下 bash 脚本:

      while true
      do
              BODY=$(curl -s "$LOAD_BALANCER_IP")
              NAME=$(echo -n "$BODY" | grep "load-balancing-web-app-group" | perl -pe 's/.+?load-balancing-web-app-group-(.+?)<.+/\1/')
              ZONE=$(echo -n "$BODY" | grep "us-" | perl -pe 's/.+?(us-.+?)<.+/\1/')
      
              echo $ZONE
      done
      

      此脚本将不断尝试通过负载平衡器前端的 IP 地址连接到 Web 应用,并输出 Web 应用针对每个连接从哪个地区运行。

      生成的输出结果应包括 us-central1-bus-central1-cus-central1-f 地区:

      us-central1-f
      us-central1-b
      us-central1-c
      us-central1-f
      us-central1-f
      us-central1-c
      us-central1-f
      us-central1-c
      us-central1-c
      

      保持此端口处于打开状态。

  2. 在监控运行时,开始模拟地区服务中断。

    1. 在 Cloud Shell 中,点击添加 按钮打开第二个终端会话
    2. 为项目 ID 创建一个本地 bash 变量:

      export PROJECT_ID=PROJECT_ID
      

      其中,PROJECT_ID 是当前项目的 ID,它显示在 Cloud Shell 中的每个新行上:

      user@cloudshell:~ (PROJECT_ID)$
      
    3. 为要停用的地区创建本地 bash 变量。如需模拟地区 us-central1-f 出现故障的情况,请使用以下命令:

      export DISABLE_ZONE=us-central1-f
      

      然后,运行以下 bash 脚本。此脚本会导致停用地区中的演示 Web 应用实例对负载平衡器的运行状况检查输出运行状况不佳的响应。运行状况不佳的响应会提示负载平衡器将流量引导离开这些实例。

      export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --filter="zone:($DISABLE_ZONE)" --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "load-balancing-web-app-group")
      for i in $MACHINES;
      do
        NAME=$(echo "$i" | cut -f1 -d,)
        IP=$(echo "$i" | cut -f2 -d,)
        echo "Simulating zonal failure for zone $DISABLE_ZONE, instance $NAME"
        curl -q -s "http://$IP/makeUnhealthy" >/dev/null --retry 2
      done
      

      短暂延迟后,负载平衡器会停止将流量引导至运行状况不佳的地区,因此第一个终端窗口的输出结果会停止列出地区 us-central1-f

      us-central1-c
      us-central1-c
      us-central1-c
      us-central1-b
      us-central1-b
      us-central1-c
      us-central1-b
      us-central1-c
      us-central1-c
      

      这表明负载平衡器仅将流量引导至运行状况良好且响应迅速的实例。

      请使两个终端都保持打开状态。

    4. 在第二个终端中,为要恢复的地区创建本地 bash 变量。如需恢复引导到地区 us-central1-f 的流量,请使用以下命令:

      export ENABLE_ZONE=us-central1-f
      

      然后,运行以下 bash 脚本。此脚本会导致启用地区中的演示 Web 应用实例对负载平衡器的运行状况检查输出运行状况良好的响应。运行状况良好的响应会提示负载平衡器开始将流量重新分配到这些实例。

      export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --filter="zone:($ENABLE_ZONE)" --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "load-balancing-web-app-group")
      for i in $MACHINES;
      do
        NAME=$(echo "$i" | cut -f1 -d,)
        IP=$(echo "$i" | cut -f2 -d,)
        echo "Simulating zonal restoration for zone $ENABLE_ZONE, instance $NAME"
        curl -q -s "http://$IP/makeHealthy" >/dev/null --retry 2
      done
      

      几分钟后,第一个终端窗口的输出结果会再次逐步列出地区 us-central1-f

      us-central1-b
      us-central1-b
      us-central1-c
      us-central1-f
      us-central1-c
      us-central1-c
      us-central1-b
      us-central1-c
      us-central1-f
      

      这表明负载平衡器正在重新将传入流量引导至所有地区。

      完成后关闭这两个终端。

(可选)限制传入流量

创建区域托管实例组后,您可以直接访问每个实例,只需使用其外部临时 IP 地址即可。不过,现在您已准备好负载平衡器和静态外部 IP 地址,您可能需要修改网络防火墙,以使传入流量必须通过负载平衡器。

如果要将传入流量限制为流向负载平衡器,请修改网络防火墙,以停用每个实例的外部临时 IP 地址。

  1. 修改防火墙规则以限制 HTTP 流量,以便只能通过负载平衡器访问 Web 应用:

    1. 转到 GCP Console 中的防火墙页面。
      转到“防火墙”页面
    2. 名称下,点击 allow-web-app-http
    3. 点击修改
    4. 修改来源 IP 地址范围,以仅允许运行状况检查探测请求:

      1. 删除 0.0.0.0/0
      2. 在同一行上,输入 130.211.0.0/22,然后按 Tab 键。
      3. 在同一行上,输入 35.191.0.0/16,然后按 Tab 键。
    5. 点击保存

  2. 验证您无法通过特定实例的外部临时 IP 地址连接到 Web 应用:

    1. 转到 GCP Console 中的实例组页面。
      转到“实例组”页面

    2. 点击 load-balancing-web-app-group 以查看该组中的实例。

    3. 外部 IP 下,点击一个 IP 地址以连接到相应实例。 浏览器会打开一个新的标签页,但 Web 应用无法打开。 (最终,页面将显示超时错误)。

      完成后,关闭实例所在的浏览器标签页。

  3. 验证您可以通过负载平衡器连接到 Web 应用:

    1. 转到 GCP Console 中的负载平衡页面。
      转到“负载平衡”页面
    2. 名称下,点击 web-app-load-balancer 以展开刚刚创建的负载平衡器。
    3. 如需通过外部静态 IP 地址连接到 Web 应用,请查看前端和 IP:端口下的内容,然后复制 IP 地址。然后,打开新的浏览器标签页并将 IP 地址粘贴到地址栏中。这应该显示演示 Web 应用:

      演示 Web 应用的屏幕截图。

      请注意,无论何时刷新页面,负载平衡器都会连接到不同地区中的不同实例。之所以发生这种情况,是因为您没有直接连接到实例;您连接的是负载平衡器,该负载平衡器选择了您要重定向到的实例。

      完成后,关闭演示 Web 应用所在的浏览器标签页。

清理

完成本负载平衡教程后,您可以清理在 GCP 上创建的资源,以免这些资源占用配额并产生费用。以下部分介绍如何删除或关闭这些资源。

如果您为本教程创建了单独的项目,请删除整个项目。否则,如果项目中包含您要保留的资源,则只删除在本教程中创建的资源。

删除项目

  1. 在 GCP Console 中,转到项目页面。

    转到“项目”页面

  2. 在项目列表中,选择您要删除的项目,然后点击删除 delete
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除特定资源

删除负载平衡器

  1. 转到 GCP Console 中的负载平衡页面。
    转到“负载平衡”页面
  2. 点击 web-app-load-balancer 旁边的复选框。
  3. 点击页面顶部的删除
  4. 在新窗口中,选中所有复选框。然后,点击删除负载平衡器和所选的资源,以确认删除。

删除静态外部 IP 地址

  1. 转到 GCP Console 中的外部 IP 地址页面。
    转到“外部 IP 地址”页面
  2. 点击 web-app-ipv4 旁边的复选框。
  3. 点击页面顶部的释放静态地址 。在新窗口中,点击删除以确认删除。

删除实例组

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

    转到“实例组”页面

  2. 点击您的load-balancing-web-app-group实例组旁边的复选框。
  3. 点击页面顶部的删除 delete 以删除实例组。

删除实例模板

  1. 转到 GCP Console 中的实例模板页面。

    转到“实例模板”页面

  2. 点击 load-balancing-web-app-template 旁边的复选框。

  3. 点击页面顶部的删除 。在新窗口中,点击删除以确认删除。

删除 VPC 网络

  1. 转到 GCP Console 中的 VPC 网络页面。

    转到“VPC 网络”页面

  2. 点击 web-app-vpc

  3. 点击页面顶部的删除 。在新窗口中,点击删除以确认删除。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档