Compartilhar via


Modificar um Conjunto de Dimensionamento de Máquinas Virtuais

Observação

Muitas das etapas listadas neste documento se aplicam a Conjuntos de Dimensionamento de Máquinas Virtuais usando o modo Orquestração Uniforme. É recomendável usar a Orquestração Flexível para cargas de trabalho novas. Para saber mais, confira Modos de orquestração para conjuntos de dimensionamento de máquinas virtuais no Azure.

Em todo o ciclo de vida de seus aplicativos, talvez seja necessário modificar ou atualizar o Conjunto de Dimensionamento de Máquinas Virtuais. 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 dimensionamento com as APIs REST, o Azure PowerShell ou o CLI do Azure.

Conceitos fundamentais

O modelo do conjunto de dimensionamento

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

  • a API REST com compute/virtualmachinescalesets/get da seguinte maneira:

    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 resources.azure.com ou específicos do idioma Azure SDKs.

A apresentação exata da saída depende das opções que você fornecer para o 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 dimensionamento como um todo.

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

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

  • a API REST com compute/virtualmachinescalesets/getinstanceview da seguinte maneira:

    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 específicos do idioma Azure SDKs

A apresentação exata da saída depende das opções que você fornecer para o 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 atual de runtime das VMs no conjunto de dimensionamento, como o status das extensões aplicadas ao conjunto de dimensionamento.

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

Semelhante a como um conjunto de dimensionamento tem uma exibição de modelo, cada instância de VM no conjunto de dimensionamento tem sua própria exibição de modelo. Para consultar a exibição do modelo para uma determinada instância de máquina virtual em um conjunto de dimensionamento, você pode usar:

  • a API REST com compute/virtualmachinescalesetvms/get da seguinte maneira:

    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 resources.azure.com ou Azure SDKs.

A apresentação exata da saída depende das opções que você fornecer para o 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 escalas, não a configuração do conjunto de escalas 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 tem. Essa diferença se dá porque o provisionamento em excesso é uma propriedade para o conjunto de dimensionamento como um todo e não para instâncias de VMs individuais no conjunto de dimensionamento (para obter mais informações sobre provisionamento em excesso, consulte as considerações de Design para conjuntos de dimensionamento).

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

Semelhante a como um conjunto de dimensionamento tem uma exibição de instância, cada instância de VM no conjunto de dimensionamento tem sua própria exibição de instância. Para consultar a visualização da instância de uma determinada instância da VM em um conjunto de escalas, você pode usar:

  • a API REST com compute/virtualmachinescalesetvms/getinstanceview da seguinte maneira:

    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 resources.azure.com ou Azure SDKs

A apresentação exata da saída depende das opções que você fornecer para o 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 runtime atual de uma instância de VM dentro de um conjunto de escala, que inclui todas as extensões aplicadas ao conjunto de escala.

Como atualizar propriedades globais do conjunto de dimensionamento

Para atualizar uma propriedade global do conjunto de dimensionamento, você deve atualizar a propriedade no modelo do conjunto de dimensionamento. Você pode fazer essa atualização por meio de:

  • a API REST com compute/virtualmachinescalesets/createorupdate da seguinte maneira:

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

  • Azure PowerShell com Update-AzVmss:

    Update-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -VirtualMachineScaleSet {scaleSetConfigPowershellObject}
    
  • CLI do Azure 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 dimensionamento:

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

      az vmss update --remove {propertyPath} {indexToRemove}
      
    • Se você tiver implantado anteriormente o conjunto de dimensionamento com o comando az vmss create, você pode executar o comando az vmss create novamente para atualizar o conjunto de dimensionamento. Certifique-se de que todas as propriedades do comando az vmss create sejam as mesmas de antes, exceto as propriedades que você quer modificar.

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

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

Propriedades com restrições de modificação

Propriedades do momento da criação

Algumas propriedades só podem ser definidas ao criar o conjunto de dimensionamento. Alguns exemplos incluem o tipo de conta de armazenamento em disco do sistema operacional 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. Essas propriedades incluem:

  • singlePlacementGroup
  • subnet
  • imageReferenceSku
  • imageReferenceOffer
  • Zonas de Disponibilidade (versão prévia)

Exemplo 1

Para atualizar o conjunto de dimensionamento para usar uma versão diferente do sistema operacional, é necessário definir todas as propriedades atualizadas em uma única chamada. Neste exemplo, estamos mudando do 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 o conjunto de dimensionamento para usar uma versão diferente do sistema operacional, é necessário definir todas as propriedades atualizadas em uma única chamada. Neste exemplo, migraremos 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 exigem desalocação para serem alteradas

Algumas propriedades só podem ser alteradas para determinados valores se as VMs no conjunto de dimensionamento forem desalocadas. Essas propriedades incluem:

  • Nome do SKU – se não houver suporte para o novo SKU da VM no hardware em que o conjunto de dimensionamento está no momento, será necessário desalocar as VMs no conjunto de dimensionamento antes de modificar o nome do SKU. Para saber mais, confira Como monitorar uma Azure VM.

Atualizações específicas da VM

Algumas modificações podem ser aplicadas a VMs específicas em vez das propriedades globais do conjunto de dimensionamento. Atualmente, a única atualização específica de VM compatível é anexação/desanexação de discos de dados para/de VMs no pacote de atualização. Esse recurso está em visualização. Para saber mais, confira a documentação de versão prévia.

Cenários

Atualizações de aplicativos

Se um aplicativo for implantado em uma conjunto de dimensionamento por meio de extensões, uma atualização da configuração da extensão fará com que o aplicativo atualize de acordo com a política de atualização. Por exemplo, se você tiver uma nova versão de um script para ser executado em uma extensão de script personalizada, você pode atualizar a propriedade fileUris para apontar para o novo script. Em alguns casos, talvez você queira forçar uma atualização mesmo que a configuração da extensão permaneça inalterada (por exemplo, você atualizou o script sem alterar o URI do script). Nesses casos, você pode modificar o forceUpdateTag para forçar uma atualização. A plataforma Windows Azure não interpreta essa propriedade. Se você alterar o valor, não há nenhum efeito sobre como a extensão é executada. Uma mudança simplesmente força a extensão para ser executada novamente. Para obter mais informações sobre o forceUpdateTag, consulte a documentação da API REST para extensões. Observe que forceUpdateTag pode ser usado com todas as extensões, não apenas com a extensão de script personalizada.

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

Atualizações de SO

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

Observação

Com imagens de plataforma, é comum especificar "mais recente" para a versão de referência de imagem. Ao criar, dimensionar e recriar a imagem, as VMs são criadas com a versão disponível mais recente. No entanto, isso não significa que a imagem do SO será atualizada automaticamente ao longo do tempo com o lançamento de novas versões da imagem. Um recurso separado fornece atualizações automáticas do SO. Para obter mais informações, confira a Documentação de Atualização Automática do SO.

Se você usar imagens personalizadas, poderá atualizar a imagem atualizando a ID do imageReference (mais informações na documentação da API REST).

Exemplos

Atualizar a imagem do SO para seu conjunto de dimensionamento

Você pode ter um conjunto de dimensionamento executando 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 da versão de referência da imagem não é parte de uma lista, logo você pode modificar diretamente essas propriedades com um desses seguintes comandos:

  • Azure PowerShell com Update-AzVmss como a seguir:

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

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

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

  • Azure PowerShell com Update-AzVmss como a seguir:

    Update-AzVmss `
        -ResourceGroupName "myResourceGroup" `
        -VMScaleSetName "myScaleSet" `
        -ImageReferenceId /subscriptions/{subscriptionID}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myNewImage
    
  • CLI do Azure 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 o conjunto de dimensionamento

Digamos que você tenha um conjunto de dimensionamento com um Azure Load Balancer e você queira substituir o Azure Load Balancer por um Gateway de Aplicativo do Azure. As propriedades do balanceador de carga e do gateway do aplicativo referentes a um conjunto de dimensionamento são parte de uma lista, logo você pode usar os comandos para remover e adicionar elementos da 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}"}'
    

Observação

Esses comandos pressupõem que há apenas um balanceador de carga e uma configuração de IP no conjunto de dimensionamento. Se houver vários, você precisará usar um índice de lista diferente de 0.

Próximas etapas

Também é possível executar tarefas comuns de gerenciamento em conjuntos de dimensionamento com a CLI do Azure ou Azure PowerShell.