教程:在 Azure 中使用 Azure PowerShell 均衡 Windows 虚拟机负载以创建高可用性应用程序

负载均衡通过将传入请求分布到多个虚拟机来提供更高级别的可用性。 本教程介绍了 Azure 负载均衡器的不同组件,这些组件用于分发流量和提供高可用性。 你将学习如何执行以下操作:

  • 创建 Azure 负载均衡器
  • 创建负载均衡器运行状况探测
  • 创建负载均衡器流量规则
  • 使用自定义脚本扩展创建基本的 IIS 站点
  • 创建虚拟机并将其附加到负载均衡器
  • 查看负载均衡器的实际运行情况
  • 在负载均衡器中添加和删除 VM

如果选择在本地安装并使用 PowerShell,则本教程需要 Azure PowerShell 模块 5.7.0 或更高版本。 运行 Get-Module -ListAvailable AzureRM 即可查找版本。 如果需要升级,请参阅安装 Azure PowerShell 模块。 如果在本地运行 PowerShell,则还需运行 Connect-AzureRmAccount -Environment AzureChinaCloud 以创建与 Azure 的连接。

Azure 负载均衡器概述

Azure 负载均衡器是位于第 4 层(TCP、UDP)的负载均衡器,通过在正常运行的 VM 之间分发传入流量提供高可用性。 负载均衡器运行状况探测器监视每个 VM 上的给定端口,仅将流量分发给正常运行的 VM。

定义包含一个或多个公共 IP 地址的前端 IP 配置。 利用此前端 IP 配置,可通过 Internet 访问负载均衡器和应用程序。

虚拟机使用其虚拟网络接口卡 (NIC) 连接到负载均衡器。 若要向 VM 分发流量,后端地址池需包含连接到负载均衡器的虚拟 NIC 的 IP 地址。

若要控制流量流,需为映射到 VM 的特定端口和协议定义负载均衡器规则。

创建 Azure 负载均衡器

本部分详细介绍了如何创建和配置负载均衡器的每个组件。 在创建负载均衡器之前,需使用 New-AzureRmResourceGroup 创建资源组。 以下示例在 ChinaEast 位置创建名为 myResourceGroupLoadBalancer 的资源组:

New-AzureRmResourceGroup `
  -ResourceGroupName "myResourceGroupLoadBalancer" `
  -Location "ChinaEast"

创建公共 IP 地址

若要通过 Internet 访问应用,负载均衡器需要具有一个公共 IP 地址。 使用 New-AzureRmPublicIpAddress 创建一个公共 IP 地址。 以下示例在 myResourceGroupLoadBalancer 资源组中创建名为 myPublicIP 的公共 IP 地址:

$publicIP = New-AzureRmPublicIpAddress `
  -ResourceGroupName "myResourceGroupLoadBalancer" `
  -Location "ChinaEast" `
  -AllocationMethod "Static" `
  -Name "myPublicIP"

创建负载均衡器

使用 New-AzureRmLoadBalancerFrontendIpConfig 创建一个前端 IP 池。 以下示例创建名为 myFrontEndPool 的前端 IP 池并附加 myPublicIP 地址:

$frontendIP = New-AzureRmLoadBalancerFrontendIpConfig `
  -Name "myFrontEndPool" `
  -PublicIpAddress $publicIP

使用 New-AzureRmLoadBalancerBackendAddressPoolConfig 创建一个后端地址池。 在剩余的步骤中,各个 VM 将附加到此后端池。 以下示例创建名为 myBackEndPool 的后端地址池:

$backendPool = New-AzureRmLoadBalancerBackendAddressPoolConfig -Name "myBackEndPool"

现在,使用 New-AzureRmLoadBalancer 创建负载均衡器。 以下示例使用在前面的步骤中创建的前端和后端 IP 池创建名为 myLoadBalancer 的负载均衡器:

$lb = New-AzureRmLoadBalancer `
  -ResourceGroupName "myResourceGroupLoadBalancer" `
  -Name "myLoadBalancer" `
  -Location "ChinaEast" `
  -FrontendIpConfiguration $frontendIP `
  -BackendAddressPool $backendPool

创建运行状况探测器

若要允许负载均衡器监视应用的状态,可以使用运行状况探测器。 运行状况探测器基于其对运行状况检查的响应,从负载均衡器中动态添加或删除 VM。 默认情况下,在 15 秒时间间隔内发生两次连续的故障后,会从负载均衡器分布中删除 VM。 可以为应用创建基于协议或特定运行状况检查页面的运行状况探测器。

以下示例创建一个 TCP 探测器。 还可创建自定义 HTTP 探测器,以便执行更精细的运行状况检查。 使用自定义 HTTP 探测器时,必须创建运行状况检查页,例如 healthcheck.aspx。 探测器必须为负载均衡器返回 HTTP 200 OK 响应,以保持主机处于旋转状态。

若要创建 TCP 运行状况探测器,请使用 Add-AzureRmLoadBalancerProbeConfig。 以下示例创建名为 myHealthProbe 的运行状况探测器,用于在 TCP 端口 80 上监视每个 VM:

Add-AzureRmLoadBalancerProbeConfig `
  -Name "myHealthProbe" `
  -LoadBalancer $lb `
  -Protocol tcp `
  -Port 80 `
  -IntervalInSeconds 15 `
  -ProbeCount 2

若要应用运行状况探测器,请使用 Set-AzureRmLoadBalancer 更新负载均衡器:

Set-AzureRmLoadBalancer -LoadBalancer $lb

创建负载均衡器规则

负载均衡器规则用于定义将流量分配给 VM 的方式。 定义传入流量的前端 IP 配置和后端 IP 池以接收流量,同时定义所需源和目标端口。 若要确保仅正常运行的 VM 接收流量,还需定义要使用的运行状况探测器。

使用 Add-AzureRmLoadBalancerRuleConfig 创建一个负载均衡器规则。 以下示例创建名为 myLoadBalancerRule 的负载均衡器规则并均衡 TCP 端口 80 上的流量:

$probe = Get-AzureRmLoadBalancerProbeConfig -LoadBalancer $lb -Name "myHealthProbe"

Add-AzureRmLoadBalancerRuleConfig `
  -Name "myLoadBalancerRule" `
  -LoadBalancer $lb `
  -FrontendIpConfiguration $lb.FrontendIpConfigurations[0] `
  -BackendAddressPool $lb.BackendAddressPools[0] `
  -Protocol Tcp `
  -FrontendPort 80 `
  -BackendPort 80 `
  -Probe $probe

使用 Set-AzureRmLoadBalancer 更新负载均衡器:

Set-AzureRmLoadBalancer -LoadBalancer $lb

配置虚拟网络

需要先创建提供支持的虚拟网络资源,然后才能部署某些 VM 并测试均衡器。 有关虚拟网络的详细信息,请参阅管理 Azure 虚拟网络教程。

创建网络资源

使用 New-AzureRmVirtualNetwork 创建虚拟网络。 以下示例创建包含 mySubnet 的名为 myVnet 的虚拟网络:

# Create subnet config
$subnetConfig = New-AzureRmVirtualNetworkSubnetConfig `
  -Name "mySubnet" `
  -AddressPrefix 192.168.1.0/24

# Create the virtual network
$vnet = New-AzureRmVirtualNetwork `
  -ResourceGroupName "myResourceGroupLoadBalancer" `
  -Location "ChinaEast" `
  -Name "myVnet" `
  -AddressPrefix 192.168.0.0/16 `
  -Subnet $subnetConfig

使用 New-AzureRmNetworkInterface 创建虚拟 NIC。 以下示例创建三个虚拟 NIC。 (在以下步骤中针对为应用创建的每个 VM 各使用一个虚拟 NIC)。 可随时创建其他虚拟 NIC 和 VM,并将其添加到负载均衡器:

for ($i=1; $i -le 3; $i++)
{
   New-AzureRmNetworkInterface `
     -ResourceGroupName "myResourceGroupLoadBalancer" `
     -Name myVM$i `
     -Location "ChinaEast" `
     -Subnet $vnet.Subnets[0] `
     -LoadBalancerBackendAddressPool $lb.BackendAddressPools[0]
}

创建虚拟机

若要提高应用的高可用性,请将 VM 放置在可用性集中。

使用 New-AzureRmAvailabilitySet 创建一个可用性集。 以下示例创建名为 myAvailabilitySet 的可用性集:

$availabilitySet = New-AzureRmAvailabilitySet `
  -ResourceGroupName "myResourceGroupLoadBalancer" `
  -Name "myAvailabilitySet" `
  -Location "ChinaEast" `
  -Sku aligned `
  -PlatformFaultDomainCount 2 `
  -PlatformUpdateDomainCount 2

使用 New-AzureRmNetworkInterface 设置 VM 的管理员用户名和密码:

$cred = Get-Credential

现在,可使用 New-AzureRmVM 创建 VM。 以下示例创建三个 VM 和所需的虚拟网络组件(如果它们尚不存在):

for ($i=1; $i -le 3; $i++)
{
    New-AzureRmVm `
        -ResourceGroupName "myResourceGroupLoadBalancer" `
        -Name "myVM$i" `
        -Location "China East" `
        -VirtualNetworkName "myVnet" `
        -SubnetName "mySubnet" `
        -SecurityGroupName "myNetworkSecurityGroup" `
        -OpenPorts 80 `
        -AvailabilitySetName "myAvailabilitySet" `
        -Credential $cred `
        -AsJob
}

-AsJob 参数以后台任务的方式创建 VM,因此 PowerShell 提示符会返回到你所在的位置。 可以通过 Job cmdlet 查看后台作业的详细信息。 创建和配置所有三个 VM 需要几分钟时间。

使用自定义脚本扩展安装 IIS

在有关如何自定义 Windows 虚拟机的上一教程中,你已了解如何使用 Windows 的自定义脚本扩展自动执行 VM 自定义。 可使用相同的方法在 VM 上安装和配置 IIS。

使用 Set-AzureRmVMExtension 安装自定义脚本扩展。 该扩展运行 powershell Add-WindowsFeature Web-Server 来安装 IIS Web 服务器,然后更新 Default.htm 页以显示 VM 的主机名:

for ($i=1; $i -le 3; $i++)
{
   Set-AzureRmVMExtension `
     -ResourceGroupName "myResourceGroupLoadBalancer" `
     -ExtensionName "IIS" `
     -VMName myVM$i `
     -Publisher Microsoft.Compute `
     -ExtensionType CustomScriptExtension `
     -TypeHandlerVersion 1.8 `
     -SettingString '{"commandToExecute":"powershell Add-WindowsFeature Web-Server; powershell Add-Content -Path \"C:\\inetpub\\wwwroot\\Default.htm\" -Value $($env:computername)"}' `
     -Location ChinaEast
}

测试负载均衡器

使用 Get-AzureRmPublicIPAddress 获取负载均衡器的公共 IP 地址。 以下示例获取前面创建的“myPublicIP”的 IP 地址:

Get-AzureRmPublicIPAddress `
  -ResourceGroupName "myResourceGroupLoadBalancer" `
  -Name "myPublicIP" | select IpAddress

然后,可将公共 IP 地址输入 Web 浏览器中。 网站随即显示,其中包括负载均衡器将流量分发到的 VM 的主机名,如下例所示:

运行 IIS 网站

若要查看负载均衡器如何在运行应用的所有三个 VM 之间分发流量,可强制刷新 web 浏览器。

添加和删除 VM

建议对运行应用的 VM 执行维护,例如安装 OS 更新。 若要应对应用增加的流量,建议添加更多 VM。 本部分演示了如何在负载均衡器中删除或添加 VM。

从负载均衡器中删除 VM

使用 Get-AzureRmNetworkInterface 获取网络接口卡,然后将虚拟 NIC 的 LoadBalancerBackendAddressPools 属性设置为 $null。 最后,更新虚拟 NIC:

$nic = Get-AzureRmNetworkInterface `
    -ResourceGroupName "myResourceGroupLoadBalancer" `
    -Name "myVM2"
$nic.Ipconfigurations[0].LoadBalancerBackendAddressPools=$null
Set-AzureRmNetworkInterface -NetworkInterface $nic

若要查看负载均衡器如何在运行应用的其余两个 VM 之间分发流量,可强制刷新 web 浏览器。 现在可以对 VM 执行维护,例如安装 OS 更新或执行 VM 重新启动。

将 VM 添加到负载均衡器

执行 VM 维护后,或者如果需要扩展容量,请通过 Get-AzureRMLoadBalancer 将虚拟 NIC 的 LoadBalancerBackendAddressPools 属性设置为 BackendAddressPool:

获取负载均衡器:

$lb = Get-AzureRMLoadBalancer `
    -ResourceGroupName myResourceGroupLoadBalancer `
    -Name myLoadBalancer 
$nic.IpConfigurations[0].LoadBalancerBackendAddressPools=$lb.BackendAddressPools[0]
Set-AzureRmNetworkInterface -NetworkInterface $nic

后续步骤

在本教程中,你已创建了一个负载均衡器并已将 VM 附加到它。 你已了解如何:

  • 创建 Azure 负载均衡器
  • 创建负载均衡器运行状况探测
  • 创建负载均衡器流量规则
  • 使用自定义脚本扩展创建基本的 IIS 站点
  • 创建虚拟机并将其附加到负载均衡器
  • 查看负载均衡器的实际运行情况
  • 在负载均衡器中添加和删除 VM

请转到下一教程,了解如何管理 VM 网络。