为 Microsoft IIS 网络服务器设置跨区域负载均衡


本教程介绍如何使用 外部应用负载均衡器将流量分配到在不同区域预配的 Compute Engine 虚拟机上运行的 Microsoft Internet Information Services (IIS) Web 服务器

目标

本教程介绍如何对网站 www.example.com 的流量进行负载均衡,并确保:

  • 传入请求会被路由到最近的区域。
  • 如果实例出现故障或达到其容量,则负载均衡器会将请求路由到同一区域或不同区域中的其他响应实例。

此场景的配置使用通过单个全局 IP 地址接收请求的外部应用负载均衡器。此 IP 地址可以通过连接类型(即 HTTP 或 HTTPS)路由每个传入的请求。对于 HTTPS 请求,负载平衡器会在发送请求的客户端和负载平衡器之间执行 SSL/TLS 加密。

下图显示了负载平衡器架构:

跨区域负载平衡。

请注意,负载平衡器包含多个组件,以实现最大可配置性。有关每个组件的功能说明,请参阅外部应用负载均衡器概览

本教程介绍了如何完成以下任务来实现目标:

  • 设置后端实例。
  • 创建并配置负载均衡服务。
  • 将流量发送到后端。
  • 限制对后端的访问权限。
  • 模拟中断。

费用

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

  • Compute Engine 虚拟机 (VM) 实例
  • Compute Engine Persistent Disk
  • 可选:Google 管理的 SSL 证书
  • Windows Server 2016 机器映像

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

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

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

    转到“项目选择器”

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

  4. 启用 Compute Engine, BigQuery, and Cloud Firestore API。

    启用 API

  5. 安装 Google Cloud CLI。
  6. 如需初始化 gcloud CLI,请运行以下命令:

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

    转到“项目选择器”

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

  9. 启用 Compute Engine, BigQuery, and Cloud Firestore API。

    启用 API

  10. 安装 Google Cloud CLI。
  11. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  12. 或者,您可以使用 Google Cloud 控制台上的 Cloud Shell 与 Google Cloud 交互,在这种情况下,您不必安装 Google Cloud CLI。
  13. 安装远程桌面协议 (RDP) 客户端。如需了解详情,请参阅 Microsoft 远程桌面客户端。如果您已安装 RDP 客户端,则可以跳过此任务。
  14. 确定要在其中预配资源的可用区和区域。 此架构图显示美国和欧盟区域的不同可用区中部署的资源。仅供参考。您可以在自己选择的任何区域/可用区中部署资源。
  15. 可选:阅读并了解外部应用负载均衡器概览

设置后端实例

在本节中,您将在不同的区域中创建两个后端服务。每个后端服务将包括两个后端实例,每个后端实例均在 Windows Server 2016 上运行一个 Microsoft IIS 网络服务器。为避免对每个服务器进行费力的手动配置,您将从一个服务器实例创建磁盘映像,然后使用此映像创建其他服务器实例。

创建和配置 Compute Engine 实例

如需创建用作来源映像的实例,请执行以下操作:

从 Google Cloud Marketplace 中,在您选择的可用区中启动在 Compute Engine 上运行 Microsoft IIS 的 Windows Server 2016 实例,并设置防火墙规则以允许外部 HTTP、HTTPS 和 RDP 流量进入您的来源映像实例:

  1. 在 Google Cloud 控制台中,转到 ASP.NET Framework Cloud Marketplace 页面。

    转到 Cloud Marketplace

  2. 点击启动

  3. 部署名称字段中,输入 src-img

  4. 可用区字段中,选择要部署映像的可用区。

  5. Windows Server 操作系统版本字段中,选择 2016

  6. 网络 - 防火墙部分中,仅选择以下选项:

    • 允许 HTTP 流量
    • 允许 HTTPS 流量
    • Allow RDP traffic

  7. 接受服务条款,然后点击部署

  8. 创建 Compute Engine 实例时,请等待。

配置源映像实例

如需配置新的来源映像实例,请在来源映像实例上创建一个新的 Windows 用户并建立 RDP 连接:

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    打开“虚拟机实例”

  2. 点击来源映像实例的名称 (src-img)。

  3. 点击设置 Windows 密码

  4. 设置新的 Windows 密码对话框中,添加用户名,然后点击设置以在实例上创建用户账号。

  5. 复制提供的密码并关闭对话框。

  6. 点击 RDP 下拉列表,然后选择下载 RDP 文件选项以为您的实例下载 RDP 文件。 使用此文件通过 RDP 客户端连接到实例。如需了解详情,请参阅 Microsoft 远程桌面客户端

与源映像实例建立 RDP 连接后,请在 IIS 默认网络目录中添加默认主页:

  1. 在源映像实例上,以管理员身份打开 PowerShell。

  2. 在默认的 IIS 网络目录 C:\inetpub\wwwroot 中创建新主页:

    Echo '<!doctype html><html><body><h1>Hello World!</h1></body></html>' > C:\inetpub\wwwroot\index.html
    

验证您的来源映像实例是否可以传送内容

在 Google Cloud Console 中,转到虚拟机实例页面。

转到虚拟机实例

点击实例的外部 IP 地址以验证实例是否正在传送您先前创建的主页。

从来源映像实例创建可重复使用的 Windows Server 2016 映像

首先验证源映像实例是否已进行正确配置,并且能够传送内容,然后从实例的根永久性磁盘创建可重复使用的磁盘映像:

  1. 在源映像实例上,以管理员身份打开 PowerShell。
  2. 运行以下命令,让系统准备好进行克隆:

    GCESysprep
    

    GCESysprep 操作完成后,您将自动断开与 RDP 会话的连接。

  3. 在本地机器上,运行以下命令以删除来源实例,同时保留它的根永久性磁盘:

    gcloud compute instances delete src-img \
       --keep-disks=boot \
       --zone=INSTANCE_ZONE
    

    INSTANCE_ZONE 替换为来源实例的可用区。

  4. 删除实例后,请利用保留的根永久性磁盘创建新映像:

    gcloud compute images create win-be-img \
       --source-disk=src-img \
       --source-disk-zone=IMAGE_ZONE
    

    IMAGE_ZONE 替换为要在其中创建来源映像的可用区。

使用源映像创建实例模板

使用已配置的 Windows Server 上的磁盘映像作为实例模板的来源映像。稍后,您将配置两个代管式实例组以将此模板用于新实例。

在本地机器上,运行以下命令,以创建将 win-be-img 用作来源映像并将 rdp-tagwww-tag 用作实例标记的实例模板:

gcloud compute instance-templates create win-be-tmpl \
    --tags=rdp-tag,www-tag \
    --image=win-be-img

为每个区域创建代管式实例组

在每个区域中,创建代管式实例组。创建每个实例组后,实例组会根据您先前定义的实例模板自动填充两个相同的实例。稍后,您将配置负载平衡器以将这些实例组视为后端目标。

要创建托管实例组,请执行以下操作:

  1. 在本地机器上,运行以下命令,以在创建映像的可用区中创建新的代管式实例组,并在该实例组中自动填充两个相同的实例:

    gcloud compute instance-groups managed create MANAGED_INSTANCE_GROUP_NAME_1 \
       --base-instance-name=BASE_INSTANCE_NAME_1 \
       --size=2 \
       --zone=ZONE_1 \
       --template=win-be-tmpl
    

    请替换以下内容:

    • MANAGED_INSTANCE_GROUP_NAME_1:代管式实例的名称
    • BASE_INSTANCE_NAME_1:基本实例的名称
    • ZONE_1:要在其中部署代管式实例的可用区
  2. 在第二个可用区中创建代管式实例组:

    gcloud compute instance-groups managed create MANAGED_INSTANCE_GROUP_NAME_2 \
       --base-instance-name=BASE_INSTANCE_NAME_2 \
       --size=2 \
       --zone=ZONE_2 \
       --template=win-be-tmpl
    

    替换以下内容:

    • MANAGED_INSTANCE_GROUP_NAME_2:代管式实例的名称
    • BASE_INSTANCE_NAME_2:基本实例的名称
    • ZONE_2:要在其中部署代管式实例的可用区

验证后端实例是否正在运行

  1. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 点击每个后端的外部 IP 地址以验证后端是否正在传送您先前创建的主页。

创建和配置负载平衡服务

Compute Engine 负载平衡服务包含多个组件。在本部分中,您将创建这些组件并将它们连接在一起。

  1. 在本地机器上,运行以下命令以创建新的健康检查。您的负载均衡器会使用此检查来验证后端实例的响应能力:

    gcloud compute http-health-checks create basic-check
    
  2. 创建后端服务

    gcloud compute backend-services create BACKEND_SERVICE_NAME \
      --protocol=HTTP \
      --http-health-checks=basic-check \
      --global
    

    BACKEND_SERVICE_NAME 替换为后端服务的名称。

  3. 将实例组添加为后端服务的后端目标:

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
       --instance-group=MANAGED_INSTANCE_GROUP_NAME_1 \
       --instance-group-zone=ZONE_1
    
    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
       --instance-group=MANAGED_INSTANCE_GROUP_NAME_2 \
       --instance-group-zone=ZONE_2
    
  4. 创建一个默认网址映射,用于将所有传入请求引导到所有实例上:

    gcloud compute url-maps create lb-map \
       --default-service=BACKEND_SERVICE_NAME
    
  5. 创建 SSL 证书资源。您的负载平衡器将使用此资源来加密和解密流量。

    如果您已拥有证书授权机构颁发的私钥和 SSL 证书,您可以通过运行以下命令使用它们来创建新的 SSLCertificate 资源。否则,您可以创建并使用 Google 管理的 SSL 证书自签名证书进行测试。如需了解详情,请参阅 SSL 证书

    运行以下命令以创建 SSL 证书资源:

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

    替换以下内容:

    • CRT_FILE_PATH:您的证书的本地文件路径
    • KEY_FILE_PATH:您的私钥的文件路径
  6. 创建目标 HTTP 和 HTTPS 代理以将请求路由到网址映射。 该代理属于负载平衡器,保存用于 HTTPS 负载平衡的 SSL 证书,因此您还需要在此步骤中加载证书:

    gcloud compute target-http-proxies create http-lb-proxy \
       --url-map=lb-map
    
    gcloud compute target-https-proxies create https-lb-proxy \
       --url-map lb-map \
       --ssl-certificate SSL_CERT
    

    根据以下内容替换 SSL_CERT:

    • 如果使用 SSL 证书和私钥创建了 SSLCertificate 资源,请将 SSL_CERT 替换为 www-cert
    • 如果要使用 Google 管理的 SSL 证书或自签名 SSL 证书,请将 SSL_CERT 替换为您的证书的名称。
  7. 要使负载平衡器可靠地接收流量,您需要为负载平衡器的全局转发规则分配全局静态 IP 地址。

    如需创建全局静态 IP 地址资源,请运行以下命令:

    gcloud compute addresses create lb-ip \
       --global \
       --network-tier=PREMIUM
    

    记下 IP 地址。

  8. 创建两个全局转发规则来处理传入的 HTTP 和 HTTPS 请求。每个转发规则都会根据指定的 IP 地址、IP 协议和端口将流量发送到您创建的目标代理之一。

    • 对于全球外部应用负载均衡器,请将 gcloud CLI 命令与 load-balancing-scheme=EXTERNAL_MANAGED 结合使用。此设置提供了高级流量管理功能
    • 对于经典版应用负载均衡器,请使用 load-balancing-scheme=EXTERNAL
    gcloud compute forwarding-rules create http-fwd-rule \
       --load-balancing-scheme=LOAD_BALANCING_SCHEME \
       --network-tier=PREMIUM \
       --address=lb-ip \
       --global \
       --target-http-proxy=http-lb-proxy \
       --ports=80
    
    gcloud compute forwarding-rules create https-fwd-rule \
       --load-balancing-scheme=LOAD_BALANCING_SCHEME \
       --network-tier=PREMIUM \
       --address=lb-ip \
       --global \
       --target-https-proxy=https-lb-proxy \
       --ports=443
    

创建全局转发规则后,您的配置可能需要耗费几分钟时间才能得到传播。如需检查传播进度,您可以在 Google Cloud 控制台中监控配置,也可以在本地机器上运行以下命令:

gcloud compute backend-services get-health BACKEND_SERVICE_NAME

将流量发送到您的后端

现在您已配置了负载平衡服务,您可以开始向转发规则发送流量,随后流量会被分配到不同的实例上。

将流量发送到后端,如下所示:

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

    转到“负载均衡”

  2. 选择前端标签页。

  3. 如需查看默认主页,请点击地址列中的 IP 地址。

限制对后端的访问

确认一切正常后,请修改防火墙规则,限制 HTTP 或 HTTPS 流量只能来自您的负载平衡服务:

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

    转到防火墙

  2. 点击允许从外部访问端口 80 的防火墙规则。

  3. 点击修改以修改防火墙规则。

  4. 来源 IPv4 范围字段中,输入 130.211.0.0/22。这会将防火墙规则允许的源 IP 地址限制在 130.211.0.0/22 范围(这是 HTTPS 负载均衡运行状况检查的 IP 地址范围)内。

  5. 点击保存

  6. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  7. 点击每个实例的外部 IP 地址,以确认实例现在无法访问。

模拟中断

如需查看负载在可响应的实例之间的均衡情况,您可以模拟区域中一个或多个实例的中断。

如需阻止实例接收其他请求,请执行以下操作:

  1. 与实例建立 RDP 连接。
  2. 在实例上,以管理员身份打开 PowerShell。
  3. 运行以下命令,以在实例上创建新的防火墙规则。此命令可阻止来自健康检查器的健康检查流量,并阻止负载均衡器与实例之间的所有新 HTTP 连接:

    netsh advfirewall firewall add rule name="Outage Test" protocol=tcp dir=in localport=80 action=block remoteip=130.211.0.0/22
    
  4. 在本地机器上,运行以下命令以确认实例现在报告的是 UNHEALTHY 状态:

    gcloud compute backend-services get-health BACKEND_SERVICE_NAME
    
  5. 在实例开始报告 UNHEALTHY 状态后,向您的负载平衡器发送一个请求。只有可响应的实例应做出响应。

  6. 模拟完中断后,您可以通过删除防火墙规则来恢复实例连接。在无响应的实例上以管理员身份打开 PowerShell 后,请运行以下命令以删除规则:

    netsh advfirewall firewall delete rule name="Outage Test"
    

清理

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

删除项目

若要避免产生费用,最简单的方法是删除您为本教程创建的项目。

    删除 Google Cloud 项目:

    gcloud projects delete PROJECT_ID

删除各个资源

您需要单独删除针对项目创建的所有资源(映像、实例模板、实例组、健康检查、后端服务、网址映射、HTTP 代理、地址和转发规则)。运行以下命令之前,您无法删除虚拟机实例。

在本地机器上运行以下命令,以删除为本教程创建的资源:

  1. 删除 HTTP/S 转发规则:
    gcloud compute forwarding-rules delete https-fwd-rule --global
    
    gcloud compute forwarding-rules delete http-fwd-rule --global
    
  2. 删除全局静态 IP 地址:
    gcloud compute addresses delete lb-ip --global
    
  3. 删除 HTTP/S 代理:
    gcloud compute target-https-proxies delete https-lb-proxy
    
    gcloud compute target-http-proxies delete http-lb-proxy
    
  4. 删除 SSL 证书:
    gcloud compute ssl-certificates delete SSL_CERT
    
  5. 删除网址映射:
    gcloud compute url-maps delete lb-map
    
  6. 删除后端服务:
    gcloud compute backend-services delete BACKEND_SERVICE_NAME --global
    
  7. 删除 HTTP 运行状况检查:
    gcloud compute http-health-checks delete basic-check
    
  8. 删除代管式实例组:
    gcloud compute instance-groups managed delete MANAGED_INSTANCE_GROUP_NAME_1 --zone=ZONE_1
    
    gcloud compute instance-groups managed delete MANAGED_INSTANCE_GROUP_NAME_2 --zone=ZONE_2
    
  9. 删除实例模板:
    gcloud compute instance-templates delete win-be-tmpl
    
  10. 删除映像:
    gcloud compute images delete IMAGE_NAME
  11. 删除磁盘:
    gcloud compute disks delete DISK_NAME

后续步骤