Поделиться через


Изменение масштабируемого набора виртуальных машин

Примечание.

Многие шаги, перечисленные в этом документе, применяются к масштабируемым наборам виртуальных машин с режимом унифицированной оркестрации. Мы рекомендуем использовать гибкую оркестрацию для новых рабочих нагрузок. Дополнительные сведения см. в режиме Оркестрации для масштабируемых наборов виртуальных машин в Azure.

На протяжении всего жизненного цикла приложений может потребоваться изменить или обновить масштабируемый набор виртуальных машин. Эти обновления могут включать в себя процедуры по обновлению конфигурации масштабируемого набора, или изменению конфигурации приложения. В этой статье описывается, как можно изменить существующий масштабируемый набор с помощью интерфейсов REST API, Azure PowerShell или Azure CLI.

Базовые понятия

Модель масштабируемого набора

Масштабируемый набор содержит модель, которая фиксирует требуемое состояние набора в целом. Для выполнения запроса к модели в наборе масштабирования можно использовать:

  • REST API с compute/virtualmachinescalesets/get, как показано ниже.

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

    Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet"
    
  • Команда az vmss show в Azure CLI.

    az vmss show --resource-group myResourceGroup --name myScaleSet
    
  • Можно также использовать resources.azure.com или пакеты SDK Azure для конкретного языка.

Точное представление выходных данных зависит от параметров, введенных в команде. Ниже показан сокращенный пример выходных данных Azure CLI.

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"
  },
}

Эти свойства применяются к масштабируемому набору в целом.

Представление экземпляра масштабируемого набора

Масштабируемый набор также имеет представление экземпляра масштабируемого набора, которое фиксирует текущее состояние среды выполнения как единое целое. Для запроса представления экземпляра масштабируемого набора можно использовать следующие средства.

  • REST API, использующий compute/virtualmachinescalesets/getinstanceview, как показано ниже.

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/instanceView?api-version={apiVersion}
    
  • Командлет Get-AzVmss в Azure PowerShell:

    Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceView
    
  • В Azure CLI можно использовать az vmss get-instance-view.

    az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet
    
  • Можно также использовать resources.azure.com или пакеты SDK Azure для конкретного языка.

Точное представление выходных данных зависит от параметров, введенных в команде. Ниже показан сокращенный пример выходных данных Azure CLI.

$ 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
      }
    ]
  }
}

Эти свойства предоставляют сводку текущего состояния среды выполнения виртуальных машин в масштабируемом наборе, включая состояние расширений, применяемых к набору.

Представление модели виртуальной машины масштабируемого набора

Как у масштабируемого набора есть представление модели, так и каждый экземпляр виртуальной машины в наборе имеет собственное представление модели. Для запроса представления модели экземпляра определенной виртуальной машины в масштабируемом наборе можно использовать следующие средства.

  • REST API с compute/virtualmachinescalesetvms/get, как показано ниже.

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/virtualmachines/instanceId?api-version={apiVersion}
    
  • В Azure PowerShell используется командлет Get-AzVmssVm:

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

    az vmss show --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
    
  • Можно также использовать resources.azure.com или Azure SDK.

Точное представление выходных данных зависит от параметров, введенных в команде. Ниже показан сокращенный пример выходных данных Azure CLI.

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

Эти свойства описывают конфигурацию экземпляра виртуальной машины в масштабируемом наборе, а не конфигурацию масштабируемого набора в целом. Например, модель масштабируемого набора имеет свойство overprovision, которого нет у модели экземпляра виртуальной машины в масштабируемом наборе. Это отличие вызвано тем, что переподготовка является свойством набора масштабирования в целом, а не отдельных экземпляров виртуальных машин в наборе. Дополнительные сведения о переподготовке см. в разделе Проектные соображения для наборов масштабирования.

Представление экземпляра виртуальной машины в масштабируемом наборе

Как масштабируемый набор имеет представление экземпляра, так и каждый экземпляр виртуальной машины в этом наборе имеет свое собственное представление экземпляра. Для запроса представления определенного экземпляра виртуальной машины в масштабируемом наборе можно использовать следующие средства.

  • REST API с compute/virtualmachinescalesetvms/getinstanceview, как показано ниже.

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/virtualmachines/instanceId/instanceView?api-version={apiVersion}
    
  • Командлет Get-AzVmssVm в Azure PowerShell:

    Get-AzVmssVm -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceId instanceId -InstanceView
    
  • Можно использовать команду az vmss get-instance-view в Azure CLI.

    az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
    
  • Можно также использовать resources.azure.com или пакеты SDK Azure.

Точное представление выходных данных зависит от параметров, введенных в команде. Ниже показан сокращенный пример выходных данных Azure CLI.

$ 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}"
  },
}

Эти свойства описывают текущее состояние среды выполнения экземпляра виртуальной машины в масштабируемом наборе, включая любые расширения, применяемые к масштабируемому набору.

Как обновить свойства глобального набора масштабов

Для обновления глобального свойства масштабируемого набора необходимо обновить свойство в модели набора. Вы можете выполнить это обновление через:

  • Можно использовать REST API с compute/virtualmachinescalesets/createorupdate, как показано ниже.

    PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet?api-version={apiVersion}
    
  • Вы можете развернуть шаблон Resource Manager с помощью свойств REST API, чтобы обновить глобальные свойства масштабируемого набора.

  • Командлет Update-AzVmss в Azure PowerShell:

    Update-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -VirtualMachineScaleSet {scaleSetConfigPowershellObject}
    
  • Можно использовать команду az vmss update в Azure CLI.

    • Чтобы изменить свойство, выполните следующую команду.

      az vmss update --set {propertyPath}={value}
      
    • Чтобы добавить объект в свойство списка масштабируемого набора, выполните следующую команду.

      az vmss update --add {propertyPath} {JSONObjectToAdd}
      
    • Чтобы удалить объект из свойства списка в масштабируемом наборе, выполните следующую команду.

      az vmss update --remove {propertyPath} {indexToRemove}
      
    • Если вы ранее развернули масштабируемый набор с помощью команды az vmss create, вы можете снова выполнить команду az vmss create, чтобы обновить этот набор. Убедитесь, что все свойства в команде az vmss create остаются такими же, как и раньше, за исключением тех, которые вы хотите изменить.

  • Можно также использовать resources.azure.com или Azure SDK.

После обновления модели масштабируемого набора новая конфигурация применяется ко всем новым виртуальным машинам, созданным в наборе. Тем не менее модели для существующих виртуальных машин в наборе масштабов все равно должны быть обновлены в соответствии с последней общей моделью набора масштабов. В модели для каждой виртуальной машины есть логическое свойство, называемое latestModelApplied, которое указывает, обновлена ли виртуальная машина в соответствии с последней версией общей модели набора масштабирования (true означает, что виртуальная машина обновлена до последней версии модели).

Свойства с ограничениями на изменение

Свойства времени создания объекта

Некоторые свойства можно задать только при создании масштабируемого набора. Некоторые примеры включают тип учетной записи хранения управляемого диска ОС и домены сбоя.

Свойства, которые можно изменить только на основе текущего значения

Некоторые свойства можно изменить, но есть исключения, зависящие от текущего значения. Эти свойства включают в себя:

  • единаяГруппаРазмещения
  • подсеть
  • imageReferenceSku
  • imageReferenceOffererOffer
  • зоны

Пример 1

Чтобы обновить набор масштабов для использования другой версии ОС, необходимо задать все обновлённые свойства за один вызов. В этом примере мы переходим с Unbuntu Server 20.04 на 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

Пример 2

Чтобы обновить масштабируемый набор для использования другой версии ОС, необходимо установить все обновлённые свойства в одном вызове. В этом примере мы переходим с Windows Server 2016 на 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

Свойства, для изменения которых требуется освободить виртуальные машины

Для некоторых свойств можно задать определенные значения, только если виртуальные машины в масштабируемом наборе освобождены. Эти свойства включают в себя:

  • SKU name. Если SKU новой виртуальной машины не поддерживается на оборудовании используемого масштабируемого набора, необходимо освободить виртуальные машины в масштабируемом наборе и изменить имя SKU. Дополнительные сведения см. в статье как изменить размер виртуальной машины Azure.

Сценарии

Обновления приложений

Если приложение развертывается в масштабируемом наборе с помощью расширений, то при обновлении конфигурации расширения приложение будет обновлено в соответствии с политикой обновления. Например, если у вас есть новая версия сценария для запуска в расширении пользовательских сценариев, вы можете обновить свойство fileUris, чтобы указать новый сценарий. В некоторых случаях вы можете принудительно выполнить обновление, даже если конфигурация расширения не изменилась (например, вы обновили сценарий без изменения его универсального кода ресурса (URI)). В таких случаях можно изменить forceUpdateTag для принудительного обновления. Это свойство не интерпретируется платформой Azure. Если изменить значение, это не повлияет на работу расширения. Изменение просто приведет к повторному запуску расширения. Для получения дополнительной информации о forceUpdateTag см. документацию REST API для расширений. Обратите внимание, что forceUpdateTag может использоваться с любым расширением, а не только с пользовательским скриптом.

Приложения также часто развертывают с помощью пользовательского образа. Этот сценарий описан в следующем разделе.

обновления ОС;

При использовании образов платформы Azure их можно обновить, изменив imageReference (дополнительные сведения см. в документации по REST API).

Примечание.

Для образов платформы обычно указывается последняя версия в качестве эталонной версии образа. При создании, масштабировании и пересоздании виртуальные машины создаются с использованием последней доступной версии. Тем не менее это не означает, что образ ОС будет автоматически обновляться по мере выпуска новых версий. За автоматическое обновление ОС отвечает отдельная функция. Дополнительные сведения см. в документации по автоматическому обновлению ОС.

При использовании настроенных образов, вы можете обновить образ, обновив идентификатор imageReference (подробности см. в документации по REST API).

Примеры

Обновление образа ОС масштабируемого набора

Предположим, что у вас есть масштабируемый набор, который работает под управлением старой версии Ubuntu LTS 16.04. Его нужно обновить до более новой версии Ubuntu LTS 16.04 (например, 16.04.201801090). Свойство эталонной версии образа не входит в список, поэтому можно непосредственно изменить эти свойства с помощью одной из следующих команд.

  • Azure PowerShell с Update-AzVmss, как показано ниже.

    Update-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -ImageReferenceVersion 16.04.201801090
    
  • В Azure CLI используется команда az vmss update.

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

Также может потребоваться изменить образ, используемый масштабируемым набором. Например, может потребоваться обновить или изменить пользовательский образ, используемый масштабируемым набором. Чтобы изменить образ, используемый масштабируемым набором, измените свойство идентификатора эталонного изображения. Свойство идентификатора эталонного образа не входит в список, поэтому можно непосредственно изменить это свойство с помощью одной из следующих команд.

  • Azure PowerShell с Update-AzVmss следующим образом:

    Update-AzVmss `
        -ResourceGroupName "myResourceGroup" `
        -VMScaleSetName "myScaleSet" `
        -ImageReferenceId /subscriptions/{subscriptionID}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myNewImage
    
  • Azure CLI и команда 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
    

Обновить балансировщик нагрузки для вашего набора масштабирования

Предположим, у вас есть набор масштабов с Azure Load Balancer, и вы хотите заменить Azure Load Balancer на Azure Application Gateway. Свойства подсистемы балансировки нагрузки и шлюза приложений для масштабируемого набора являются частью списка, поэтому вы можете использовать команды для удаления и добавления элементов списка вместо прямого изменения свойств.

  • 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
    
  • Azure CLI:

    # 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}"}'
    

Примечание.

Эти команды предполагают наличие только одной конфигурации IP и балансировщика нагрузки в масштабируемом наборе. Если их несколько, может потребоваться использовать индекс списка, отличный от 0.

Следующие шаги

Вы также можете выполнять общие задачи управления масштабируемыми наборами с помощью Azure CLI или Azure PowerShell.