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

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

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

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

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

Портал Azure

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

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

Примечание

Невозможно настроить уведомления о прекращении работы для существующих масштабируемых наборов на портале Azure

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 минут.

New-AzVmssConfig `
  -Location "VMSSLocation" `
  -SkuCapacity 2 `
  -SkuName "Standard_DS2" `
  -UpgradePolicyMode "Automatic" `
  -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 UbuntuLTS \
  --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 к службе метаданных Azure с использованием 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 обновите отдельные экземпляры до последней модели, чтобы отразить указанные изменения.

Дальнейшие действия

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