Modificar um conjunto de escala de máquina virtual

Nota

Muitas das etapas listadas neste documento se aplicam a Conjuntos de Escala de Máquina Virtual usando o modo de Orquestração Uniforme. Recomendamos o uso da Orquestração Flexível para novas cargas de trabalho. Para obter mais informações, consulte Modos de ordenação para conjuntos de escala de máquina virtual no Azure.

Durante todo o ciclo de vida de seus aplicativos, talvez seja necessário modificar ou atualizar seu Conjunto de Dimensionamento de Máquina Virtual. Essas atualizações podem incluir como atualizar a configuração do conjunto de escala ou alterar a configuração do aplicativo. Este artigo descreve como modificar um conjunto de escala existente com as APIs REST, Azure PowerShell ou CLI do Azure.

Conceitos fundamentais

O modelo de conjunto de escala

Um conjunto de escalas tem um "modelo de conjunto de escalas" que captura o estado desejado do conjunto de escalas como um todo. Para consultar o modelo para um conjunto de escalas, você pode usar o

  • API REST com compute/virtualmachinescalesets/get da seguinte forma:

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet?api-version={apiVersion}
    
  • Azure PowerShell com Get-AzVmss:

    Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet"
    
  • CLI do Azure com az vmss show:

    az vmss show --resource-group myResourceGroup --name myScaleSet
    
  • Você também pode usar o resources.azure.com ou os SDKs do Azure específicos do idioma.

A apresentação exata da saída depende das opções fornecidas ao comando. O exemplo a seguir mostra a saída de exemplo condensada da CLI do Azure:

az vmss show --resource-group myResourceGroup --name myScaleSet
{
  "location": "westus",
  "overprovision": true,
  "plan": null,
  "singlePlacementGroup": true,
  "sku": {
    "additionalProperties": {},
    "capacity": 1,
    "name": "Standard_D2_v2",
    "tier": "Standard"
  },
}

Essas propriedades se aplicam ao conjunto de escala como um todo.

A exibição de instância do conjunto de escala

Um conjunto de escala também tem uma "exibição de instância de conjunto de escala" que captura o estado de tempo de execução atual do conjunto de escala como um todo. Para consultar a exibição de instância para um conjunto de escalas, você pode usar:

  • API REST com compute/virtualmachinescalesets/getinstanceview da seguinte forma:

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/instanceView?api-version={apiVersion}
    
  • Azure PowerShell com Get-AzVmss:

    Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceView
    
  • CLI do Azure com az vmss get-instance-view:

    az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet
    
  • Você também pode usar resources.azure.com ou SDKs do Azure específicos do idioma

A apresentação exata da saída depende das opções fornecidas ao comando. O exemplo a seguir mostra a saída de exemplo condensada da CLI do Azure:

$ az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet
{
  "statuses": [
    {
      "additionalProperties": {},
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": null,
      "time": "{time}"
    }
  ],
  "virtualMachine": {
    "additionalProperties": {},
    "statusesSummary": [
      {
        "additionalProperties": {},
        "code": "ProvisioningState/succeeded",
        "count": 1
      }
    ]
  }
}

Essas propriedades fornecem um resumo do estado de tempo de execução atual das VMs no conjunto de escala, como o status das extensões aplicadas ao conjunto de escalas.

A exibição do modelo de VM do conjunto de escala

Semelhante a como um conjunto de escala tem uma exibição de modelo, cada instância de VM no conjunto de escala tem sua própria exibição de modelo. Para consultar a exibição de modelo para uma instância de VM específica em um conjunto de escala, você pode usar:

  • API REST com compute/virtualmachinescalesetvms/get da seguinte forma:

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/virtualmachines/instanceId?api-version={apiVersion}
    
  • Azure PowerShell com Get-AzVmssVm:

    Get-AzVmssVm -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceId instanceId
    
  • CLI do Azure com az vmss show:

    az vmss show --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
    
  • Você também pode usar o resources.azure.com ou os SDKs do Azure.

A apresentação exata da saída depende das opções fornecidas ao comando. O exemplo a seguir mostra a saída de exemplo condensada da CLI do Azure:

$ az vmss show --resource-group myResourceGroup --name myScaleSet
{
  "location": "westus",
  "name": "{name}",
  "sku": {
    "name": "Standard_D2_v2",
    "tier": "Standard"
  },
}

Essas propriedades descrevem a configuração de uma instância de VM dentro de um conjunto de escala, não a configuração do conjunto de escala como um todo. Por exemplo, o modelo de conjunto de escala tem overprovision como uma propriedade, enquanto o modelo para uma instância de VM dentro de um conjunto de escala não. Essa diferença ocorre porque o superprovisionamento é uma propriedade para o conjunto de escala como um todo, não instâncias de VM individuais no conjunto de escala (para obter mais informações sobre provisionamento excessivo, consulte Considerações de design para conjuntos de escala).

A exibição da instância da VM do conjunto de escala

Semelhante a como um conjunto de escala tem uma exibição de instância, cada instância de VM no conjunto de escala tem sua própria exibição de instância. Para consultar a exibição de instância para uma instância de VM específica dentro de um conjunto de escala, você pode usar:

  • API REST com compute/virtualmachinescalesetvms/getinstanceview da seguinte forma:

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/virtualmachines/instanceId/instanceView?api-version={apiVersion}
    
  • Azure PowerShell com Get-AzVmssVm:

    Get-AzVmssVm -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceId instanceId -InstanceView
    
  • CLI do Azure com az vmss get-instance-view

    az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
    
  • Você também pode usar o resources.azure.com ou os SDKs do Azure

A apresentação exata da saída depende das opções fornecidas ao comando. O exemplo a seguir mostra a saída de exemplo condensada da CLI do Azure:

$ az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
{
  "additionalProperties": {
    "osName": "ubuntu",
    "osVersion": "16.04"
  },
  "disks": [
    {
      "name": "{name}",
      "statuses": [
        {
          "additionalProperties": {},
          "code": "ProvisioningState/succeeded",
          "displayStatus": "Provisioning succeeded",
          "time": "{time}"
        }
      ]
    }
  ],
  "statuses": [
    {
      "additionalProperties": {},
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "time": "{time}"
    },
    {
      "additionalProperties": {},
      "code": "PowerState/running",
      "displayStatus": "VM running"
    }
  ],
  "vmAgent": {
    "statuses": [
      {
        "additionalProperties": {},
        "code": "ProvisioningState/succeeded",
        "displayStatus": "Ready",
        "level": "Info",
        "message": "Guest Agent is running",
        "time": "{time}"
      }
    ],
    "vmAgentVersion": "{version}"
  },
}

Essas propriedades descrevem o estado de tempo de execução atual de uma instância de VM dentro de um conjunto de escala, que inclui quaisquer extensões aplicadas ao conjunto de escala.

Como atualizar as propriedades do conjunto de escala global

Para atualizar uma propriedade de conjunto de escala global, você deve atualizar a propriedade no modelo de conjunto de escala. Pode fazer esta atualização através de:

  • API REST com compute/virtualmachinescalesets/createorupdate da seguinte forma:

    PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet?api-version={apiVersion}
    
  • Você pode implantar um modelo do Gerenciador de Recursos com as propriedades da API REST para atualizar as propriedades do conjunto de escala global.

  • Azure PowerShell com Update-AzVmss:

    Update-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -VirtualMachineScaleSet {scaleSetConfigPowershellObject}
    
  • Azure CLI com az vmss update:

    • Para modificar uma propriedade:

      az vmss update --set {propertyPath}={value}
      
    • Para adicionar um objeto a uma propriedade de lista em um conjunto de escalas:

      az vmss update --add {propertyPath} {JSONObjectToAdd}
      
    • Para remover um objeto de uma propriedade de lista em um conjunto de escalas:

      az vmss update --remove {propertyPath} {indexToRemove}
      
    • Se você implantou anteriormente o conjunto de escala com o az vmss create comando, poderá executá-lo az vmss create novamente para atualizar o conjunto de escalas. Certifique-se de que todas as az vmss create propriedades no comando são as mesmas de antes, exceto as propriedades que você deseja modificar.

  • Você também pode usar o resources.azure.com ou os SDKs do Azure.

Depois que o modelo do conjunto de escala é atualizado, a nova configuração se aplica a todas as novas VMs criadas no conjunto de escala. No entanto, os modelos para as VMs existentes no conjunto de escala ainda devem ser atualizados com o modelo de conjunto de escala geral mais recente. No modelo para cada VM há uma propriedade booleana chamada latestModelApplied que indica se a VM está ou não atualizada com o modelo de conjunto de escala geral mais recente (true significa que a VM está atualizada com o modelo mais recente).

Imóveis com restrições de modificação

Propriedades de tempo de criação

Algumas propriedades só podem ser definidas quando você cria o conjunto de escalas. Alguns exemplos incluem o tipo de conta de armazenamento em disco do SO gerenciado e domínios de falha.

Propriedades que só podem ser alteradas com base no valor atual

Algumas propriedades podem ser alteradas, com exceções dependendo do valor atual. Estas propriedades incluem:

  • singlePlacementGroup
  • sub-rede
  • imageReferenceSku
  • imageReferenceOffer
  • Zonas de disponibilidade (Pré-visualização)

Exemplo 1

Para atualizar seu conjunto de escala para usar uma versão diferente do sistema operacional, você precisa definir todas as propriedades atualizadas em uma única chamada. Neste exemplo, estamos mudando de Unbuntu Server 20.04 para 22.04.

az vmss update \
--resource-group myResourceGroup \
--name myScaleSet \
--set virtualMachineProfile.storageProfile.imageReference.offer=0001-com-ubuntu-server-jammy \
--set virtualMachineProfile.storageProfile.imageReference.publisher=Canonical \
--set virtualMachineProfile.storageProfile.imageReference.sku=22_04-lts-gen2 \
--set virtualMachineProfile.storageProfile.imageReference.version=latest

Exemplo 2

Para atualizar seu conjunto de escala para usar uma versão diferente do sistema operacional, você precisa definir todas as propriedades atualizadas em uma única chamada. Neste exemplo, estamos mudando do Windows Server 2016 para o Windows Server 2019.

$VMSS = Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet"

Set-AzVmssStorageProfile $vmss `
    -OsDiskCreateOption "FromImage" `
    -ImageReferencePublisher "MicrosoftWindowsServer" `
    -ImageReferenceOffer "WindowsServer" `
    -ImageReferenceSku "2019-datacenter" `
    -ImageReferenceVersion "latest"

Update-AzVmss -ResourceGroupName "myResourceGroup" -Name "myScaleSet" -VirtualMachineScaleSet $VMSS

Propriedades que requerem desalocação para serem alteradas

Algumas propriedades só podem ser alteradas para determinados valores se as VMs no conjunto de escala forem deslocalizadas. Estas propriedades incluem:

  • Nome da SKU- Se a nova SKU da VM não for suportada no hardware em que o conjunto de escala está no momento, você precisará desalocar as VMs no conjunto de escala antes de modificar o nome da SKU. Para obter mais informações, consulte como redimensionar uma VM do Azure.

Atualizações específicas da VM

Certas modificações podem ser aplicadas a VMs específicas em vez das propriedades do conjunto de escala global. Atualmente, a única atualização específica de VM com suporte é anexar/desanexar discos de dados de/para VMs no conjunto de escala. Esta funcionalidade está em pré-visualização. Para obter mais informações, consulte a documentação de visualização.

Cenários

Atualizações de aplicativos

Se um aplicativo for implantado em uma escala definida por meio de extensões, uma atualização na configuração da extensão fará com que o aplicativo seja atualizado de acordo com a política de atualização. Por exemplo, se você tiver uma nova versão de um script para executar em uma extensão de script personalizada, poderá atualizar a propriedade fileUris para apontar para o novo script. Em alguns casos, você pode querer forçar uma atualização mesmo que a configuração da extensão esteja inalterada (por exemplo, você atualizou o script sem uma alteração no URI do script). Nesses casos, você pode modificar o forceUpdateTag para forçar uma atualização. A plataforma Azure não interpreta esta propriedade. Se você alterar o valor, não haverá efeito sobre como a extensão é executada. Uma alteração simplesmente força a extensão a ser executada novamente. Para obter mais informações sobre o forceUpdateTag, consulte a documentação da API REST para extensões. Observe que o forceUpdateTag pode ser usado com todas as extensões, não apenas com a extensão de script personalizado.

Também é comum que os aplicativos sejam implantados por meio de uma imagem personalizada. Esse cenário é abordado na seção a seguir.

Atualizações do SO

Se você usar imagens da plataforma Azure, poderá atualizar a imagem modificando o imageReference (mais informações, consulte a documentação da API REST).

Nota

Com imagens de plataforma, é comum especificar "mais recente" para a versão de referência da imagem. Quando você cria, dimensiona e recria imagens, as VMs são criadas com a versão mais recente disponível. No entanto, isso não significa que a imagem do sistema operacional é atualizada automaticamente ao longo do tempo à medida que novas versões de imagem são lançadas. Um recurso separado fornece atualizações automáticas do sistema operacional. Para obter mais informações, consulte a documentação Atualizações automáticas do sistema operacional.

Se você usar imagens personalizadas, poderá atualizá-la atualizando o ID imageReference (para obter mais informações, consulte a documentação da API REST).

Exemplos

Atualizar a imagem do SO para o seu conjunto de escalas

Você pode ter um conjunto de escala que executa uma versão antiga do Ubuntu LTS 16.04. Você deseja atualizar para uma versão mais recente do Ubuntu LTS 16.04, como a versão 16.04.201801090. A propriedade image reference version não faz parte de uma lista, portanto, você pode modificar diretamente essas propriedades com um dos seguintes comandos:

  • Azure PowerShell com Update-AzVmss da seguinte maneira:

    Update-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -ImageReferenceVersion 16.04.201801090
    
  • Azure CLI com az vmss update:

    az vmss update --resource-group myResourceGroup --name myScaleSet --set virtualMachineProfile.storageProfile.imageReference.version=16.04.201801090
    

Como alternativa, você pode querer alterar a imagem que seu conjunto de escala usa. Por exemplo, talvez você queira atualizar ou alterar uma imagem personalizada usada pelo seu conjunto de escalas. Você pode alterar a imagem usada pelo conjunto de escalas atualizando a propriedade ID de referência da imagem. A propriedade ID de referência de imagem não faz parte de uma lista, portanto, você pode modificar diretamente essa propriedade com um dos seguintes comandos:

  • Azure PowerShell com Update-AzVmss da seguinte maneira:

    Update-AzVmss `
        -ResourceGroupName "myResourceGroup" `
        -VMScaleSetName "myScaleSet" `
        -ImageReferenceId /subscriptions/{subscriptionID}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myNewImage
    
  • Azure CLI com az vmss update:

    az vmss update \
        --resource-group myResourceGroup \
        --name myScaleSet \
        --set virtualMachineProfile.storageProfile.imageReference.id=/subscriptions/{subscriptionID}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myNewImage
    

Atualizar o balanceador de carga para seu conjunto de escalas

Digamos que você tenha um conjunto de escala com um Balanceador de Carga do Azure e queira substituir o Balanceador de Carga do Azure por um Gateway de Aplicativo do Azure. O balanceador de carga e as propriedades do Application Gateway para um conjunto de escala fazem parte de uma lista, portanto, você pode usar os comandos para remover ou adicionar elementos de lista em vez de modificar as propriedades diretamente:

  • Azure PowerShell:

    # Get the current model of the scale set and store it in a local PowerShell object named $vmss
    $vmss=Get-AzVmss -ResourceGroupName "myResourceGroup" -Name "myScaleSet"
    
    # Create a local PowerShell object for the new desired IP configuration, which includes the reference to the application gateway
    $ipconf = New-AzVmssIPConfig -ApplicationGatewayBackendAddressPoolsId /subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/{applicationGatewayBackendAddressPoolName} -SubnetId $vmss.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0].IpConfigurations[0].Subnet.Id -Name $vmss.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0].IpConfigurations[0].Name
    
    # Replace the existing IP configuration in the local PowerShell object (which contains the references to the current Azure Load Balancer) with the new IP configuration
    $vmss.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0].IpConfigurations[0] = $ipconf
    
    # Update the model of the scale set with the new configuration in the local PowerShell object
    Update-AzVmss -ResourceGroupName "myResourceGroup" -Name "myScaleSet" -virtualMachineScaleSet $vmss
    
  • CLI do Azure:

    # Remove the load balancer backend pool from the scale set model
    az vmss update --resource-group myResourceGroup --name myScaleSet --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 myResourceGroup --name myScaleSet --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 myResourceGroup --name myScaleSet --add virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].ApplicationGatewayBackendAddressPools '{"id": "/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/{applicationGatewayBackendPoolName}"}'
    

Nota

Esses comandos pressupõem que haja apenas uma configuração IP e balanceador de carga no conjunto de escala. Se houver vários, talvez seja necessário usar um índice de lista diferente de 0.

Próximos passos

Você também pode executar tarefas de gerenciamento comuns em conjuntos de escala com a CLI do Azure ou o Azure PowerShell.