Azure Load Balancer : 动态扩展

笔者在前文《Azure Load Balancer : 支持 IPv6》中介绍了如何通过 PowerShell 脚本创建支持 IPv6 的 Load Balancer。本文我们接着介绍如何在前文创建的 Load Balancer 中添加新的后端虚机。

可扩展的 Load Balancer

对于负载均衡来说,最重要的能力就是支持通过在后端添加更多的资源来提高系统的处理能力。可正如笔者在前文所述,我们无法通过 Azure 门户的 UI 创建支持 IPv6 的 Load Balancer,当然也无法通过 UI 来为已经支持 IPv6 的 Load Balancer 扩展后端池中的虚机。要想扩展支持 IPv6 的 Load Balancer 的后端池中的虚机,还是得通过脚本!我们仍然使用 PowerShell 脚本完成 Load Balancer 的扩展。

扩展支持 IPv6 的 Load Balancer

下面是扩展 Load Balancer 的主要逻辑。

定义脚本中所需的变量
为了能更好的重用该脚本,笔者把所需的变量都定义到了脚本的开头处,虽然变量的数目很多,但是只要修改 vmIndex 、prodNamePrefix、userName、sshPublicKey 和 location 等几个关键变量的值脚本就可以工作了:

# 新添加的虚机索引
$vmIndex = "3"
# 资源名称的前缀
$prodNamePrefix = "Nick"
$lowerProdNamePrefix = $prodNamePrefix.ToLower()

# vm user name
$userName = "nick"
# vm user public key
$sshPublicKey = "your public key"

# resource loacation
$location = "japaneast"
# resource group name
$rgName = $prodNamePrefix + "LBGroup"
...

获取虚拟网络及其虚拟子网的实例

# 获取虚拟网络的实例
$vnet = Get-AzureRmVirtualNetwork -Name $vnetName `
                                  -ResourceGroupName $rgName
# 获取虚拟子网的实例
$backendSubnet = Get-AzureRmVirtualNetworkSubnetConfig `
                 -Name $subnetName `
                 -VirtualNetwork $vnet

获取 Load Balancer 及其子属性的实例

$loadbalancer = Get-AzureRmLoadBalancer -Name $lbName `
                                        -ResourceGroupName $rgName

# 获取 Load Balancer 的 Backend pools 实例
$backendpoolipv4 = Get-AzureRmLoadBalancerBackendAddressPoolConfig `
                   -Name $backendAddressPoolV4Name `
                   -LoadBalancer $loadbalancer
$backendpoolipv6 = Get-AzureRmLoadBalancerBackendAddressPoolConfig `
                   -Name $backendAddressPoolV6Name `
                   -LoadBalancer $loadbalancer

# 获取 Load Balancer 的 Frontend IP 实例
$FEIPConfigv4 = Get-AzureRmLoadBalancerFrontendIpConfig `
                -Name $frontendV4Name `
                -LoadBalancer $loadbalancer
$FEIPConfigv6 = Get-AzureRmLoadBalancerFrontendIpConfig `
                -Name $frontendV6Name `
                -LoadBalancer $loadbalancer

# 在 Load Balancer 实例中添加新的 Inbound NAT rule
$loadbalancer | Add-AzureRmLoadBalancerInboundNatRuleConfig `
                -Name $natRulexV4Name `
                -FrontendIPConfiguration $FEIPConfigv4 `
                -Protocol TCP `
                -FrontendPort $frontendPort `
                -BackendPort 22

在云端更新 Load Balancer 实例

# 在云端更新 Load Balancer 实例
$loadbalancer | Set-AzureRmLoadBalancer

# 获得更新后的 Load Balancer 实例
$loadbalancer = Get-AzureRmLoadBalancer `
                -Name $lbName `
                -ResourceGroupName $rgName
$inboundNATRulev4 = Get-AzureRmLoadBalancerInboundNatRuleConfig `
                    -Name $natRulexV4Name `
                    -LoadBalancer $loadbalancer

创建虚拟网卡

$nicIPv4 = New-AzureRmNetworkInterfaceIpConfig `
           -Name "IPv4IPConfig" `
           -PrivateIpAddressVersion "IPv4" `
           -Subnet $backendSubnet `
           -LoadBalancerBackendAddressPool $backendpoolipv4 `
           -LoadBalancerInboundNatRule $inboundNATRulev4
$nicIPv6 = New-AzureRmNetworkInterfaceIpConfig `
           -Name "IPv6IPConfig" `
           -PrivateIpAddressVersion "IPv6" `
           -LoadBalancerBackendAddressPool $backendpoolipv6
$nic = New-AzureRmNetworkInterface `
       -Name $nicxName `
       -IpConfiguration $nicIPv4,$nicIPv6 `
       -ResourceGroupName $rgName `
       -Location $location

创建虚拟机并分配新建的 NIC

# 获取 Availability Set
$availabilitySet = Get-AzureRmAvailabilitySet `
                   -Name $availabilitySetName `
                   -ResourceGroupName $rgName

# 创建用户 Credential
$securePassword = ConvertTo-SecureString $userPassword `
                                         -AsPlainText -Force
$userCred = New-Object System.Management.Automation.PSCredential `
            ($userName, $securePassword)

# 创建虚机
$vm = New-AzureRmVMConfig -VMName $vmxName `
                          -VMSize $vmSize `
                          -AvailabilitySetId $availabilitySet.Id
$vm = Set-AzureRmVMOperatingSystem `
      -VM $vm `
      -Linux `
      -ComputerName $vmxComputerHostName `
      -Credential $userCred `
      -DisablePasswordAuthentication
$vm = Set-AzureRmVMSourceImage `
      -VM $vm `
      -PublisherName Canonical `
      -Offer UbuntuServer `
      -Skus $vmVersion `
      -Version "latest"
$vm = Set-AzureRmVMBootDiagnostics `
      -VM $vm `
      -Disable
$vm = Add-AzureRmVMNetworkInterface `
      -VM $vm `
      -Id $nic.Id -Primary
$vm = Set-AzureRmVMOSDisk `
      -VM $vm `
      -Name $vmxDiskName `
      -CreateOption FromImage `
      -StorageAccountType $storageAccountTypeName
Add-AzureRmVMSshPublicKey `
    -VM $vm `
    -KeyData $sshPublicKey `
    -Path "/home/$userName/.ssh/authorized_keys"
New-AzureRmVM -ResourceGroupName $rgName `
              -Location $location `
              -VM $vm

至此便在已有的 Load Balancer 的后端池中添加了一台虚机,完整的脚本代码请参考这里

在 Azure 门户上的 Cloud Shell 中执行脚本

假设你已经编辑好了自己的 Load Balancer 创建脚本,并命名为 azureloadbalancer_addvm.sp1。让我们先把脚本上传到 Azure 门户上的 Cloud Shell 中,然后在 Cloud Shell 中执行该脚本:

脚本执行完成后,一个支持 IPv6 的虚机就被添加到 Load Balancer 的后端池中了:

总结

虽然支持 IPv6 的 Load Balancer 的创建和操作都需要通过脚本进行,对入门来说可能麻烦了点儿,但是一旦你习惯了这种脚本化的操作,生产力的提升也是嗖嗖地!

参考:
用 PowerShell 创建支持 IPv6 的 Azure Load Balancer
Powershell load balancer
Azure Load Balancer 对 IPv6 的支持