Come bilanciare il carico per le macchine virtuali di Windows in Azure per creare un'applicazione a disponibilità elevata

Il bilanciamento del carico offre un livello più elevato di disponibilità distribuendo le richieste in ingresso tra più macchine virtuali. In questa esercitazione vengono illustrati i diversi componenti di Azure Load Balancer che distribuiscono il traffico e garantiscono una disponibilità elevata. Si apprenderà come:

  • Creare un servizio di bilanciamento del carico di Azure
  • Creare un probe di integrità per il servizio di bilanciamento del carico
  • Creare regole del traffico di bilanciamento del carico
  • Usare l'estensione dello script personalizzata per creare un sito IIS di base
  • Creare macchine virtuali e collegarsi a un bilanciamento del carico
  • Visualizzare un bilanciamento del carico in azione
  • Aggiungere e rimuovere macchine virtuali da un bilanciamento del carico

Questa esercitazione richiede il modulo Azure PowerShell 3.6 o versioni successive. Eseguire Get-Module -ListAvailable AzureRM per trovare la versione. Se è necessario eseguire l'aggiornamento, vedere Installare e configurare Azure PowerShell.

Panoramica di Azure Load Balancer

Azure Load Balancer è un bilanciamento del carico di livello 4 (TCP, UDP) che offre disponibilità elevata mediante la distribuzione del traffico in ingresso nelle macchine virtuali integre. Un probe di integrità del bilanciamento del carico monitora una determinata porta in ogni VM e distribuisce il traffico solo a una VM operativa.

Definire una configurazione IP front-end che contenga uno o più indirizzi IP pubblici. Questa configurazione IP front-end garantisce l'accessibilità al bilanciamento del carico e alle applicazioni tramite Internet.

Le macchine virtuali si connettono a un bilanciamento del carico tramite la scheda di interfaccia di rete virtuale (NIC). Per distribuire il traffico alle macchine virtuali, è necessario che un pool di indirizzi back-end contenga gli indirizzi IP delle schede di interfaccia di rete virtuale connesse al bilanciamento del carico.

Per controllare il flusso del traffico, è necessario definire le regole di bilanciamento del carico per porte e protocolli specifici che eseguono il mapping delle macchine virtuali.

Creare un Azure Load Balancer

Questa sezione descrive dettagliatamente come creare e configurare ogni componente del bilanciamento del carico. Per poter creare un servizio di bilanciamento del carico è prima necessario creare un gruppo di risorse con New-AzureRmResourceGroup. L'esempio seguente crea un gruppo di risorse denominato myResourceGroupLoadBalancer nella posizione EastUS:

New-AzureRmResourceGroup `
  -ResourceGroupName myResourceGroupLoadBalancer `
  -Location EastUS

Creare un indirizzo IP pubblico

Per accedere all'app in Internet, assegnare un indirizzo IP pubblico al servizio di bilanciamento del carico. Creare un indirizzo IP pubblico con New-AzureRmPublicIpAddress. Nell'esempio seguente viene creato un indirizzo IP pubblico denominato myPublicIP nel gruppo di risorse myResourceGroupLoadBalancer:

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

Creare un servizio di bilanciamento del carico

Creare un indirizzo IP di front-end con New-AzureRmLoadBalancerFrontendIpConfig. Nell'esempio seguente viene creato un indirizzo IP front-end denominato myFrontEndPool:

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

Creare un pool di indirizzi back-end con New-AzureRmLoadBalancerBackendAddressPoolConfig. L'esempio seguente crea un pool di indirizzi back-end denominato myBackEndPool:

$backendPool = New-AzureRmLoadBalancerBackendAddressPoolConfig -Name myBackEndPool

Creare il servizio di bilanciamento del carico con New-AzureRmLoadBalancer. Nell'esempio seguente viene creato un servizio di bilanciamento del carico denominato myLoadBalancer con l'indirizzo myPublicIP:

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

Creare un probe di integrità

Per consentire al servizio di bilanciamento del carico di monitorare lo stato dell'app, si usa un probe di integrità. Il probe di integrità aggiunge o rimuove in modo dinamico le VM nella rotazione del servizio di bilanciamento del carico in base alla rispettiva risposta ai controlli di integrità. Per impostazione predefinita, una VM viene rimossa dalla distribuzione del servizio di bilanciamento del carico dopo due errori consecutivi a intervalli di 15 secondi. Un probe di integrità viene creato in base a un protocollo o una specifica pagina di controllo integrità per l'app.

Nell'esempio seguente viene creato un probe TCP. È anche possibile creare probe HTTP personalizzati per i controlli di integrità con granularità fine. Quando si usa un probe HTTP personalizzato, è necessario creare la pagina di controllo integrità, ad esempio healthcheck.aspx. Il probe deve restituire la risposta HTTP 200 OK affinché il servizio di bilanciamento del carico mantenga l'host nella rotazione.

Per creare un probe integrità con TCP, usare Add-AzureRmLoadBalancerProbeConfig. Nell'esempio seguente viene creato un probe di integrità denominato myHealthProbe che monitora ogni VM:

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

Creare il servizio di bilanciamento del carico con Set-AzureRmLoadBalancer:

Set-AzureRmLoadBalancer -LoadBalancer $lb

Creare una regola di bilanciamento del carico

Una regola di bilanciamento del carico consente di definire come il traffico verrà distribuito alle VM. Definire la configurazione IP front-end per il traffico in ingresso e il pool IP di back-end affinché riceva il traffico, insieme alla porta di origine e di destinazione necessaria. Per assicurarsi che solo le macchine virtuali integre ricevano il traffico, è necessario anche definire il probe di integrità da usare.

Creare una regola di bilanciamento del carico con Add-AzureRmLoadBalancerRuleConfig. Nell'esempio seguente viene creata una regola di bilanciamento del carico denominata myLoadBalancerRule e il traffico viene bilanciato sulla porta 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

Creare il servizio di bilanciamento del carico con Set-AzureRmLoadBalancer:

Set-AzureRmLoadBalancer -LoadBalancer $lb

Configurare la rete virtuale

Prima di distribuire alcune macchine virtuali e testare il servizio di bilanciamento, creare le risorse di rete virtuale di supporto. Per altre informazioni sulle reti virtuali, vedere l'esercitazione Gestire le reti virtuali di Azure.

Creare risorse di rete

Creare una rete virtuale con New-AzureRmVirtualNetwork. Nell'esempio seguente viene creata una rete virtuale denominata myVnet con una subnet denominata mySubnet:

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

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

Creare una regola per il gruppo di sicurezza di rete con New-AzureRmNetworkSecurityRuleConfig, quindi creare un gruppo di sicurezza di rete con New-AzureRmNetworkSecurityGroup. Aggiungere il gruppo di sicurezza di rete alla subnet con Set-AzureRmVirtualNetworkSubnetConfig e quindi aggiornare la rete virtuale con Set-AzureRmVirtualNetwork.

Nell'esempio seguente viene creata una regola del gruppo di sicurezza di rete denominata myNetworkSecurityGroup che viene applicata a mySubnet:

# Create security rule config
$nsgRule = New-AzureRmNetworkSecurityRuleConfig `
  -Name myNetworkSecurityGroupRule `
  -Protocol Tcp `
  -Direction Inbound `
  -Priority 1001 `
  -SourceAddressPrefix * `
  -SourcePortRange * `
  -DestinationAddressPrefix * `
  -DestinationPortRange 80 `
  -Access Allow

# Create the network security group
$nsg = New-AzureRmNetworkSecurityGroup `
  -ResourceGroupName myResourceGroupLoadBalancer `
  -Location EastUS `
  -Name myNetworkSecurityGroup `
  -SecurityRules $nsgRule

# Apply the network security group to a subnet
Set-AzureRmVirtualNetworkSubnetConfig `
  -VirtualNetwork $vnet `
  -Name mySubnet `
  -NetworkSecurityGroup $nsg `
  -AddressPrefix 192.168.1.0/24

# Update the virtual network
Set-AzureRmVirtualNetwork -VirtualNetwork $vnet

Vengono create schede di interfaccia di rete virtuale con New-AzureRmNetworkInterface. L'esempio seguente crea tre schede di interfaccia di rete virtuali, Una scheda di interfaccia di rete virtuale per ogni VM creata per l'app nei passaggi successivi. È possibile creare altre schede di interfaccia di rete virtuale e macchine virtuali in qualsiasi momento e aggiungerle al bilanciamento del carico:

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

Creare macchine virtuali

Per aumentare la disponibilità elevata dell'app, posizionare le macchine virtuali in un set di disponibilità.

Creare un set di disponibilità con New-AzureRmAvailabilitySet. Nell'esempio seguente viene creato un set di disponibilità denominato myAvailabilitySet:

$availabilitySet = New-AzureRmAvailabilitySet `
  -ResourceGroupName myResourceGroupLoadBalancer `
  -Name myAvailabilitySet `
  -Location EastUS `
  -Managed `
  -PlatformFaultDomainCount 3 `
  -PlatformUpdateDomainCount 2

Impostare nome utente e password dell'amministratore delle macchine virtuali con il comando Get-Credential:

$cred = Get-Credential

A questo punto è possibile creare le macchine virtuale con New-AzureRmVM. L'esempio seguente crea tre macchine virtuali:

for ($i=1; $i -le 3; $i++)
{
  $vm = New-AzureRmVMConfig `
    -VMName myVM$i `
    -VMSize Standard_D1 `
    -AvailabilitySetId $availabilitySet.Id
  $vm = Set-AzureRmVMOperatingSystem `
    -VM $vm `
    -Windows `
    -ComputerName myVM$i `
    -Credential $cred `
    -ProvisionVMAgent `
    -EnableAutoUpdate
  $vm = Set-AzureRmVMSourceImage `
    -VM $vm `
    -PublisherName MicrosoftWindowsServer `
    -Offer WindowsServer `
    -Skus 2016-Datacenter `
    -Version latest
  $vm = Set-AzureRmVMOSDisk `
    -VM $vm `
    -Name myOsDisk$i `
    -DiskSizeInGB 128 `
    -CreateOption FromImage `
    -Caching ReadWrite
  $nic = Get-AzureRmNetworkInterface `
    -ResourceGroupName myResourceGroupLoadBalancer `
    -Name myNic$i
  $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id
  New-AzureRmVM `
    -ResourceGroupName myResourceGroupLoadBalancer `
    -Location EastUS `
    -VM $vm
}

La creazione e la configurazione di tutte e tre le VM richiedono alcuni minuti.

Installare IIS con l'estensione dello script personalizzata

Nell'esercitazione precedente su Come personalizzare una macchina virtuale di Windows, si è appreso come automatizzare la personalizzazione della macchina virtuale con l'estensione dello script personalizzata per Windows. È possibile usare lo stesso approccio per installare e configurare IIS nelle macchine virtuali.

Usare il comando Set-AzureRmVMExtension per installare l'estensione dello script personalizzata. L'estensione esegue powershell Add-WindowsFeature Web-Server per installare il server Web IIS e quindi aggiorna la pagina Default.htm per visualizzare il nome host della VM:

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

Testare il bilanciamento del carico

Ottenere l'indirizzo IP pubblico del servizio di bilanciamento del carico con il comando Get-AzureRmPublicIPAddress. Nell'esempio seguente si ottiene l'indirizzo IP per myPublicIP creato in precedenza:

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

Sarà quindi possibile immettere l'indirizzo IP pubblico in un Web browser. Verrà visualizzato il sito Web, con il nome host della macchina virtuale a cui il servizio di bilanciamento del carico ha distribuito il traffico, come nell'esempio seguente:

Esecuzione del sito Web IIS

Per verificare la distribuzione del traffico tra tutte e tre le VM che eseguono l'app da parte del servizio di bilanciamento del carico, forzare l'aggiornamento del Web browser.

aggiunta e rimozione di VM

Potrebbe essere necessario eseguire attività di manutenzione sulle VM che eseguono l'app, ad esempio per installare aggiornamenti del sistema operativo, oppure aggiungere altre VM per gestire un aumento del traffico verso l'app. Questa sezione illustra come rimuovere o aggiungere una VM nel servizio di bilanciamento del carico.

Rimuovere una VM dal servizio di bilanciamento del carico

Ottenere la scheda di interfaccia di rete con Get-AzureRmNetworkInterface e quindi impostare la proprietà LoadBalancerBackendAddressPools della scheda di interfaccia di rete virtuale su $null. Infine, aggiornare la scheda di interfaccia di rete virtuale:

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

Per verificare la distribuzione del traffico nelle due VM restanti che eseguono l'app da parte del servizio di bilanciamento del carico, forzare l'aggiornamento del Web browser. È ora possibile eseguire attività di manutenzione sulla VM, ad esempio installare aggiornamenti del sistema operativo o eseguire un riavvio della VM.

Aggiungere una VM al servizio di bilanciamento del carico

Dopo avere eseguito la manutenzione della VM o se è necessario espandere la capacità, impostare la proprietà LoadBalancerBackendAddressPools della scheda di interfaccia di rete virtuale su BackendAddressPool in Get-AzureRMLoadBalancer:

Ottenere il servizio di bilanciamento del carico:

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

Passaggi successivi

In questa esercitazione viene creato un bilanciamento del carico e vengono collegate le macchine virtuali. Si è appreso come:

  • Creare un servizio di bilanciamento del carico di Azure
  • Creare un probe di integrità per il servizio di bilanciamento del carico
  • Creare regole del traffico di bilanciamento del carico
  • Usare l'estensione dello script personalizzata per creare un sito IIS di base
  • Creare macchine virtuali e collegarsi a un bilanciamento del carico
  • Visualizzare un bilanciamento del carico in azione
  • Aggiungere e rimuovere macchine virtuali da un bilanciamento del carico

Passare all'esercitazione successiva per imparare a gestire la rete delle macchine virtuali.