Come bilanciare il carico per le macchine virtuali di Windows in Azure per creare un'applicazione a disponibilità elevataHow to load balance Windows virtual machines in Azure to create a highly available application

Il bilanciamento del carico offre un livello più elevato di disponibilità distribuendo le richieste in ingresso tra più macchine virtuali.Load balancing provides a higher level of availability by spreading incoming requests across multiple virtual machines. In questa esercitazione vengono illustrati i diversi componenti di Azure Load Balancer che distribuiscono il traffico e garantiscono una disponibilità elevata.In this tutorial, you learn about the different components of the Azure load balancer that distribute traffic and provide high availability. Si apprenderà come:You learn how to:

  • Creare un servizio di bilanciamento del carico di AzureCreate an Azure load balancer
  • Creare un probe di integrità per il servizio di bilanciamento del caricoCreate a load balancer health probe
  • Creare regole del traffico di bilanciamento del caricoCreate load balancer traffic rules
  • Usare l'estensione dello script personalizzata per creare un sito IIS di baseUse the Custom Script Extension to create a basic IIS site
  • Creare macchine virtuali e collegarsi a un bilanciamento del caricoCreate virtual machines and attach to a load balancer
  • Visualizzare un bilanciamento del carico in azioneView a load balancer in action
  • Aggiungere e rimuovere macchine virtuali da un bilanciamento del caricoAdd and remove VMs from a load balancer

Questa esercitazione richiede il modulo Azure PowerShell 3.6 o versioni successive.This tutorial requires the Azure PowerShell module version 3.6 or later. Eseguire Get-Module -ListAvailable AzureRM per trovare la versione.Run Get-Module -ListAvailable AzureRM to find the version. Se è necessario eseguire l'aggiornamento, vedere Installare e configurare Azure PowerShell.If you need to upgrade, see Install Azure PowerShell module.

Panoramica di Azure Load BalancerAzure load balancer overview

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.An Azure load balancer is a Layer-4 (TCP, UDP) load balancer that provides high availability by distributing incoming traffic among healthy VMs. Un probe di integrità del bilanciamento del carico monitora una determinata porta in ogni VM e distribuisce il traffico solo a una VM operativa.A load balancer health probe monitors a given port on each VM and only distributes traffic to an operational VM.

Definire una configurazione IP front-end che contenga uno o più indirizzi IP pubblici.You define a front-end IP configuration that contains one or more public IP addresses. Questa configurazione IP front-end garantisce l'accessibilità al bilanciamento del carico e alle applicazioni tramite Internet.This front-end IP configuration allows your load balancer and applications to be accessible over the Internet.

Le macchine virtuali si connettono a un bilanciamento del carico tramite la scheda di interfaccia di rete virtuale (NIC).Virtual machines connect to a load balancer using their virtual network interface card (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.To distribute traffic to the VMs, a back-end address pool contains the IP addresses of the virtual (NICs) connected to the load balancer.

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.To control the flow of traffic, you define load balancer rules for specific ports and protocols that map to your VMs.

Creare un Azure Load BalancerCreate Azure load balancer

Questa sezione descrive dettagliatamente come creare e configurare ogni componente del bilanciamento del carico.This section details how you can create and configure each component of the load balancer. Per poter creare un servizio di bilanciamento del carico è prima necessario creare un gruppo di risorse con New-AzureRmResourceGroup.Before you can create your load balancer, create a resource group with New-AzureRmResourceGroup. L'esempio seguente crea un gruppo di risorse denominato myResourceGroupLoadBalancer nella posizione EastUS:The following example creates a resource group named myResourceGroupLoadBalancer in the EastUS location:

New-AzureRmResourceGroup `
  -ResourceGroupName myResourceGroupLoadBalancer `
  -Location EastUS

Creare un indirizzo IP pubblicoCreate a public IP address

Per accedere all'app in Internet, assegnare un indirizzo IP pubblico al servizio di bilanciamento del carico.To access your app on the Internet, you need a public IP address for the load balancer. Creare un indirizzo IP pubblico con New-AzureRmPublicIpAddress.Create a public IP address with New-AzureRmPublicIpAddress. Nell'esempio seguente viene creato un indirizzo IP pubblico denominato myPublicIP nel gruppo di risorse myResourceGroupLoadBalancer:The following example creates a public IP address named myPublicIP in the myResourceGroupLoadBalancer resource group:

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

Creare un servizio di bilanciamento del caricoCreate a load balancer

Creare un indirizzo IP di front-end con New-AzureRmLoadBalancerFrontendIpConfig.Create a frontend IP address with New-AzureRmLoadBalancerFrontendIpConfig. Nell'esempio seguente viene creato un indirizzo IP front-end denominato myFrontEndPool:The following example creates a frontend IP address named myFrontEndPool:

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

Creare un pool di indirizzi back-end con New-AzureRmLoadBalancerBackendAddressPoolConfig.Create a backend address pool with New-AzureRmLoadBalancerBackendAddressPoolConfig. L'esempio seguente crea un pool di indirizzi back-end denominato myBackEndPool:The following example creates a backend address pool named myBackEndPool:

$backendPool = New-AzureRmLoadBalancerBackendAddressPoolConfig -Name myBackEndPool

Creare il servizio di bilanciamento del carico con New-AzureRmLoadBalancer.Now, create the load balancer with New-AzureRmLoadBalancer. Nell'esempio seguente viene creato un servizio di bilanciamento del carico denominato myLoadBalancer con l'indirizzo myPublicIP:The following example creates a load balancer named myLoadBalancer using the myPublicIP address:

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

Creare un probe di integritàCreate a health probe

Per consentire al servizio di bilanciamento del carico di monitorare lo stato dell'app, si usa un probe di integrità.To allow the load balancer to monitor the status of your app, you use a health probe. 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à.The health probe dynamically adds or removes VMs from the load balancer rotation based on their response to health checks. Per impostazione predefinita, una VM viene rimossa dalla distribuzione del servizio di bilanciamento del carico dopo due errori consecutivi a intervalli di 15 secondi.By default, a VM is removed from the load balancer distribution after two consecutive failures at 15-second intervals. Un probe di integrità viene creato in base a un protocollo o una specifica pagina di controllo integrità per l'app.You create a health probe based on a protocol or a specific health check page for your app.

Nell'esempio seguente viene creato un probe TCP.The following example creates a TCP probe. È anche possibile creare probe HTTP personalizzati per i controlli di integrità con granularità fine.You can also create custom HTTP probes for more fine grained health checks. Quando si usa un probe HTTP personalizzato, è necessario creare la pagina di controllo integrità, ad esempio healthcheck.aspx.When using a custom HTTP probe, you must create the health check page, such as healthcheck.aspx. Il probe deve restituire la risposta HTTP 200 OK affinché il servizio di bilanciamento del carico mantenga l'host nella rotazione.The probe must return an HTTP 200 OK response for the load balancer to keep the host in rotation.

Per creare un probe integrità con TCP, usare Add-AzureRmLoadBalancerProbeConfig.To create a TCP health probe, you use Add-AzureRmLoadBalancerProbeConfig. Nell'esempio seguente viene creato un probe di integrità denominato myHealthProbe che monitora ogni VM:The following example creates a health probe named myHealthProbe that monitors each 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:Update the load balancer with Set-AzureRmLoadBalancer:

Set-AzureRmLoadBalancer -LoadBalancer $lb

Creare una regola di bilanciamento del caricoCreate a load balancer rule

Una regola di bilanciamento del carico consente di definire come il traffico verrà distribuito alle VM.A load balancer rule is used to define how traffic is distributed to the VMs. 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.You define the front-end IP configuration for the incoming traffic and the back-end IP pool to receive the traffic, along with the required source and destination port. Per assicurarsi che solo le macchine virtuali integre ricevano il traffico, è necessario anche definire il probe di integrità da usare.To make sure only healthy VMs receive traffic, you also define the health probe to use.

Creare una regola di bilanciamento del carico con Add-AzureRmLoadBalancerRuleConfig.Create a load balancer rule with Add-AzureRmLoadBalancerRuleConfig. Nell'esempio seguente viene creata una regola di bilanciamento del carico denominata myLoadBalancerRule e il traffico viene bilanciato sulla porta 80:The following example creates a load balancer rule named myLoadBalancerRule and balances traffic on port 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:Update the load balancer with Set-AzureRmLoadBalancer:

Set-AzureRmLoadBalancer -LoadBalancer $lb

Configurare la rete virtualeConfigure virtual network

Prima di distribuire alcune macchine virtuali e testare il servizio di bilanciamento, creare le risorse di rete virtuale di supporto.Before you deploy some VMs and can test your balancer, create the supporting virtual network resources. Per altre informazioni sulle reti virtuali, vedere l'esercitazione Gestire le reti virtuali di Azure.For more information about virtual networks, see the Manage Azure Virtual Networks tutorial.

Creare risorse di reteCreate network resources

Creare una rete virtuale con New-AzureRmVirtualNetwork.Create a virtual network with New-AzureRmVirtualNetwork. Nell'esempio seguente viene creata una rete virtuale denominata myVnet con una subnet denominata mySubnet:The following example creates a virtual network named myVnet with 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.Create a network security group rule with New-AzureRmNetworkSecurityRuleConfig, then create a network security group with New-AzureRmNetworkSecurityGroup. Aggiungere il gruppo di sicurezza di rete alla subnet con Set-AzureRmVirtualNetworkSubnetConfig e quindi aggiornare la rete virtuale con Set-AzureRmVirtualNetwork.Add the network security group to the subnet with Set-AzureRmVirtualNetworkSubnetConfig and then update the virtual network with Set-AzureRmVirtualNetwork.

Nell'esempio seguente viene creata una regola del gruppo di sicurezza di rete denominata myNetworkSecurityGroup che viene applicata a mySubnet:The following example creates a network security group rule named myNetworkSecurityGroup and applies it to 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.Virtual NICs are created with New-AzureRmNetworkInterface. L'esempio seguente crea tre schede di interfaccia di rete virtuali,The following example creates three virtual NICs. Una scheda di interfaccia di rete virtuale per ogni VM creata per l'app nei passaggi successivi.(One virtual NIC for each VM you create for your app in the following steps). È possibile creare altre schede di interfaccia di rete virtuale e macchine virtuali in qualsiasi momento e aggiungerle al bilanciamento del carico:You can create additional virtual NICs and VMs at any time and add them to the load balancer:

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 virtualiCreate virtual machines

Per aumentare la disponibilità elevata dell'app, posizionare le macchine virtuali in un set di disponibilità.To improve the high availability of your app, place your VMs in an availability set.

Creare un set di disponibilità con New-AzureRmAvailabilitySet.Create an availability set with New-AzureRmAvailabilitySet. Nell'esempio seguente viene creato un set di disponibilità denominato myAvailabilitySet:The following example creates an availability set named 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:Set an administrator username and password for the VMs with Get-Credential:

$cred = Get-Credential

A questo punto è possibile creare le macchine virtuale con New-AzureRmVM.Now you can create the VMs with New-AzureRmVM. L'esempio seguente crea tre macchine virtuali:The following example creates three VMs:

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.It takes a few minutes to create and configure all three VMs.

Installare IIS con l'estensione dello script personalizzataInstall IIS with Custom Script Extension

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.In a previous tutorial on How to customize a Windows virtual machine, you learned how to automate VM customization with the Custom Script Extension for Windows. È possibile usare lo stesso approccio per installare e configurare IIS nelle macchine virtuali.You can use the same approach to install and configure IIS on your VMs.

Usare il comando Set-AzureRmVMExtension per installare l'estensione dello script personalizzata.Use Set-AzureRmVMExtension to install the Custom Script Extension. 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:The extension runs powershell Add-WindowsFeature Web-Server to install the IIS webserver and then updates the Default.htm page to show the hostname of the 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 caricoTest load balancer

Ottenere l'indirizzo IP pubblico del servizio di bilanciamento del carico con il comando Get-AzureRmPublicIPAddress.Obtain the public IP address of your load balancer with Get-AzureRmPublicIPAddress. Nell'esempio seguente si ottiene l'indirizzo IP per myPublicIP creato in precedenza:The following example obtains the IP address for myPublicIP created earlier:

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

Sarà quindi possibile immettere l'indirizzo IP pubblico in un Web browser.You can then enter the public IP address in to a 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:The website is displayed, including the hostname of the VM that the load balancer distributed traffic to as in the following example:

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.To see the load balancer distribute traffic across all three VMs running your app, you can force-refresh your web browser.

aggiunta e rimozione di VMAdd and remove VMs

Potrebbe essere necessario eseguire attività di manutenzione sulle VM che eseguono l'app, ad esempio per installare aggiornamenti del sistema operativo,You may need to perform maintenance on the VMs running your app, such as installing OS updates. oppure aggiungere altre VM per gestire un aumento del traffico verso l'app.To deal with increased traffic to your app, you may need to add additional VMs. Questa sezione illustra come rimuovere o aggiungere una VM nel servizio di bilanciamento del carico.This section shows you how to remove or add a VM from the load balancer.

Rimuovere una VM dal servizio di bilanciamento del caricoRemove a VM from the load balancer

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.Get the network interface card with Get-AzureRmNetworkInterface, then set the LoadBalancerBackendAddressPools property of the virtual NIC to $null. Infine, aggiornare la scheda di interfaccia di rete virtuale:Finally, update the virtual NIC.:

$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.To see the load balancer distribute traffic across the remaining two VMs running your app you can force-refresh your web browser. È ora possibile eseguire attività di manutenzione sulla VM, ad esempio installare aggiornamenti del sistema operativo o eseguire un riavvio della VM.You can now perform maintenance on the VM, such as installing OS updates or performing a VM reboot.

Aggiungere una VM al servizio di bilanciamento del caricoAdd a VM to the load balancer

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:After performing VM maintenance, or if you need to expand capacity, set the LoadBalancerBackendAddressPools property of the virtual NIC to the BackendAddressPool from Get-AzureRMLoadBalancer:

Ottenere il servizio di bilanciamento del carico:Get the load balancer:

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

Passaggi successiviNext steps

In questa esercitazione viene creato un bilanciamento del carico e vengono collegate le macchine virtuali.In this tutorial, you created a load balancer and attached VMs to it. Si è appreso come:You learned how to:

  • Creare un servizio di bilanciamento del carico di AzureCreate an Azure load balancer
  • Creare un probe di integrità per il servizio di bilanciamento del caricoCreate a load balancer health probe
  • Creare regole del traffico di bilanciamento del caricoCreate load balancer traffic rules
  • Usare l'estensione dello script personalizzata per creare un sito IIS di baseUse the Custom Script Extension to create a basic IIS site
  • Creare macchine virtuali e collegarsi a un bilanciamento del caricoCreate virtual machines and attach to a load balancer
  • Visualizzare un bilanciamento del carico in azioneView a load balancer in action
  • Aggiungere e rimuovere macchine virtuali da un bilanciamento del caricoAdd and remove VMs from a load balancer

Passare all'esercitazione successiva per imparare a gestire la rete delle macchine virtuali.Advance to the next tutorial to learn how to manage VM networking.