Modificación de un conjunto de escalado de máquinas virtuales

Nota:

Muchos de los pasos enumerados en este documento se aplican a conjuntos de escalado de máquinas virtuales mediante el modo de orquestación uniforme. Se recomienda usar la orquestación flexible para las cargas de trabajo nuevas. Para obtener más información, consulte Modos de orquestación para los conjuntos de escalado de máquinas virtuales de Azure.

A lo largo del ciclo de vida de las aplicaciones, puede que tenga la necesidad de modificar o actualizar el conjunto de escalado de máquinas virtuales. Estas actualizaciones pueden incluir cómo actualizar la configuración del conjunto de escalado o cambiar la configuración de la aplicación. En este artículo se describe cómo modificar un conjunto de escalado existente con las API REST, Azure PowerShell o la CLI de Azure.

Conceptos básicos

El modelo del conjunto de escalado

Un conjunto de escalado tiene un "modelo de conjunto de escalado" que captura el estado deseado del conjunto de escalado como un todo. Para consultar el modelo de un conjunto de escalado, puede usar:

  • API REST con compute/virtualmachinescalesets/get como se indica a continuación:

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

    Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet"
    
  • CLI de Azure con az vmss show:

    az vmss show --resource-group myResourceGroup --name myScaleSet
    
  • También puede usar resources.azure.com o los SDK de Azure específicos del lenguaje.

La presentación exacta de la salida depende de las opciones proporcionadas al comando. En el ejemplo siguiente se muestra una salida de ejemplo condensada de la CLI de 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"
  },
}

Estas propiedades se aplican al conjunto de escalado como un todo.

La vista de la instancia del conjunto de escalado

Un conjunto de escalado tiene también una "vista de instancia del conjunto de escalado" que captura el estado de tiempo de ejecución actual del conjunto de escalado como un todo. Para consultar la vista de instancia de un conjunto de escalado, puede usar:

  • API REST con compute/virtualmachinescalesets/getinstanceview de la manera siguiente:

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

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

    az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet
    
  • También puede usar resources.azure.com o los SDK de Azure específicos del lenguaje.

La presentación exacta de la salida depende de las opciones proporcionadas al comando. En el ejemplo siguiente se muestra una salida de ejemplo condensada de la CLI de 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
      }
    ]
  }
}

Estas propiedades proporcionan un resumen del estado de tiempo de ejecución actual de las máquinas virtuales del conjunto de escalado, incluido el estado de las extensiones que aplicadas al conjunto de escalado.

La vista del modelo de máquina virtual del conjunto de escalado

Al igual que un conjunto de escalado tiene una vista de modelo, cada instancia de máquina virtual de este tiene su propia vista de modelo. Para consultar la vista de modelo de una instancia de máquina virtual de un conjunto de escalado puede usar:

  • API REST con compute/virtualmachinescalesetvms/get de la manera siguiente:

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

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

    az vmss show --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
    
  • También puede usar resources.azure.com o los SDK de Azure.

La presentación exacta de la salida depende de las opciones proporcionadas al comando. En el ejemplo siguiente se muestra una salida de ejemplo condensada de la CLI de Azure:

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

Estas propiedades describen la configuración de una instancia de máquina virtual en un conjunto de escalado, no la del conjunto de escalado como un todo. Por ejemplo, el modelo de conjunto de escalado tiene la propiedad overprovision, mientras que el modelo de una instancia de máquina virtual de un conjunto de escalado no. Esta diferencia se debe a que el exceso de aprovisionamiento es una propiedad del conjunto de escalado como un todo, y no de las instancias de máquinas virtuales individuales del conjunto de escalado. Para más información sobre el aprovisionamiento en exceso, consulte Consideraciones de diseño para conjuntos de escalado.

La vista de la instancia de máquina virtual del conjunto de escalado

Al igual que un conjunto de escalado tiene una vista de instancia, cada instancia de máquina virtual de este tiene su propia vista de instancia. Para consultar la vista de instancia de una instancia de máquina virtual concreta de un conjunto de escalado puede usar:

  • API REST con compute/virtualmachinescalesetvms/getinstanceview de la manera siguiente:

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

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

    az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
    
  • También puede usar resources.azure.com o los SDK de Azure.

La presentación exacta de la salida depende de las opciones proporcionadas al comando. En el ejemplo siguiente se muestra una salida de ejemplo condensada de la CLI de 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}"
  },
}

Estas propiedades describen el estado actual del entorno de tiempo de ejecución de una instancia de máquina virtual en un conjunto de escalado, que incluye cualquier extensión que se aplica al conjunto de escalado.

Actualización de las propiedades globales del conjunto de escalado

Para actualizar una propiedad global del conjunto de escalado, debe actualizar la propiedad en el modelo de conjunto de escalado. Puede usar para ello:

  • API REST con compute/virtualmachinescalesets/createorupdate de la manera siguiente:

    PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet?api-version={apiVersion}
    
  • Puede implementar una plantilla de Resource Manager con las propiedades de la API REST para actualizar las propiedades globales del conjunto de escalado.

  • Azure PowerShell con Update-AzVmss:

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

    • Para modificar una propiedad:

      az vmss update --set {propertyPath}={value}
      
    • Para añadir un objeto a una propiedad de la lista de un conjunto de escalado:

      az vmss update --add {propertyPath} {JSONObjectToAdd}
      
    • Para quitar un objeto de una propiedad de la lista de un conjunto de escalado:

      az vmss update --remove {propertyPath} {indexToRemove}
      
    • Si ha implementado previamente el conjunto de escalado con el az vmss createcomando, puede ejecutarlo de nuevo az vmss createpara actualizar el conjunto de escalado. Asegúrese de que todas las propiedades del comando az vmss create son las mismas que antes, excepto las propiedades que desea modificar.

  • También puede usar resources.azure.com o los SDK de Azure.

Una vez que se actualiza el modelo de conjunto de escalado, la nueva configuración se aplica a las nuevas máquinas virtuales creadas en el conjunto de escalado. Sin embargo, los modelos de las máquinas virtuales existentes del conjunto de escalado se deben seguir actualizando con el modelo de conjunto de escalado general más reciente. En el modelo de cada máquina virtual hay una propiedad booleana llamada latestModelApplied que indica si la máquina virtual está o no actualizada con el modelo de conjunto de escalado general más reciente (true significa que sí lo está).

Propiedades con restricciones en la modificación

Propiedades de tiempo de creación

Algunas propiedades solo pueden establecerse al crear el conjunto de escalado. Algunos ejemplos incluyen el tipo de cuenta de almacenamiento en disco del sistema operativo administrado y los dominios de error.

Propiedades que solo se pueden cambiar en función del valor actual

Algunas propiedades pueden cambiarse, con excepciones dependiendo del valor actual. Estas propiedades incluyen:

  • singlePlacementGroup
  • subnet
  • imageReferenceSku
  • imageReferenceOffer
  • zones

Ejemplo 1

Para actualizar el conjunto de escalado para que use otra versión del sistema operativo, debe establecer todas las propiedades actualizadas en una sola llamada. En este ejemplo, estamos cambiando de Unbuntu Server 20.04 a 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

Ejemplo 2

Para actualizar el conjunto de escalado para que use otra versión del sistema operativo, debe establecer todas las propiedades actualizadas en una sola llamada. En este ejemplo, estamos cambiando de Windows Server 2016 a 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

Propiedades que requieren desasignación para poder cambiar

Algunas propiedades solo pueden cambiar a ciertos valores si se desasignan las máquinas virtuales del conjunto de escalado. Estas propiedades incluyen:

  • Nombre de SKU: si el nombre de la nueva SKU de máquina virtual no se admite en el hardware en el que se encuentra actualmente el conjunto de escalado, debe desasignar las máquinas virtuales del conjunto de escalado antes de modificar el nombre de la SKU. Para más información, consulte cómo cambiar el tamaño de una máquina virtual de Azure.

Actualizaciones específicas de la máquina virtual

Algunas modificaciones pueden aplicarse a máquinas virtuales específicas, y no a las propiedades globales del conjunto de escalado. Actualmente, la única actualización específica de la máquina virtual que se admite es asociar/desasociar discos de datos en las máquinas virtuales del conjunto de escalado. Esta característica se encuentra en versión preliminar.

Escenarios

Actualizaciones de aplicaciones

Si una aplicación se implementa en un conjunto de escalado mediante extensiones, al actualizar la configuración de extensiones la aplicación se actualiza en consonancia con la directiva de actualización. Por ejemplo, si tiene una nueva versión de un script que se va a ejecutar en una extensión de script personalizado, podría actualizar la propiedad fileUris para que apunte al nuevo script. En algunos casos, puede que desee forzar una actualización aunque no se haya modificado la configuración de extensiones (por ejemplo, ha actualizado el script sin cambiar su URI). En estos casos, puede modificar la propiedad forceUpdateTag para forzar una actualización. La plataforma Azure no interpreta esta propiedad. Si cambia el valor, no hay ningún efecto sobre cómo se ejecuta la extensión. Solo fuerza a que la extensión se vuelva a ejecutar. Para más información sobre forceUpdateTag, consulte la documentación de API REST de las extensiones. Tenga en cuenta que forceUpdateTag se puede utilizar con todas las extensiones, no solo con la extensión de script personalizado.

También es habitual que las aplicaciones se implementen mediante una imagen personalizada. Este escenario se explica en la siguiente sección.

Actualizaciones de SO

Si usa imágenes de plataforma de Azure, puede actualizar la imagen mediante la modificación de la propiedad imageReference (para más información, consulte la documentación de API REST).

Nota

Con imágenes de plataforma, es habitual especificar la versión más reciente de la referencia de imagen. Al realizar procedimientos de creación, escalado horizontal y restablecimiento de imagen inicial, las máquinas virtuales se crean con la última versión disponible. Sin embargo, no significa que la imagen del sistema operativo se actualice automáticamente con el tiempo a medida que se lanzan nuevas versiones de imágenes. Una característica independiente proporciona actualizaciones automáticas del sistema operativo. Para más información, consulte la documentación de actualizaciones automáticas del sistema operativo.

Si usa imágenes personalizadas, puede actualizar la imagen mediante la actualización del identificador de imageReference (para más información, consulte la documentación de API REST).

Ejemplos

Actualización de la imagen del sistema operativo en el conjunto de escalado

Puede que tenga un conjunto de escalado que ejecuta una versión anterior de Ubuntu LTS 16.04 y quiere actualizar a una versión más reciente de Ubuntu LTS 16.04, como 16.04.201801090. La propiedad de versión de referencia de imagen no es parte de una lista, por lo que puede modificar directamente estas propiedades con uno de los siguientes comandos:

  • Azure PowerShell con Update-AzVmss, como sigue:

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

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

Como alternativa, puede cambiar la imagen que se usa el conjunto de escalado. Por ejemplo, es posible que desee actualizar o cambiar una imagen personalizada usada por el conjunto de escalado. Puede cambiar la imagen que usa el conjunto de escalado mediante la actualización de la propiedad de identificador de la referencia de imagen. La propiedad de identificador de referencia de imagen no es parte de una lista, por lo que puede modificarla directamente con uno de los siguientes comandos:

  • Azure PowerShell con Update-AzVmss, como sigue:

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

Actualización del equilibrador de carga en el conjunto de escalado

Supongamos que tiene un conjunto de escalado con una instancia de Azure Load Balancer y quiere reemplazar Azure Load Balancer por una instancia de Azure Application Gateway. Las propiedades de Load Balancer y Application Gateway de un conjunto de escalado son parte de una lista, así que puede usar los comandos para quitar o agregar elementos de la lista en lugar de modificar las propiedades directamente:

  • 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 de 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

Estos comandos dan por hecho que solo hay una configuración IP y un equilibrador de carga en el conjunto de escalado. Si hay varios, debe usar un índice de lista distinto de 0.

Pasos siguientes

También puede realizar tareas de administración comunes en conjuntos de escalado con la CLI de Azure o Azure PowerShell.