Come bilanciare il carico per le macchine virtuali di Linux in Azure per creare un'applicazione a disponibilità elevataHow to load balance Linux 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 cloud-init per creare un'applicazione di base Node.jsUse cloud-init to create a basic Node.js app
  • 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

Avviare Azure Cloud ShellLaunch Azure Cloud Shell

Azure Cloud Shell è una shell Bash gratuita che può essere eseguita direttamente nel portale di Azure.The Azure Cloud Shell is a free Bash shell that you can run directly within the Azure portal. Include l'interfaccia della riga di comando di Azure preinstallata e configurata per l'uso con l'account.It has the Azure CLI preinstalled and configured to use with your account. Fare clic sul pulsante Cloud Shell nel menu nel riquadro in alto a destra nel portale di Azure.Click the Cloud Shell button on the menu in the upper-right of the Azure portal.

Cloud ShellCloud Shell

Il pulsante avvia una shell interattiva che è possibile usare per eseguire i passaggi di questo argomento:The button launches an interactive shell that you can use to run the steps in this topic:

Screenshot che mostra la finestra di Cloud Shell nel portaleScreenshot showing the Cloud Shell window in the portal

Se si sceglie di installare e usare l'interfaccia della riga di comando in locale, per questa esercitazione è necessario eseguire l'interfaccia della riga di comando di Azure versione 2.0.4 o successiva.If you choose to install and use the CLI locally, this tutorial requires that you are running the Azure CLI version 2.0.4 or later. Eseguire az --version per trovare la versione.Run az --version to find the version. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure 2.0.If you need to install or upgrade, see Install Azure CLI 2.0.

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.

Se è stata eseguita l'esercitazione precedente per creare un set di scalabilità della macchina virtuale, è stato creato un servizio di bilanciamento del carico.If you followed the previous tutorial to create a virtual machine scale set, a load balancer was created for you. Tutti questi componenti sono stati configurati come parte del set di scalabilità.All these components were configured for you as part of the scale set.

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 az group create.Before you can create your load balancer, create a resource group with az group create. Nell'esempio seguente viene creato un gruppo di risorse denominato myResourceGroupLoadBalancer nella posizione eastus:The following example creates a resource group named myResourceGroupLoadBalancer in the eastus location:

az group create --name 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 az network public-ip create.Create a public IP address with az network public-ip create. 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:

az network public-ip create \
    --resource-group myResourceGroupLoadBalancer \
    --name myPublicIP

Creare un servizio di bilanciamento del caricoCreate a load balancer

Creare un servizio di bilanciamento del carico con az network lb create.Create a load balancer with az network lb create. L'esempio seguente crea un servizio di bilanciamento del carico denominato myLoadBalancer e assegna l'indirizzo myPublicIP alla configurazione IP front-end:The following example creates a load balancer named myLoadBalancer and assigns the myPublicIP address to the front-end IP configuration:

az network lb create \
    --resource-group myResourceGroupLoadBalancer \
    --name myLoadBalancer \
    --frontend-ip-name myFrontEndPool \
    --backend-pool-name myBackEndPool \
    --public-ip-address myPublicIP

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.js.When using a custom HTTP probe, you must create the health check page, such as healthcheck.js. 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 di integrità TCP, usare con az network lb probe create.To create a TCP health probe, you use az network lb probe create. L'esempio seguente crea un probe di integrità denominato myHealthProbe:The following example creates a health probe named myHealthProbe:

az network lb probe create \
    --resource-group myResourceGroupLoadBalancer \
    --lb-name myLoadBalancer \
    --name myHealthProbe \
    --protocol tcp \
    --port 80

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 az network lb rule create.Create a load balancer rule with az network lb rule create. L'esempio seguente crea una regola denominata myLoadBalancerRule, usa il probe di integrità myHealthProbe e bilancia il traffico sulla porta 80:The following example creates a rule named myLoadBalancerRule, uses the myHealthProbe health probe, and balances traffic on port 80:

az network lb rule create \
    --resource-group myResourceGroupLoadBalancer \
    --lb-name myLoadBalancer \
    --name myLoadBalancerRule \
    --protocol tcp \
    --frontend-port 80 \
    --backend-port 80 \
    --frontend-ip-name myFrontEndPool \
    --backend-pool-name myBackEndPool \
    --probe-name myHealthProbe

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 az network vnet create.Create a virtual network with az network vnet create. L'esempio seguente crea una rete virtuale denominata myVnet con una subnet denominata mySubnet:The following example creates a virtual network named myVnet with a subnet named mySubnet:

az network vnet create \
    --resource-group myResourceGroupLoadBalancer \
    --name myVnet \
    --subnet-name mySubnet

Per aggiungere un gruppo di sicurezza di rete usare az network nsg create.To add a network security group, you use az network nsg create. L'esempio seguente crea un gruppo di sicurezza di rete denominato myNetworkSecurityGroup:The following example creates a network security group named myNetworkSecurityGroup:

az network nsg create \
    --resource-group myResourceGroupLoadBalancer \
    --name myNetworkSecurityGroup

Creare una regola del gruppo di sicurezza di rete con az network nsg rule create.Create a network security group rule with az network nsg rule create. L'esempio seguente crea una regola del gruppo di sicurezza di rete denominata myNetworkSecurityGroupRule:The following example creates a network security group rule named myNetworkSecurityGroupRule:

az network nsg rule create \
    --resource-group myResourceGroupLoadBalancer \
    --nsg-name myNetworkSecurityGroup \
    --name myNetworkSecurityGroupRule \
    --priority 1001 \
    --protocol tcp \
    --destination-port-range 80

Le schede di interfaccia di rete virtuale vengono create con az network nic create.Virtual NICs are created with az network nic create. 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 in `seq 1 3`; do
    az network nic create \
        --resource-group myResourceGroupLoadBalancer \
        --name myNic$i \
        --vnet-name myVnet \
        --subnet mySubnet \
        --network-security-group myNetworkSecurityGroup \
        --lb-name myLoadBalancer \
        --lb-address-pools myBackEndPool
done

Una volta create tutte e tre le schede di interfaccia di rete virtuale, continuare con il passaggio successivoWhen all three virtual NICs are created, continue on to the next step

Creare macchine virtualiCreate virtual machines

Creare una configurazione cloud-initCreate cloud-init config

In un'esercitazione precedente, How to customize a Linux virtual machine on first boot (Come personalizzare una macchina virtuale Linux al primo avvio), è stato descritto come personalizzare una macchina virtuale al primo avvio con cloud-init.In a previous tutorial on How to customize a Linux virtual machine on first boot, you learned how to automate VM customization with cloud-init. È possibile usare lo stesso file di configurazione cloud-init per installare NGINX ed eseguire una semplice app Node.js 'Hello World' nel passaggio successivo.You can use the same cloud-init configuration file to install NGINX and run a simple 'Hello World' Node.js app in the next step. Per visualizzare il bilanciamento del carico in azione, alla fine dell'esercitazione si accede a questa semplice app in un Web browser.To see the load balancer in action, at the end of the tutorial you access this simple app in a web browser.

Nella shell corrente creare un file denominato cloud-init.txt e incollare la configurazione seguente.In your current shell, create a file named cloud-init.txt and paste the following configuration. Ad esempio, creare il file in Cloud Shell anziché nel computer locale.For example, create the file in the Cloud Shell not on your local machine. Immettere sensible-editor cloud-init.txt per creare il file e visualizzare un elenco degli editor disponibili.Enter sensible-editor cloud-init.txt to create the file and see a list of available editors. Assicurarsi che l'intero file cloud-init venga copiato correttamente, in particolare la prima riga:Make sure that the whole cloud-init file is copied correctly, especially the first line:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
  - path: /etc/nginx/sites-available/default
    content: |
      server {
        listen 80;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
  - path: /home/azureuser/myapp/index.js
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

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. Per altre informazioni sui set di disponibilità, vedere l'esercitazione precedente Come creare macchine virtuali a disponibilità elevata.For more information about availability sets, see the previous How to create highly available virtual machines tutorial.

Creare un set di disponibilità con az vm availability-set create.Create an availability set with az vm availability-set create. L'esempio seguente crea un set di disponibilità denominato myAvailabilitySet:The following example creates an availability set named myAvailabilitySet:

az vm availability-set create \
    --resource-group myResourceGroupLoadBalancer \
    --name myAvailabilitySet

Ora è possibile creare le VM con az vm create.Now you can create the VMs with az vm create. L'esempio seguente crea tre VM e genera le chiavi SSH, se non sono già presenti:The following example creates three VMs and generates SSH keys if they do not already exist:

for i in `seq 1 3`; do
    az vm create \
        --resource-group myResourceGroupLoadBalancer \
        --name myVM$i \
        --availability-set myAvailabilitySet \
        --nics myNic$i \
        --image UbuntuLTS \
        --admin-username azureuser \
        --generate-ssh-keys \
        --custom-data cloud-init.txt \
        --no-wait
done

Sono presenti attività in background la cui esecuzione continua dopo che l'interfaccia della riga di comando di Azure è tornata al prompt.There are background tasks that continue to run after the Azure CLI returns you to the prompt. Il parametro --no-wait non attende il completamento di tutte le attività.The --no-wait parameter does not wait for all the tasks to complete. Potrebbe trascorrere ancora qualche minuto prima che sia possibile accedere all'app.It may be another couple of minutes before you can access the app. Il probe di integrità del servizio di bilanciamento del carico rileva quando l'app è in esecuzione in ogni VM.The load balancer health probe automatically detects when the app is running on each VM. Quando l'app è in esecuzione, la regola di bilanciamento del carico inizia a distribuire il traffico.Once the app is running, the load balancer rule starts to distribute traffic.

Testare il bilanciamento del caricoTest load balancer

Ottenere l'indirizzo IP pubblico del servizio di bilanciamento del carico con az network public-ip show.Obtain the public IP address of your load balancer with az network public-ip show. L'esempio seguente ottiene l'indirizzo IP per myPublicIP creato in precedenza:The following example obtains the IP address for myPublicIP created earlier:

az network public-ip show \
    --resource-group myResourceGroupLoadBalancer \
    --name myPublicIP \
    --query [ipAddress] \
    --output tsv

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. Si ricordi che sono necessari alcuni minuti affinché le macchine virtuali siano pronte e che il bilanciamento del carico inizi a distribuire traffico ad esse.Remember - it takes a few minutes for the VMs to be ready before the load balancer starts to distribute traffic to them. Verrà visualizzata l'app, con il nome host della macchina virtuale a cui il servizio di bilanciamento del carico ha distribuito il traffico, come nell'esempio seguente:The app is displayed, including the hostname of the VM that the load balancer distributed traffic to as in the following example:

Esecuzione dell'app Node.js

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

È possibile rimuovere una VM dal pool di indirizzi back-end con az network nic ip-config address-pool remove.You can remove a VM from the backend address pool with az network nic ip-config address-pool remove. L'esempio seguente rimuove la scheda di interfaccia di rete virtuale per myVM2 da myLoadBalancer:The following example removes the virtual NIC for myVM2 from myLoadBalancer:

az network nic ip-config address-pool remove \
    --resource-group myResourceGroupLoadBalancer \
    --nic-name myNic2 \
    --ip-config-name ipConfig1 \
    --lb-name myLoadBalancer \
    --address-pool myBackEndPool 

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.

Per visualizzare un elenco di macchine virtuali con schede di interfaccia di rete virtuale connesse al bilanciamento del carico, usare az network lb address-pool show.To view a list of VMs with virtual NICs connected to the load balancer, use az network lb address-pool show. Eseguire una query e filtrare l'ID della scheda di interfaccia di rete virtuale come indicato di seguito:Query and filter on the ID of the virtual NIC as follows:

az network lb address-pool show \
    --resource-group myResourceGroupLoadBalancer \
    --lb-name myLoadBalancer \
    --name myBackEndPool \
    --query backendIpConfigurations \
    --output tsv | cut -f4

L'output è simile all'esempio seguente, che indica che la scheda di interfaccia di rete virtuale per VM 2 non fa più parte del pool di indirizzi back-end:The output is similar to the following example, which shows that the virtual NIC for VM 2 is no longer part of the backend address pool:

/subscriptions/<guid>/resourceGroups/myResourceGroupLoadBalancer/providers/Microsoft.Network/networkInterfaces/myNic1/ipConfigurations/ipconfig1
/subscriptions/<guid>/resourceGroups/myResourceGroupLoadBalancer/providers/Microsoft.Network/networkInterfaces/myNic3/ipConfigurations/ipconfig1

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

Al termine della manutenzione di una VM o se è necessario espandere la capacità, è possibile aggiungere una VM al pool di indirizzi back-end con az network nic ip-config address-pool add.After performing VM maintenance, or if you need to expand capacity, you can add a VM to the backend address pool with az network nic ip-config address-pool add. L'esempio seguente aggiunge la scheda di interfaccia di rete virtuale per myVM2 a myLoadBalancer:The following example adds the virtual NIC for myVM2 to myLoadBalancer:

az network nic ip-config address-pool add \
    --resource-group myResourceGroupLoadBalancer \
    --nic-name myNic2 \
    --ip-config-name ipConfig1 \
    --lb-name myLoadBalancer \
    --address-pool myBackEndPool

Per verificare che la scheda di interfaccia di rete virtuale sia connessa al pool di indirizzi back-end, usare nuovamente az network lb address-pool show dal passaggio precedente.To verify that the virtual NIC is connected to the backend address pool, use az network lb address-pool show again from the preceding step.

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 cloud-init per creare un'applicazione di base Node.jsUse cloud-init to create a basic Node.js app
  • 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 altre informazioni sui componenti della rete virtuale di Azure.Advance to the next tutorial to learn more about Azure virtual network components.