Creare un set di scalabilità di macchine virtuali e distribuire un'app a disponibilità elevata in LinuxCreate a Virtual Machine Scale Set and deploy a highly available app on Linux

Un set di scalabilità di macchine virtuali consente di distribuire e gestire un set di macchine virtuali identiche con scalabilità automatica.A virtual machine scale set allows you to deploy and manage a set of identical, auto-scaling virtual machines. È possibile ridimensionare manualmente il numero di VM nel set di scalabilità o definire regole di scalabilità automatica in base all'utilizzo delle risorse, ad esempio la CPU, alla richiesta di memoria o al traffico di rete.You can scale the number of VMs in the scale set manually, or define rules to autoscale based on resource usage such as CPU, memory demand, or network traffic. In questa esercitazione viene distribuito un set di scalabilità di macchine virtuali in Azure.In this tutorial, you deploy a virtual machine scale set in Azure. Si apprenderà come:You learn how to:

  • Usare cloud-init per creare un'app per la scalabilitàUse cloud-init to create an app to scale
  • Creare un set di scalabilità di macchine virtualiCreate a virtual machine scale set
  • Aumentare o diminuire il numero di istanze in un set di scalabilitàIncrease or decrease the number of instances in a scale set
  • Creare regole di scalabilità automaticaCreate autoscale rules
  • Visualizzare le informazioni di connessione per le istanze del set di scalabilitàView connection info for scale set instances
  • Usare dischi di dati in un set di scalabilitàUse data disks in a scale set

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.

Informazioni generali sui set di scalabilitàScale Set overview

Un set di scalabilità di macchine virtuali consente di distribuire e gestire un set di macchine virtuali identiche con scalabilità automatica.A virtual machine scale set allows you to deploy and manage a set of identical, auto-scaling virtual machines. Le macchine virtuali di un set di scalabilità vengono distribuite in domini logici di errore e di aggiornamento in uno o più gruppi di posizionamento.VMs in a scale set are distributed across logic fault and update domains in one or more placement groups. Si tratta di gruppi di VM configurate in modo simile, analoghi ai set di disponibilità.These are groups of similarly configured VMs, similar to availability sets.

Le macchine virtuali vengono create in base alle esigenze in un set di scalabilità.VMs are created as needed in a scale set. È possibile definire regole di scalabilità automatica per controllare le modalità e i tempi di aggiunta e rimozione delle VM dal set di scalabilità.You define autoscale rules to control how and when VMs are added or removed from the scale set. Queste regole possono essere attivate in base a determinate metriche, ad esempio il carico della CPU, l'utilizzo della memoria o il traffico di rete.These rules can trigger based on metrics such as CPU load, memory usage, or network traffic.

I set di scalabilità supportano fino a 1.000 VM quando si usa un'immagine della piattaforma Azure.Scale sets support up to 1,000 VMs when you use an Azure platform image. Per i carichi di lavoro con requisiti significativi di installazione o personalizzazione di VM, si consiglia di creare un'immagine di VM personalizzata.For workloads with significant installation or VM customization requirements, you may wish to Create a custom VM image. È possibile creare fino a 300 macchine virtuali in un set di scalabilità quando si usa un'immagine personalizzata.You can create up to 300 VMs in a scale set when using a custom image.

Creare un'app per la scalabilitàCreate an app to scale

Per l'uso in ambiente di produzione, è opportuno creare un'immagine di macchina virtuale personalizzata che includa l'applicazione installata e configurata.For production use, you may wish to Create a custom VM image that includes your application installed and configured. Per questa esercitazione si esegue la personalizzazione delle macchine virtuali al primo avvio per verificare rapidamente il funzionamento di un set di scalabilità.For this tutorial, lets customize the VMs on first boot to quickly see a scale set in action.

In un'esercitazione precedente, How to customize a Linux virtual machine on first boot, è stato descritto come personalizzare una macchina virtuale al primo avvio con cloud-init.In a previous tutorial, you learned How to customize a Linux virtual machine on first boot with cloud-init. È possibile usare lo stesso file di configurazione cloud-init per installare NGINX ed eseguire una semplice app Node.js "Hello World".You can use the same cloud-init configuration file to install NGINX and run a simple 'Hello World' Node.js app.

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 un set di scalabilitàCreate a scale set

Per poter creare un set di scalabilità, è prima necessario creare un gruppo di risorse con il comando az group create.Before you can create a scale set, create a resource group with az group create. Nell'esempio seguente viene creato un gruppo di risorse denominato myResourceGroupScaleSet nella posizione eastus:The following example creates a resource group named myResourceGroupScaleSet in the eastus location:

az group create --name myResourceGroupScaleSet --location eastus

Si può ora creare un set di scalabilità di macchine virtuali con il comando az vmss create.Now create a virtual machine scale set with az vmss create. Nell'esempio seguente viene creato un set di scalabilità denominato myScaleSet, viene usato il file cloud-int per personalizzare la VM e vengono generate le chiavi SSH, se non sono presenti:The following example creates a scale set named myScaleSet, uses the cloud-init file to customize the VM, and generates SSH keys if they do not exist:

az vmss create \
  --resource-group myResourceGroupScaleSet \
  --name myScaleSet \
  --image UbuntuLTS \
  --upgrade-policy-mode automatic \
  --custom-data cloud-init.txt \
  --admin-username azureuser \
  --generate-ssh-keys

La creazione e la configurazione di tutte le macchine virtuali e risorse del set di scalabilità richiedono alcuni minuti.It takes a few minutes to create and configure all the scale set resources and VMs. 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. 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.

Consentire il traffico WebAllow web traffic

Un bilanciamento del carico è stato creato automaticamente come parte del set di scalabilità di macchine virtuali.A load balancer was created automatically as part of the virtual machine scale set. Il bilanciamento del carico distribuisce il traffico ad un set di macchine virtuali definite usando le proprie regole.The load balancer distributes traffic across a set of defined VMs using load balancer rules. Altre informazioni sui concetti di bilanciamento del carico e sulla configurazione saranno illustrate nella prossima esercitazione, Come bilanciare il carico di macchine virtuali in Azure.You can learn more about load balancer concepts and configuration in the next tutorial, How to load balance virtual machines in Azure.

Per consentire al traffico di raggiungere l'app Web, creare una regola con il comando az network lb rule create.To allow traffic to reach the web app, create a rule with az network lb rule create. Nell'esempio seguente viene creata una regola denominata myLoadBalancerRuleWeb:The following example creates a rule named myLoadBalancerRuleWeb:

az network lb rule create \
  --resource-group myResourceGroupScaleSet \
  --name myLoadBalancerRuleWeb \
  --lb-name myScaleSetLB \
  --backend-pool-name myScaleSetLBBEPool \
  --backend-port 80 \
  --frontend-ip-name loadBalancerFrontEnd \
  --frontend-port 80 \
  --protocol tcp

Test dell'appTest your app

Per visualizzare l'app Node.js sul Web, ottenere l'indirizzo IP pubblico del bilanciamento del carico con il comando az network public-ip show.To see your Node.js app on the web, obtain the public IP address of your load balancer with az network public-ip show. Nell'esempio seguente si ottiene l'indirizzo IP per myScaleSetLBPublicIP creato come parte del set di scalabilità:The following example obtains the IP address for myScaleSetLBPublicIP created as part of the scale set:

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

Immettere l'indirizzo IP pubblico in un Web browser.Enter the public IP address in to a web browser. Verrà visualizzata l'app, con il nome host della VM a cui il servizio di bilanciamento del carico ha distribuito il traffico:The app is displayed, including the hostname of the VM that the load balancer distributed traffic to:

Esecuzione dell'app Node.js

Per verificare il funzionamento del set di scalabilità, è possibile imporre l'aggiornamento del Web browser per visualizzare la distribuzione del traffico da parte del bilanciamento del carico tra tutte le macchine virtuali che eseguono l'app.To see the scale set in action, you can force-refresh your web browser to see the load balancer distribute traffic across all the VMs running your app.

Attività di gestioneManagement tasks

Nel ciclo di vita del set di scalabilità, potrebbe essere necessario eseguire una o più attività di gestione.Throughout the lifecycle of the scale set, you may need to run one or more management tasks. Si potrebbe anche voler creare script per automatizzare le attività di ciclo di vita.Additionally, you may want to create scripts that automate various lifecycle-tasks. L'interfaccia della riga di comando di Azure 2.0 offre un modo rapido per eseguire tali operazioni.The Azure CLI 2.0 provides a quick way to do those tasks. Di seguito vengono illustrate alcune attività comuni.Here are a few common tasks.

Visualizzare le macchine virtuali in un set di scalabilitàView VMs in a scale set

Per visualizzare un elenco di macchine virtuali in esecuzione nel set di scalabilità, usare il comando az vmss list-instances come indicato di seguito:To view a list of VMs running in your scale set, use az vmss list-instances as follows:

az vmss list-instances \
  --resource-group myResourceGroupScaleSet \
  --name myScaleSet \
  --output table

L'output è simile all'esempio seguente:The output is similar to the following example:

  InstanceId  LatestModelApplied    Location    Name          ProvisioningState    ResourceGroup            VmId
------------  --------------------  ----------  ------------  -------------------  -----------------------  ------------------------------------
           1  True                  eastus      myScaleSet_1  Succeeded            MYRESOURCEGROUPSCALESET  c72ddc34-6c41-4a53-b89e-dd24f27b30ab
           3  True                  eastus      myScaleSet_3  Succeeded            MYRESOURCEGROUPSCALESET  44266022-65c3-49c5-92dd-88ffa64f95da

Aumentare o diminuire le istanze delle macchine virtualiIncrease or decrease VM instances

Per visualizzare il numero di istanze attualmente presenti in un set di scalabilità, usare il comando az vmss show ed eseguire una query su sku.capacity:To see the number of instances you currently have in a scale set, use az vmss show and query on sku.capacity:

az vmss show \
    --resource-group myResourceGroupScaleSet \
    --name myScaleSet \
    --query [sku.capacity] \
    --output table

È possibile aumentare o ridurre manualmente il numero di macchine virtuali nel set di scalabilità con il comando az vmss scale.You can then manually increase or decrease the number of virtual machines in the scale set with az vmss scale. L'esempio seguente imposta il numero di VM del set di scalabilità su 5:The following example sets the number of VMs in your scale set to 5:

az vmss scale \
    --resource-group myResourceGroupScaleSet \
    --name myScaleSet \
    --new-capacity 5

Configurare le regole di scalabilità automaticaConfigure autoscale rules

Invece di ridimensionare manualmente il numero di istanze del set di scalabilità, è possibile definire regole di scalabilità automatica.Rather than manually scaling the number of instances in your scale set, you can define autoscale rules. Queste regole monitorano le istanze nel set di scalabilità e rispondono di conseguenza in base alle metriche e alle soglie definite.These rules monitor the instances in your scale set and respond accordingly based on metrics and thresholds you define. L'esempio seguente aumenta il numero di istanze di uno quando il carico della CPU medio è maggiore del 60% per un periodo di 5 minuti.The following example scales out the number of instances by one when the average CPU load is greater than 60% over a 5-minute period. Se il carico della CPU medio scende poi sotto il 30% per un periodo di 5 minuti, le istanze vengono ridotte di una.If the average CPU load then drops below 30% over a 5-minute period, the instances are scaled in by one instance. L'ID della sottoscrizione viene usato per creare gli URI delle risorse per i diversi componenti del set di scalabilità.Your subscription ID is used to build the resource URIs for the various scale set components. Per creare queste regole con az monitor autoscale-settings create, copiare e incollare il profilo del comando di scalabilità automatica seguente:To create these rules with az monitor autoscale-settings create, copy and paste the following autoscale command profile:

sub=$(az account show --query id -o tsv)

az monitor autoscale-settings create \
    --resource-group myResourceGroupScaleSet \
    --name autoscale \
    --parameters '{"autoscale_setting_resource_name": "autoscale",
      "enabled": true,
      "location": "East US",
      "notifications": [],
      "profiles": [
        {
          "name": "Auto created scale condition",
          "capacity": {
            "minimum": "2",
            "maximum": "10",
            "default": "2"
          },
          "rules": [
            {
              "metricTrigger": {
                "metricName": "Percentage CPU",
                "metricNamespace": "",
                "metricResourceUri": "/subscriptions/'$sub'/resourceGroups/myResourceGroupScaleSet/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet",
                "metricResourceLocation": "eastus",
                "timeGrain": "PT1M",
                "statistic": "Average",
                "timeWindow": "PT5M",
                "timeAggregation": "Average",
                "operator": "GreaterThan",
                "threshold": 70
              },
              "scaleAction": {
                "direction": "Increase",
                "type": "ChangeCount",
                "value": "1",
                "cooldown": "PT5M"
              }
            },
            {
              "metricTrigger": {
                "metricName": "Percentage CPU",
                "metricNamespace": "",
                "metricResourceUri": "/subscriptions/'$sub'/resourceGroups/myResourceGroupScaleSet/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet",
                "metricResourceLocation": "eastus",
                "timeGrain": "PT1M",
                "statistic": "Average",
                "timeWindow": "PT5M",
                "timeAggregation": "Average",
                "operator": "LessThan",
                "threshold": 30
              },
              "scaleAction": {
                "direction": "Decrease",
                "type": "ChangeCount",
                "value": "1",
                "cooldown": "PT5M"
              }
            }
          ]
        }
      ],
      "tags": {},
      "target_resource_uri": "/subscriptions/'$sub'/resourceGroups/myResourceGroupScaleSet/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet"
    }'

Per usare di nuovo il profilo di scalabilità automatica, è possibile creare un file JSON (JavaScript Object Notation) e passarlo al comando az monitor autoscale-settings create con il parametro --parameters @autoscale.json.To reuse the autoscale profile, you can create a JSON (JavaScript Object Notation) file and pass that to the az monitor autoscale-settings create command with the --parameters @autoscale.json parameter. Per altre informazioni di progettazione sull'uso della scalabilità automatica, vedere Procedure consigliate per la scalabilità automatica.For more design information on the use of autoscale, see autoscale best practices.

Ottenere informazioni sulla connessioneGet connection info

Per ottenere informazioni sulla connessione delle macchine virtuali nel set di scalabilità, usare az vmss list-instance-connection-info.To obtain connection information about the VMs in your scale sets, use az vmss list-instance-connection-info. Questo comando restituisce l'indirizzo IP pubblico e la porta per ogni macchina virtuale che consente la connessione con SSH:This command outputs the public IP address and port for each VM that allows you to connect with SSH:

az vmss list-instance-connection-info \
    --resource-group myResourceGroupScaleSet \
    --name myScaleSet

Usare dischi di dati con set di scalabilitàUse data disks with scale sets

È possibile creare e usare dischi di dati con set di scalabilità.You can create and use data disks with scale sets. Nell'esercitazione precedente si è appreso come gestire i dischi di Azure, con le procedure consigliate e i miglioramenti delle prestazioni per la creazione di applicazioni su dischi di dati piuttosto che sul disco del sistema operativo.In a previous tutorial, you learned how to Manage Azure disks that outlines the best practices and performance improvements for building apps on data disks rather than the OS disk.

Creare un set di scalabilità con dischi di datiCreate scale set with data disks

Per creare un set di scalabilità e collegare dischi di dati, aggiungere il parametro --data-disk-sizes-gb al comando az vmss create.To create a scale set and attach data disks, add the --data-disk-sizes-gb parameter to the az vmss create command. Nell'esempio seguente viene creato un set di scalabilità con dischi di dati da 50 Gb collegati a ogni istanza:The following example creates a scale set with 50Gb data disks attached to each instance:

az vmss create \
    --resource-group myResourceGroupScaleSet \
    --name myScaleSetDisks \
    --image UbuntuLTS \
    --upgrade-policy-mode automatic \
    --custom-data cloud-init.txt \
    --admin-username azureuser \
    --generate-ssh-keys \
    --data-disk-sizes-gb 50

Quando le istanze vengono rimosse da un set di scalabilità, vengono rimossi anche tutti i dischi di dati collegati.When instances are removed from a scale set, any attached data disks are also removed.

Aggiungere dischi di datiAdd data disks

Per aggiungere un disco di dati per le istanze nel set di scalabilità, usare az vmss disk attach.To add a data disk to instances in your scale set, use az vmss disk attach. Nell'esempio seguente viene aggiunto un disco di dati da 50 Gb a ogni istanza:The following example adds a 50Gb disk to each instance:

az vmss disk attach \
    --resource-group myResourceGroupScaleSet \
    --name myScaleSet \
    --size-gb 50 \
    --lun 2

Scollegare dischi di datiDetach data disks

Per rimuovere un disco di dati per le istanze nel set di scalabilità, usare az vmss disk detach.To remove a data disk to instances in your scale set, use az vmss disk detach. Nell'esempio seguente viene rimosso il disco di dati del LUN 2 da ogni istanza:The following example removes the data disk at LUN 2 from each instance:

az vmss disk detach \
    --resource-group myResourceGroupScaleSet \
    --name myScaleSet \
    --lun 2

Passaggi successiviNext steps

In questa esercitazione è stato creato un set di scalabilità di macchine virtuali.In this tutorial, you created a virtual machine scale set. Si è appreso come:You learned how to:

  • Usare cloud-init per creare un'app per la scalabilitàUse cloud-init to create an app to scale
  • Creare un set di scalabilità di macchine virtualiCreate a virtual machine scale set
  • Aumentare o diminuire il numero di istanze in un set di scalabilitàIncrease or decrease the number of instances in a scale set
  • Creare regole di scalabilità automaticaCreate autoscale rules
  • Visualizzare le informazioni di connessione per le istanze del set di scalabilitàView connection info for scale set instances
  • Usare dischi di dati in un set di scalabilitàUse data disks in a scale set

Passare all'esercitazione successiva per maggiori informazioni sui concetti di bilanciamento del carico per le macchine virtuali.Advance to the next tutorial to learn more about load balancing concepts for virtual machines.