Azure Load Balancer : 動態擴充套件

sparkdev發表於2019-02-12

筆者在前文《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 的支援

相關文章