Уведомление о завершении для экземпляров масштабируемого набора виртуальных машин Azure

Экземпляры масштабируемого набора могут подписаться на уведомления о завершении работы экземпляра и задать предопределенное время ожидания для операции завершения. Уведомление о завершении работы отправляется через службу метаданных Azure — Запланированные события, которая предоставляет уведомления о задержке важных операций, таких как перезагрузка. Решение добавляет еще одно событие (Завершение) в список "Запланированные события", а связанная задержка события завершения будет зависеть от предельной задержки, заданной пользователем в конфигурации модели масштабируемого набора.

После регистрации в запланированных событиях путем вызова соответствующей конечной точки службы метаданных экземпляры масштабируемого набора не должны ожидать истечения указанного времени ожидания до удаления экземпляра. После получения уведомления о завершении экземпляр можно будет удалить в любое время до истечения времени ожидания завершения. Уведомления о завершении не могут быть включены в экземплярах spot. Дополнительные сведения об экземплярах Spot см. в Виртуальные машины Azure Spot для Масштабируемые наборы виртуальных машин

Включение уведомлений о завершении работы

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

Портал Azure

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

  1. Перейдите к Масштабируемые наборы виртуальных машин.
  2. Нажмите кнопку + Добавить, чтобы создать новый масштабируемый набор.
  3. Перейдите на вкладку Управление.
  4. Откройте раздел Завершение работы экземпляра.
  5. Для параметра Уведомление о завершении работы экземпляравыберите Вкл.
  6. Для параметра Задержка завершения (в минутах) задайте требуемое время ожидания по умолчанию.
  7. После создания нового масштабируемого набора нажмите кнопку "Проверить и создать ".

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

  1. Перейдите в нужный масштабируемый набор
  2. Перейдите на вкладку "Конфигурация"
  3. Чтобы включить уведомление о завершении экземпляра, нажмите кнопку "Вкл.".
  4. Для параметра Задержка завершения (в минутах) задайте требуемое время ожидания по умолчанию.
  5. Нажмите кнопку "Сохранить ".

REST API

В следующем примере показано включение уведомлений о завершении работы в модели масштабируемого набора.

PUT on `/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachineScaleSets/{vmScaleSetName}?api-version=2019-03-01`
{
  "properties": {
    "virtualMachineProfile": {
            "scheduledEventsProfile": {
                "terminateNotificationProfile": {
                    "notBeforeTimeout":"PT5M",
                    "enable":true
                }
            }
        }
    }        
}

В блоке выше указана задержка в 5 минут (как указано PT5M) для любой операции завершения работы всех экземпляров в масштабируемом наборе. Поле notBeforeTimeout может принимать любое значение в диапазоне от 5 до 15 минут в формате ISO 8601. Можно изменить время ожидания по умолчанию для операции завершения, изменив свойство notBeforeTimeout в разделе terminateNotificationProfile, как описано выше.

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

Примечание.

Уведомления о завершении работы в экземплярах масштабируемых наборов можно включить только с помощью API версии 2019-03-01 и выше.

Azure PowerShell

При создании нового масштабируемого набора можно включить уведомления о завершении работы в масштабируемом наборе с помощью командлета New-AzVmssConfig.

В этом примере скрипта описывается создание масштабируемого набора и связанных ресурсов с помощью файла конфигурации: создание полного масштабируемого набора виртуальных машин. Вы можете предоставить уведомления "завершить работу", добавив параметры TerminateScheduledEvents и TerminateScheduledEventNotBeforeTimeoutInMinutes в объект конфигурации для создания масштабируемого набора. В следующем примере функция включается с заданным временем ожидания задержки в 10 минут.

Внимание

Начиная с ноября 2023 года масштабируемые наборы виртуальных машин, созданные с помощью PowerShell и Azure CLI, по умолчанию будут использоваться в режиме гибкой оркестрации, если режим оркестрации не указан. Дополнительные сведения об этом изменении и о действиях, которые необходимо предпринять, см. в руководстве по критическим изменениям для клиентов VmSS PowerShell/CLI — Microsoft Community Hub

New-AzVmssConfig `
  -Location "VMSSLocation" `
  -SkuCapacity 2 `
  -OrchestrationMode "Flexible" `
  -SkuName "Standard_DS2" `
  -TerminateScheduledEvents $true `
  -TerminateScheduledEventNotBeforeTimeoutInMinutes 10

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

Update-AzVmss `
  -ResourceGroupName "myResourceGroup" `
  -VMScaleSetName "myScaleSet" `
  -TerminateScheduledEvents $true `
  -TerminateScheduledEventNotBeforeTimeoutInMinutes 15

Приведенный выше пример включает уведомления о завершении работы для существующего масштабируемого набора и устанавливает время ожидания равным 15 минутам для события "Завершение".

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

Azure CLI 2.0

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

az group create --name <myResourceGroup> --location <VMSSLocation>
az vmss create \
  --resource-group <myResourceGroup> \
  --name <myVMScaleSet> \
  --image Ubuntu2204 \
  --admin-username <azureuser> \
  --generate-ssh-keys \
  --terminate-notification-time 10

В приведенном выше примере сначала создается группа ресурсов, а затем новый масштабируемый набор с уведомлениями о завершении работы, по умолчанию включенными с временем ожидания 10 минут.

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

az vmss update \  
  --resource-group <myResourceGroup> \
  --name <myVMScaleSet> \
  --enable-terminate-notification true \
  --terminate-notification-time 10

Получение уведомлений о завершении работы

Уведомления о завершении работы доставляются посредством службы Запланированные события, которая представляет собой службу метаданных Azure. Служба метаданных Azure предоставляет сведения о работающих виртуальных машинах через конечную точку REST, доступную из виртуальной машины. Эта информация предоставляется через немаршрутизируемый IP-адрес, то есть она недоступна вне виртуальной машины.

Служба "Запланированные события" включается для вашего масштабируемого набора, когда вы впервые запрашиваете события. При первом вызове возможна задержка ответа до двух минут. Периодически выполняйте запрос к конечной точке для обнаружения будущих событий обслуживания и статуса текущих действий по обслуживанию.

Запланированные события отключены для масштабируемого набора, если экземпляры масштабируемых наборов не отправляют запрос в течение 24 часов.

Обнаружение конечной точки

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

Полная конечная точка для последней версии службы "Запланированные события" выглядит так:

'http://169.254.169.254/metadata/scheduledevents?api-version=2019-01-01'

Ответ на запрос

Ответ содержит массив запланированных событий. Если это будет пустой массив, значит сейчас запланированных событий нет.

Если передаются запланированные события, массив событий в ответе выглядит так: Для события "Завершение" ответ имеет следующий вид.

{
    "DocumentIncarnation": {IncarnationID},
    "Events": [
        {
            "EventId": {eventID},
            "EventType": "Terminate",
            "ResourceType": "VirtualMachine",
            "Resources": [{resourceName}],
            "EventStatus": "Scheduled",
            "NotBefore": {timeInUTC},
        }
    ]
}

DocumentIncarnation — это тег сущности, который позволяет легко проверить, изменились ли полезные данные события с момента предыдущего запроса.

Дополнительные сведения о каждом из полей см. в документации по службе "Запланированные события" для Windows и Linux.

Реагирование на события

После того как вы узнали о предстоящем событии и завершили логику для корректного завершения работы, вы можете утвердить выдающееся событие, выполнив вызов POST к службе метаданных с помощью EventId. Вызов POST сообщает Azure о возможности продолжить удаление виртуальной машины.

Ниже приведен ожидаемый код json в тексте запроса POST. Запрос должен содержать список запросов StartRequest. Каждый запрос StartRequest содержит EventId для события, которое требуется передать:

{
	"StartRequests" : [
		{
			"EventId": {EventId}
		}
	]
}

Убедитесь, что каждая из виртуальных машин в масштабируемом наборе утверждает только EventID, относящиеся только к этой виртуальной машине. Виртуальная машина может получить собственное имя виртуальной машины посредством метаданных экземпляра. Это имя имеет вид "{scale-set-name}_{instance-id}" и отображается в разделе "Ресурсы" ответа на запрос, описанный выше.

Вы также можете ознакомиться с примерами скриптов для отправки запросов и реагирования на события Python.

Советы и рекомендации

  • Прерывать уведомления только для операций удаления — все операции удаления (удаление вручную или автоматическое горизонтальное масштабирование, инициированное операцией автомасштабирования) создает события завершения, если в масштабируемом наборе включен scheduledEventsProfile. Другие операции, такие как перезагрузка, повторное создание, повторное развертывание и остановка и удаление не создают события завершения.
  • Необязательно ждать истечения заданного времени ожидания — можно запустить операцию завершения в любое время после получения события и до истечения времени события NotBefore.
  • Обязательное удаление по истечении времени ожидания — отсутствует возможность увеличить значение времени ожидания после создания события. По истечении времени ожидания выполнится событие завершения работы, ожидающее обработки, и виртуальная машина будет удалена.
  • Изменяемое значение времени ожидания — можно изменить значение времени ожидания в любое время до удаления экземпляра, изменив свойство notBeforeTimeout в модели масштабируемого набора и обновив экземпляры виртуальной машины до последней версии модели.
  • Утвердить все ожидающие удаления — если в VM_1 имеется удаление, ожидающее обработки, которое не было утверждено, и вы утвердили другое событие завершения на VM_2, то VM_2 не удаляется до тех пор, пока не будет утверждено событие завершения для VM_1 или не истечет заданное для него время ожидания. После утверждения события завершения для VM_1 удаляются и VM_1, и VM_2.
  • Утвердить все одновременные удаления — в дополнение к приведенному выше примеру, если VM_1 и VM_2 имеют одинаковые значения времени NotBefore, то оба события завершения должны быть утверждены; в противном случае ни одна виртуальная машина не будет удалена до истечения времени ожидания.

Устранение неполадок

Не удалось включить scheduledEventsProfile

Если возникает ошибка BadRequest с сообщением об ошибке "Не удалось найти член scheduledEventsProfile" для объекта типа VirtualMachineProfile, проверьте версию API, используемую для операций масштабируемого набора. Требуется версия вычислительного API 2019-03-01 или выше.

Не удалось получить события завершения

Если вы не получаете никаких событий завершения с помощью запланированных событий, проверьте версию API, используемую для получения событий. Для обработки событий завершения требуется API службы метаданных версии 2019-01-01 или более поздней.

'http://169.254.169.254/metadata/scheduledevents?api-version=2019-01-01'

Получение события завершения с неправильным значением времени NotBefore

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

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

Узнайте, как развернуть приложение на Масштабируемые наборы виртуальных машин.