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


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

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

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

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

目标

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

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • Compute Engine

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

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

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

  4. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

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

应用架构

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

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

启动 Web 应用

本教程以存储在 GitHub 上的 Web 应用为例。如果您想详细了解该应用的实现方式,请参阅 GitHub 上的 GoogleCloudPlatform/python-docs-samples 仓库。

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

创建 VPC 网络

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

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

  1. 在 Google Cloud Console 中,转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 名称下,输入 web-app-vpc

  4. 子网创建模式设置为自动

  5. 点击页面底部的创建

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

创建防火墙规则

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

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

    转到防火墙

  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. 在 Google Cloud Console 中,转到实例模板页面。

    转到“实例模板”

  2. 点击创建实例模板

  3. 名称下,输入 load-balancing-web-app-template

  4. 机器配置下,将机器类型设置为 e2-micro

  5. 防火墙下,选择允许 HTTP 流量

  6. 点击网络、磁盘、安全、管理、单独租用以查看高级设置。

  7. 点击管理标签页。在自动化下,输入以下启动脚本

    sudo apt update && sudo apt -y install git gunicorn3 python3-pip
    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 应用。

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

  9. 点击创建

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

创建区域托管实例组

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

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

    进入“实例组”

  2. 点击创建实例组

  3. 选择新的代管式实例组(无状态)

  4. 对于名称,输入 load-balancing-web-app-group

  5. 对于实例模板,请选择 load-balancing-web-app-template

  6. 实例数设置为 6。 如果此字段已停用,请先关闭自动扩缩功能。

  7. 对于位置,选择多个可用区

  8. 对于区域,选择 us-central1

  9. 对于可用区,请从下拉列表中选择以下可用区:

    • us-central1-b
    • us-central1-c
    • us-central1-f
  10. 选择 Allow instance redistribution

  11. 对于自动扩缩模式,选择关闭:不自动扩缩

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

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

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

      演示 Web 应用,其中列出了有关实例的信息并包含操作按钮。

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

配置负载平衡器

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

保留静态 IP 地址

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

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

    转到“外部 IP 地址”

  2. 点击保留静态地址

  3. 名称下,输入 web-app-ipv4

  4. IP 版本设置为 IPv4

  5. 类型设置为全局

  6. 点击保留

创建负载平衡器

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

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

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

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

开始配置

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

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 负载均衡器的类型字段中,选择应用负载均衡器 (HTTP/HTTPS),然后点击下一步
  4. 公共或内部字段中,选择公共(外部),然后点击下一步
  5. 全球或单个区域部署字段中,选择最适合全球性工作负载,然后点击下一步
  6. 负载均衡器世代字段中,选择全球外部应用负载均衡器,然后点击下一步
  7. 点击配置

基本配置

  1. 负载均衡器名称字段中,输入 web-app-load-balancer

后端配置

  1. 创建全球外部应用负载均衡器页面的左侧面板中,点击后端配置
  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 秒。这定义了 Google Cloud 等待探测响应的时间。其值必须小于或等于检查间隔时间。
      3. 状况良好判断阈值设置为连续成功 2 次。这定义了要将实例视为运行状况良好必须成功的连续探测次数。
      4. 状况不佳判断阈值设置为连续失败 2 次。这定义了要将实例视为运行状况不佳所必须失败的连续探测次数。
    7. 点击保存并继续以创建健康检查。

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

前端配置

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

检查并最终确定

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

    1. 创建全球外部应用负载均衡器页面的左侧面板中,点击检查并最终确定
    2. 检查并最终确定页面上,验证以下后端设置:

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

  2. 创建全球外部应用负载均衡器页面的左侧面板中,点击创建以完成负载均衡器的创建。

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

模拟地区服务中断

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

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

    1. 在 Google Cloud Console 中,转到 Cloud Shell

      打开 Cloud Shell

      Cloud Shell 会在 Google Cloud 控制台的一个窗格中打开。该会话可能需要几秒钟来完成初始化。

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

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

        gcloud compute forwarding-rules describe web-app-ipv4-frontend --global
        

        从输出结果中复制 EXTERNAl_IP_ADDRESS

        IPAddress: EXTERNAl_IP_ADDRESS
        ...
        
      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. 在 Google Cloud 控制台中,转到防火墙页面。

      转到防火墙

    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. 在 Google Cloud Console 中,转到实例组页面。

      转到“实例组”

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

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

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

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

    1. 在 Google Cloud Console 中,转到负载平衡页面。

      转到“负载平衡”

    2. 名称下,点击 web-app-load-balancer 以展开刚刚创建的负载平衡器。

    3. 如需通过外部静态 IP 地址连接到 Web 应用,请查看前端IP:端口下的内容,然后复制 IP 地址。然后,打开新的浏览器标签页并将 IP 地址粘贴到地址栏中。此时应该显示演示 Web 应用:

      演示 Web 应用。

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

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

清除数据

完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。

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

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

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

删除特定资源

删除负载平衡器

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

    转到“负载平衡”

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

  3. 点击页面顶部的 删除

  4. 在新窗口中,选中所有复选框。然后,点击删除负载平衡器和所选的资源,以确认删除。

删除静态外部 IP 地址

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

    转到“外部 IP 地址”

  2. 点击 web-app-ipv4 旁边的复选框。

  3. 点击页面顶部的 释放静态地址。在新窗口中,点击删除以确认删除。

删除实例组

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

    转到“实例组”

  2. 选取您的 load-balancing-web-app-group 实例组对应的复选框。
  3. 如需删除实例组,请点击删除

删除实例模板

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

    转到“实例模板”

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

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

删除 VPC 网络

  1. 在 Google Cloud Console 中,转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 点击 web-app-vpc

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

后续步骤