使用 Microsoft IIS 后端执行跨区域负载平衡

本教程介绍如何使用 Google Compute Engine 的HTTP(S) 负载平衡器服务,为跨不同 Compute Engine 区域Microsoft Internet Information Services (IIS) 网络服务器分配流量。

使用场景

您需要为网站 www.example.com 的流量执行负载平衡。您希望确保传入的请求被路由到最近的区域;但是,您也希望确保,在发生故障时,或区域中的实例达到容量限制时,请求可以故障转移到下一个最近区域中的正常实例上。

配置完此使用场景后,您将拥有一个 HTTP(S) 负载平衡器,它可通过单个全局 IP 地址接收请求。此 IP 地址将能按连接类型(即 HTTP 或 HTTPS)路由每个传入请求。对于 HTTPS 请求,负载平衡器将在发送请求的客户端和负载平衡器之间实施 SSL/TLS 加密。

下图说明了负载平衡器架构:

跨区域负载平衡图表

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

前提条件

本教程假定您满足以下条件:

设置后端实例

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

创建源映像实例

要创建用作源映像的实例:

  1. 在本地 Windows 机器上,打开 PowerShell。
  2. us-central1 区域中创建新的 Windows Server 2012 实例,并为实例添加 rdp-tagwww-tag 标记。稍后,您将创建针对这些标记的防火墙规则来启用实例的外部访问权限:

    PS C:\> gcloud compute instances create src-img ^
         --zone us-central1-f --image windows-2012-r2 ^
         --tags rdp-tag,www-tag

创建源映像实例后,请设置防火墙规则以允许从外部访问实例:

  1. 创建防火墙规则以允许从外部访问标记为 rdp-tag 的所有实例上的端口 3389。此规则将允许使用 RDP 访问源映像实例以及使用 rdp-tag 标记的任何后续实例:

    PS C:\> gcloud compute firewall-rules create rdp-rule ^
         --allow tcp:3389 --source-ranges 0.0.0.0/0 ^
         --target-tags rdp-tag
  2. 创建另一个防火墙规则,以允许从外部访问标记为 www-tag 的所有实例上的端口 80。此规则将允许源映像实例以及使用 www-tag 标记的任何后续实例发送和接收 HTTP 流量:

     PS C:> gcloud compute firewall-rules create www-rule ^
         --allow tcp:80 --source-ranges 0.0.0.0/0 ^
         --target-tags www-tag

配置源映像实例

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

  1. 在网络浏览器中,访问 GCP Console 中的“虚拟机实例”页面,然后点击源映像实例的名称 (src-img)。
  2. 点击设置 Windows 密码按钮。
  3. 设置新的 Windows 密码对话框中,添加用户名,然后点击设置以在实例上创建用户帐号。
  4. 复制提供的密码并关闭对话框。
  5. 在实例的 Console 页面上,点击 RDP

    • 如果您安装了 Chrome RDP 扩展程序,则会打开扩展程序窗口。确认您要连接到实例,输入用户名和密码,然后点击确定以连接到您的实例。
    • 如果您选择不安装 Chrome RDP 扩展程序,您可以选择下载实例的 RDP 文件。通过使用此文件,您可以使用 Windows 远程桌面连接或首选的第三方客户端连接到实例。

与源映像实例建立 RDP 连接后,请安装 IIS 并添加默认主页:

  1. 在源映像实例上,以管理员身份打开 PowerShell。
  2. 在 PowerShell 中,粘贴以下内容以安装 IIS 服务和依赖项:

    PS C:\> Dism /Online /Enable-Feature /FeatureName:IIS-WebServerRole /FeatureName:IIS-WebServer /FeatureName:IIS-StaticContent /FeatureName:IIS-DefaultDocument /FeatureName:IIS-DirectoryBrowsing /FeatureName:IIS-HttpErrors /FeatureName:IIS-HealthAndDiagnostics /FeatureName:IIS-HttpLogging /FeatureName:IIS-LoggingLibraries /FeatureName:IIS-RequestMonitor /FeatureName:IIS-Security /FeatureName:IIS-RequestFiltering /FeatureName:IIS-HttpCompressionStatic /FeatureName:IIS-WebServerManagementTools /FeatureName:IIS-ManagementConsole /FeatureName:WAS-WindowsActivationService /FeatureName:WAS-ProcessModel /FeatureName:WAS-NetFxEnvironment /FeatureName:WAS-ConfigurationAPI /All
  3. 安装服务后,在 C:\inetpub\wwwroot(IIS 的默认网络目录)中创建一个新的主页:

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

验证您的源映像实例是否能够传送内容

在网络浏览器中,导航到“虚拟机实例”页面。点击实例的外部 IP 以验证实例是否正在传送您先前创建的主页。

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

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

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

     PS C:> GCESysprep

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

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

     PS C:> gcloud compute instances delete src-img --keep-disks boot

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

     PS C:> gcloud compute images create win-be-img --source-disk src-img --source-disk-zone us-central1-f

使用源映像创建实例模板

现在您已从配置的 Windows 服务器创建了磁盘映像,您可以将该映像用作实例模板的源映像。稍后,您将配置两个托管实例组,这些实例组将使用此模板创建新实例。

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

PS C:\> gcloud compute instance-templates create win-be-tmpl ^
    --tags rdp-tag,www-tag ^
    --image win-be-img

为每个区域创建托管实例组

接下来,在每个区域中创建托管实例组。创建每个实例组后,实例组将根据您之前定义的实例模板,在组中填入两个相同的实例。稍后,您将配置负载平衡器以将这些实例组视为后端目标。

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

  1. 在本地机器上,运行以下命令以在地区 us-central1-f 中创建新的托管实例组,并在组中填入两个相同的实例:

     PS C:> gcloud compute instance-groups managed create us-be-group ^
          --base-instance-name us ^
          --size 2 ^
          --zone us-central1-f ^
          --template win-be-tmpl

  2. 在地区 europe-west1-d 中执行相同的操作:

    PS C:\> gcloud compute instance-groups managed create eu-be-group ^
          --base-instance-name eu ^
          --size 2 ^
          --zone europe-west1-d ^
          --template win-be-tmpl

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

在网络浏览器中,导航到“虚拟机实例”页面。点击每个后端的外部 IP 以验证后端是否正在传送您先前创建的主页。

创建和配置负载平衡服务

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

  1. 在本地机器上,运行以下命令以创建新的运行状况检查。您的负载平衡器将使用此运行状况检查来检查后端实例的运行状况:

    PS C:\> gcloud compute http-health-checks create basic-check
  2. 创建后端服务

    PS C:\> gcloud compute backend-services create be-srv ^
          --protocol HTTP --http-health-check basic-check
  3. 将实例组添加为后端服务的后端目标:

    PS C:\> gcloud beta compute backend-services add-backend be-srv ^
          --instance-group us-be-group --zone us-central1-f
    PS C:\> gcloud beta compute backend-services add-backend be-srv ^
          --instance-group eu-be-group --zone europe-west1-d
  4. 创建一个默认网址映射,用于将所有传入请求引导到所有实例上。

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

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

    运行以下命令以创建 SSL 证书资源。将 <crt_file_path> 替换为您的证书的本地文件路径,将 <key_file_path> 替换为您的私钥的文件路径。

    PS C:\> gcloud beta compute ssl-certificates create www-cert ^
    --certificate  --private-key 
  6. 创建目标 HTTP 和 HTTPS 代理以将请求路由到网址映射。该代理属于负载平衡器,保存用于 HTTPS 负载平衡的 SSL 证书,在此步骤中您还可以加载证书。

     PS C:> gcloud compute target-http-proxies create http-lb-proxy ^
          --url-map lb-map
     PS C:> gcloud beta compute target-https-proxies create https-lb-proxy ^
          --url-map lb-map --ssl-certificate www-cert

  7. 要使负载平衡器可靠地接收流量,您需要为负载平衡器的全局转发规则分配全局静态 IP 地址。要创建全局静态 IP 资源,请运行以下命令:

     PS C:> gcloud compute addresses create lb-ip --global

    记下 IP 地址。

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

    将以下命令中的 <lb_ip_addr> 替换为您在上一步中创建的静态 IP 地址:

    PS C:\> gcloud compute forwarding-rules create http-fwd-rule ^
          --address  --global ^
          --target-http-proxy http-lb-proxy --port-range 80
    PS C:\> gcloud beta compute forwarding-rules create https-fwd-rule ^
          --address  --global ^
          --target-https-proxy https-lb-proxy --port-range 443

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

PS C:\> gcloud compute backend-services get-health be-srv

将流量发送到您的后端

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

要向您的后端发送流量,请执行以下操作:

  1. GCP Console 中打开 HTTP(S) 负载平衡器页面
  2. 点击传入流量列中的 IP 地址。此时系统应显示您的默认主页。

限制对后端的访问

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

  1. 在本地计算机上,运行以下命令以更新 www-rule 防火墙规则。将规则允许的源 IP 限制在 130.211.0.0/22 范围内(这是 HTTP(S) 负载平衡运行状况检查的 IP 范围):

    PS C:\> gcloud compute firewall-rules update www-rule ^
           --source-ranges 130.211.0.0/22 ^
           --target-tags www-tag
  2. 在网络浏览器中,导航到“虚拟机实例”页面

  3. 点击每个实例以确认现在无法访问实例。

模拟中断

您可以模拟区域中一个或多个实例出现的中断,以便观察负载将如何在剩余的正常实例之间进行平衡。

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

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

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

    PS C:\> gcloud compute backend-services get-health be-srv
  5. 在实例开始报告 UNHEALTHY 状态后,向您的负载平衡器发送一个请求。只有状况正常的实例才会给予响应。

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

    PS C:\> netsh advfirewall firewall delete rule name="Outage Test"

清理

完成 Microsoft IIS 教程后,您可以清理在 Google Cloud Platform 上创建的资源,避免这些资源占用配额,以后您就不必为这些资源付费了。以下部分介绍如何删除或关闭这些资源。

删除您的 Cloud Platform 项目

避免支付费用的最简单方法是删除您为本教程创建的项目。

要删除项目,请运行以下命令:

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

    转到“项目”页面

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

删除实例

要删除 Compute Engine 实例,请运行以下命令:

  1. 在 GCP Console 中,转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击 要删除的实例旁边的复选框。
  3. 点击页面顶部的删除按钮以删除实例。

删除永久性磁盘

要删除 Compute Engine 磁盘,请运行以下命令:

  1. 在 GCP Console 中,转到“磁盘”页面。

    转到“磁盘”页面

  2. 点击要删除的磁盘旁边的复选框。
  3. 点击页面顶部的删除按钮以删除磁盘。

后续步骤

详细了解如何在 Compute Engine 上使用 Windows

查看有关 Compute Engine 上的 Windows 实例的文档。

尝试其他教程

根据您自己的情况试用其他 Google Cloud Platform 功能。查阅我们的教程

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

发送以下问题的反馈:

此网页
Compute Engine 文档