Condividi tramite


Esercitazione: Modificare un set di scalabilità di macchine virtuali usando Azure CLI

Per tutto il ciclo di vita delle applicazioni, potrebbe essere necessario modificare o aggiornare il set di scalabilità di macchine virtuali. Questi aggiornamenti possono includere come aggiornare la configurazione del set di scalabilità o modificare la configurazione dell'applicazione. Questo articolo descrive come modificare un set di scalabilità esistente usando l'interfaccia della riga di comando di Azure.

Di seguito vengono dichiarate variabili di ambiente che verranno usate in questo documento. Viene aggiunto un suffisso casuale ai nomi delle risorse che devono essere univoci per ogni distribuzione. Il REGION è impostato su WestUS2.

Configurare un gruppo di risorse

Prima di procedere, verificare che il gruppo di risorse esista. Questo passaggio crea il gruppo di risorse, se non esiste già.

export RANDOM_SUFFIX=$(openssl rand -hex 3)
export MY_RESOURCE_GROUP_NAME="myResourceGroup$RANDOM_SUFFIX"
export REGION="WestUS2"
az group create --name $MY_RESOURCE_GROUP_NAME --location $REGION
{
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx",
  "location": "WestUS2",
  "managedBy": null,
  "name": "myResourceGroupxxx",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

Creare il set di scalabilità per le macchine virtuali

Per assicurarsi che i comandi di aggiornamento e query successivi dispongano di una risorsa valida su cui lavorare, creare un set di scalabilità di macchine virtuali. In questo passaggio viene distribuito un set di scalabilità di base usando un'immagine valida (Ubuntu2204) e si imposta il numero di istanze su 5 in modo che gli aggiornamenti specifici dell'istanza possano essere destinati a un ID istanza esistente.

export SCALE_SET_NAME="myScaleSet$RANDOM_SUFFIX"
az vmss create \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --image Ubuntu2204 \
  --upgrade-policy-mode manual \
  --instance-count 5 \
  --admin-username azureuser \
  --generate-ssh-keys
{
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
  "location": "WestUS2",
  "name": "myScaleSetxxx",
  "provisioningState": "Succeeded"
}

Aggiornare il modello del set di scalabilità

Un set di scalabilità ha un "modello" che acquisisce lo stato desiderato del set di scalabilità nel suo insieme. Per interrogare il modello di un set di scalabilità, è possibile usare az vmss show:

az vmss show --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME

La presentazione esatta dell'output dipende dalle opzioni fornite al comando. L'esempio seguente illustra l'output di esempio condensato dall'interfaccia della riga di comando di Azure:

{
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
  "location": "WestUS2",
  "name": "myScaleSetxxx",
  "orchestrationMode": "Flexible",
  "platformFaultDomainCount": 1,
  "resourceGroup": "myResourceGroupxxx",
  "sku": {
    "capacity": 5,
    "name": "Standard_DS1_v2",
    "tier": "Standard"
  },
  "timeCreated": "2022-11-29T22:16:43.250912+00:00",
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  "networkProfile": {
    "networkApiVersion": "2020-11-01",
    "networkInterfaceConfigurations": [
      {
        "deleteOption": "Delete",
        "disableTcpStateTracking": false,
        "dnsSettings": {
          "dnsServers": []
        },
        "enableIpForwarding": false,
        "ipConfigurations": [
          {
            "applicationGatewayBackendAddressPools": [],
            "applicationSecurityGroups": [],
            "loadBalancerBackendAddressPools": [
              {
                "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/loadBalancers/myScaleSetLB/backendAddressPools/myScaleSetLBBEPool",
                "resourceGroup": "myResourceGroupxxx"
              }
            ],
            "name": "mysca2215IPConfig",
            "privateIpAddressVersion": "IPv4",
            "subnet": {
              "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myScaleSetVNET/subnets/myScaleSetSubnet",
              "resourceGroup": "myResourceGroupxxx"
            }
          }
        ],
        "name": "mysca2215Nic",
        "networkSecurityGroup": {
          "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/networkSecurityGroups/myScaleSetNSG",
          "resourceGroup": "myResourceGroupxxx"
        },
        "primary": true
      }
    ]
  },
  "osProfile": {
    "allowExtensionOperations": true,
    "computerNamePrefix": "myScaleS",
    "linuxConfiguration": {
      "disablePasswordAuthentication": true,
      "enableVmAgentPlatformUpdates": false,
      "patchSettings": {
        "assessmentMode": "ImageDefault",
        "patchMode": "ImageDefault"
      },
      "provisionVmAgent": true
    }
  },
  "storageProfile": {
    "imageReference": {
      "offer": "UbuntuServer",
      "publisher": "Canonical",
      "sku": "22_04-lts",
      "version": "latest"
    },
    "osDisk": {
      "caching": "ReadWrite",
      "createOption": "FromImage",
      "deleteOption": "Delete",
      "diskSizeGb": 30,
      "managedDisk": {
        "storageAccountType": "Premium_LRS"
      },
      "osType": "Linux"
    }
  }
}

È possibile usare az vmss update per aggiornare varie proprietà del set di scalabilità. Ad esempio, aggiornare il tipo di licenza o i criteri di protezione dell'istanza di una macchina virtuale. Si noti che il valore del tipo di licenza consentito è RHEL_BYOS anziché Windows_Server.

az vmss update --name $SCALE_SET_NAME --resource-group $MY_RESOURCE_GROUP_NAME --license-type RHEL_BYOS
export INSTANCE_ID=$(az vmss list-instances \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --query "[0].instanceId" \
  -o tsv)

az vmss update \
  --name $SCALE_SET_NAME \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --instance-id "$INSTANCE_ID" \
  --protect-from-scale-set-actions False \
  --protect-from-scale-in

Inoltre, se il set di scalabilità è stato distribuito in precedenza con il az vmss create comando , è possibile eseguire di nuovo il az vmss create comando per aggiornare il set di scalabilità. Verificare che tutte le proprietà nel comando az vmss create siano rimaste invariate, a eccezione di quelle che si vuole modificare. Ad esempio, di seguito viene aumentato il numero di istanze a cinque.

Importante

A partire da novembre 2023, i set di scalabilità di macchine virtuali creati con PowerShell e l'interfaccia della riga di comando di Azure avranno per impostazione predefinita la modalità di orchestrazione flessibile se non è specificata alcuna modalità di orchestrazione. Per altre informazioni su questa modifica e sulle azioni da eseguire, vedere Modifica che causa un'interruzione per i clienti di PowerShell/CLI di VMSS - Hub della community Microsoft

az vmss create \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --orchestration-mode flexible \
  --image RHELRaw8LVMGen2 \
  --admin-username azureuser \
  --generate-ssh-keys \
  --instance-count 5 \
  --os-disk-size-gb 64

Aggiornamento di singole istanze di vm in un set di scalabilità

Come un set di scalabilità ha una visualizzazione modello, così anche ogni istanza di macchina virtuale nel set di scalabilità ha una propria visualizzazione modello. Per eseguire una query sulla vista del modello per una determinata istanza di macchina virtuale in un set di scalabilità, è possibile usare az vm show.

export INSTANCE_NAME=$(az vmss list-instances \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --query "[0].name" \
  -o tsv)

az vm show --resource-group $MY_RESOURCE_GROUP_NAME --name $INSTANCE_NAME

La presentazione esatta dell'output dipende dalle opzioni fornite al comando. L'esempio seguente illustra l'output di esempio condensato dall'interfaccia della riga di comando di Azure:

{
  "hardwareProfile": {
    "vmSize": "Standard_DS1_v2"
  },
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachines/myScaleSet_Instance1",
  "location": "WestUS2",
  "name": "myScaleSet_Instance1",
  "networkProfile": {
    "networkInterfaces": [
      {
        "deleteOption": "Delete",
        "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/networkInterfaces/mysca2215Nic-5cf164f7",
        "primary": true,
        "resourceGroup": "myResourceGroupxxx"
      }
    ]
  },
  "osProfile": {
    "allowExtensionOperations": true,
    "computerName": "myScaleset_Computer1",
    "linuxConfiguration": {
      "disablePasswordAuthentication": true,
      "enableVmAgentPlatformUpdates": false,
      "patchSettings": {
        "assessmentMode": "ImageDefault",
        "patchMode": "ImageDefault"
      },
      "provisionVmAgent": true
    }
  },
  "provisioningState": "Succeeded",
  "resourceGroup": "myResourceGroupxxx",
  "storageProfile": {
    "dataDisks": [],
    "imageReference": {
      "exactVersion": "22.04.202204200",
      "offer": "0001-com-ubuntu-server-jammy",
      "publisher": "Canonical",
      "sku": "22_04-lts",
      "version": "latest"
    },
    "osDisk": {
      "caching": "ReadWrite",
      "createOption": "FromImage",
      "deleteOption": "Delete",
      "diskSizeGb": 30,
      "managedDisk": {
        "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/disks/myScaleSet_Instance1_disk1_xxx",
        "resourceGroup": "myResourceGroupxxx",
        "storageAccountType": "Premium_LRS"
      },
      "name": "myScaleSet_Instance1_disk1_xxx",
      "osType": "Linux"
    }
  },
  "timeCreated": "2022-11-29T22:16:44.500895+00:00",
  "type": "Microsoft.Compute/virtualMachines",
  "virtualMachineScaleSet": {
    "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
    "resourceGroup": "myResourceGroupxxx"
  }
}

Queste proprietà descrivono la configurazione di un'istanza della macchina virtuale all'interno di un set di scalabilità e non quella del set di scalabilità nel suo insieme.

È possibile eseguire aggiornamenti alle singole istanze di macchina virtuale in un set di scalabilità esattamente come si farebbe con una macchina virtuale autonoma. Ad esempio, collegare un nuovo disco dati all'istanza 1:

az vm disk attach --resource-group $MY_RESOURCE_GROUP_NAME --vm-name $INSTANCE_NAME --name disk_name1 --new

Eseguendo di nuovo az vm show , si noterà che l'istanza della macchina virtuale ha il nuovo disco collegato.

{
  "storageProfile": {
    "dataDisks": [
      {
        "caching": "None",
        "createOption": "Empty",
        "deleteOption": "Detach",
        "diskSizeGb": 1023,
        "lun": 0,
        "managedDisk": {
          "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/disks/disk_name1",
          "resourceGroup": "myResourceGroupxxx",
          "storageAccountType": "Premium_LRS"
        },
        "name": "disk_name1",
        "toBeDetached": false
      }
    ]
  }
}

Aggiungere un'istanza al set di scalabilità

In alcuni casi potrebbe essere necessario aggiungere una nuova macchina virtuale al set di scalabilità, ma si vogliono opzioni di configurazione diverse rispetto a quelle elencate nel modello del set di scalabilità. Le macchine virtuali possono essere aggiunte a un set di scalabilità durante la creazione usando il comando az vm create e specificando il nome del set di scalabilità a cui si vuole aggiungere l'istanza.

export NEW_INSTANCE_NAME="myNewInstance$RANDOM_SUFFIX"
az vm create --name $NEW_INSTANCE_NAME --resource-group $MY_RESOURCE_GROUP_NAME --vmss $SCALE_SET_NAME --image RHELRaw8LVMGen2
{
  "fqdns": "",
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachines/myNewInstancexxx",
  "location": "WestUS2",
  "macAddress": "60-45-BD-D7-13-DD",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.6",
  "publicIpAddress": "20.172.144.96",
  "resourceGroup": "myResourceGroupxxx",
  "zones": ""
}

Se quindi si controlla il set di scalabilità, verrà aggiunta la nuova istanza.

az vm list --resource-group $MY_RESOURCE_GROUP_NAME --output table
Name                  ResourceGroup      Location
--------------------  ---------------    ----------
myNewInstancexxx      myResourceGroupxxx WestUS2
myScaleSet_Instance1  myResourceGroupxxx WestUS2
myScaleSet_Instance1  myResourceGroupxxx WestUS2

Bring VMs up-to-date with the latest scale set model (Porta le macchine virtuali up-to-date con il modello del set di scalabilità più recente)

Annotazioni

Le modalità di aggiornamento non sono attualmente supportate nei set di scalabilità di macchine virtuali usando la modalità di orchestrazione flessibile.

I set di scalabilità hanno un "criterio di aggiornamento" che determina il modo in cui le macchine virtuali vengono portate up-to-date con il modello del set di scalabilità più recente. Le tre modalità per la politica di aggiornamento sono:

  • Automatico : in questa modalità, il set di scalabilità non garantisce l'ordine di arresto delle macchine virtuali. Il set di scalabilità può ridurre tutte le macchine virtuali contemporaneamente.
  • A rotazione: in questa modalità, il set di scalabilità implementa l'aggiornamento in lotti con un tempo di pausa facoltativo tra i lotti.
  • Manuale : in questa modalità, quando si aggiorna il modello del set di scalabilità, non accade nulla alle macchine virtuali esistenti fino a quando non viene attivato un aggiornamento manuale.

Se il set di scalabilità è impostato su aggiornamenti manuali, è possibile attivare un aggiornamento manuale usando az vmss update.

az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME

Annotazioni

I cluster di Service Fabric possono usare solo la modalità automatica , ma l'aggiornamento viene gestito in modo diverso. Per altre informazioni, vedere Aggiornamenti delle applicazioni di Service Fabric.

Ricreare un set di scalabilità

I set di scalabilità di macchine virtuali genereranno un nome univoco per ogni macchina virtuale nel set di scalabilità. La convenzione di denominazione differisce in base alla modalità di orchestrazione:

  • Modalità di orchestrazione flessibile: {scale-set-name}_{8-char-guid}
  • Modalità uniforme di orchestrazione: {scale-set-name}_{instance-id}

Nei casi in cui è necessario eseguire di nuovo l'immagine di un'istanza specifica, usare az vmss reimage e specificare l'ID istanza. Un'altra opzione consiste nell'usare az vm redeploy per creare nuovamente l'immagine della macchina virtuale direttamente. Questo comando è utile se si vuole eseguire di nuovo l'immagine di una macchina virtuale senza dover specificare l'ID istanza.

# Get the VM name first
VM_NAME=$(az vmss list-instances \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --query "[0].name" \
  -o tsv)

# Reimage the VM directly
az vm redeploy \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $VM_NAME

Aggiornare l'immagine del sistema operativo per il set di scalabilità

Potrebbe essere disponibile un set di scalabilità che esegue una versione precedente di Ubuntu. Si vuole eseguire l'aggiornamento a una versione più recente di Ubuntu, ad esempio la versione più recente. La proprietà della versione di riferimento dell'immagine non fa parte di un elenco, quindi è possibile modificare direttamente queste proprietà usando az vmss update.

az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --set virtualMachineProfile.storageProfile.imageReference.version=latest

In alternativa è possibile modificare l'immagine usata dal set di scalabilità. Ad esempio è possibile aggiornare o modificare un'immagine personalizzata usata dal set di scalabilità. È possibile modificare l'immagine usata dal set di scalabilità aggiornando la proprietà dell'ID di riferimento all'immagine. La proprietà ID riferimento immagine non fa parte di un elenco, quindi è possibile modificare direttamente questa proprietà usando az vmss update.

Se si usano immagini della piattaforma di Azure, è possibile aggiornare l'immagine modificando la proprietà imageReference. Per altre informazioni, vedere la documentazione relativa all'API REST.

Annotazioni

Con le immagini della piattaforma si specifica solitamente "latest" come versione del riferimento all'immagine. Quando si crea, si aumenta il numero di istanze e si ricrea l'immagine, le macchine virtuali vengono create con l'ultima versione disponibile. Non significa però che l'immagine del sistema operativo viene aggiornata automaticamente nel tempo man mano che vengono rilasciate nuove versioni dell'immagine. Una funzionalità separata fornisce aggiornamenti automatici del sistema operativo. Per altre informazioni, consultare la documentazione relativa agli aggiornamenti automatici del sistema operativo.

Se si usano immagini personalizzate, è possibile aggiornare l'immagine aggiornando l'ID della proprietà imageReference. Per altre informazioni, vedere la documentazione relativa all'API REST.

Aggiornare il bilanciamento del carico del set di scalabilità

Supponiamo di avere un set di scalabilità con un servizio Azure Load Balancer e di voler sostituire tale servizio con un gateway applicazione di Azure. Le proprietà del servizio di bilanciamento del carico e del Gateway applicativo per un set di scalabilità automatica fanno parte di un elenco, pertanto è possibile usare i comandi per rimuovere o aggiungere elementi della lista anziché modificare direttamente le proprietà.

# Remove the load balancer backend pool from the scale set model
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --remove virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].loadBalancerBackendAddressPools 0

# Remove the load balancer backend pool from the scale set model; only necessary if you have NAT pools configured on the scale set
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --remove virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].loadBalancerInboundNatPools 0

# Add the application gateway backend pool to the scale set model
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --add virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].ApplicationGatewayBackendAddressPools '{"id": "/subscriptions/xxxxx/resourceGroups/'$MY_RESOURCE_GROUP_NAME'/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/{applicationGatewayBackendPoolName}"}'

Annotazioni

Questi comandi presuppongono che nel set di scalabilità siano presenti una sola configurazione IP e un solo servizio di bilanciamento del carico. Se ce ne sono di più, potrebbe essere necessario usare un indice di elenco diverso da 0.

Passaggi successivi

In questo tutorial, hai imparato come modificare vari aspetti del set di scalabilità e delle singole istanze.

  • Aggiornare il modello del set di scalabilità
  • Aggiornare una singola istanza di macchina virtuale in un set di scalabilità
  • Aggiungere un'istanza al set di scalabilità
  • Bring VMs up-to-date with the latest scale set model (Porta le macchine virtuali up-to-date con il modello del set di scalabilità più recente)
  • Ricreare un set di scalabilità
  • Aggiornare l'immagine del sistema operativo per il set di scalabilità
  • Aggiornare il bilanciamento del carico del set di scalabilità