Notificação de encerramento para instâncias do conjunto de dimensionamento de máquinas virtuais do Azure

As instâncias do conjunto de dimensionamento podem aceitar receber as notificações de término de instância e configurar um tempo limite de atraso predefinido para a operação de término. A notificação de término é enviada por meio do Serviço de Metadados do Azure Eventos Agendados, que fornece notificações de operações de impacto e atraso dessas operações, como reinicializações e reimplantação. A solução adiciona outro evento (Terminate) à lista de Eventos Agendados e o atraso associado do evento de término dependerá do limite de atraso conforme especificado pelos usuários nas configurações de modelo de conjunto de dimensionamento.

Após você ter se inscrito nos Eventos Agendados ao chamar o ponto de extremidade de Serviços de Metadados adequado, as instâncias do conjunto de dimensionamento não precisam aguardar o tempo limite especificado expirar antes de a instância ser excluída. Depois de receber uma notificação de Término, a instância pode optar por ser excluída a qualquer momento antes do tempo limite de término expire. As notificações de término não podem ser habilitadas em instâncias do Spot. Para obter mais informações sobre instâncias do Spot, confira Máquinas Virtuais de Spot do Azure para Conjuntos de Dimensionamento de Máquinas Virtuais

Habilitar as notificações de término

Há várias maneiras de habilitar notificações de término nas suas instâncias do conjunto de dimensionamento, conforme detalhado nos exemplos abaixo.

Portal do Azure

As etapas a seguir habilitam a notificação de término ao criar um conjunto de dimensionamento.

  1. Acesse Conjuntos de Dimensionamento de Máquinas Virtuais.
  2. Selecione + Adicionar para criar um conjunto de dimensionamento.
  3. Acesse a guia Gerenciamento.
  4. Localize a seção Término da instância.
  5. Em Notificação de término de instância, selecione Ativado.
  6. Em Atraso do término (minutos) , defina o tempo limite padrão desejado.
  7. Quando terminar de criar o conjunto de dimensionamento, selecione o botão Examinar + criar.

Você também pode habilitar notificações de término em um conjunto de dimensionamento existente.

  1. Navegue até o contêiner desejado.
  2. Acesse a aba Configuração.
  3. Em Habilitar notificação de término de instância, selecione Ativado.
  4. Em Atraso do término (minutos) , defina o tempo limite padrão desejado.
  5. Selecione o botão Salvar.

API REST

O exemplo a seguir habilita a notificação de término no modelo do conjunto de dimensionamento.

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

O bloco acima especifica um atraso de tempo limite de cinco minutos (conforme indicado por PT5M) para qualquer operação de término em todas as instâncias no seu conjunto de dimensionamento. O campo notBeforeTimeout pode usar qualquer valor entre 5 e 15 minutos no formato ISO 8601. Você pode alterar o tempo limite padrão para a operação de término modificando a propriedade notBeforeTimeout no terminateNotificationProfile descrito acima.

Depois de habilitar o scheduledEventsProfile no modelo do conjunto de dimensionamento e definir o notBeforeTimeout, atualize as instâncias individuais para o modelo mais recente para que elas exibam as alterações.

Observação

As notificações de término em instâncias do conjunto de dimensionamento só podem ser habilitadas com a versão de API 2019-03-01 e superior

Azure PowerShell

Ao criar um conjunto de dimensionamento, você pode habilitar notificações de término no conjunto de dimensionamento usando o cmdlet New-AzVmssConfig.

Este script de exemplo mostra a criação de um conjunto de dimensionamento e dos recursos associados usando o arquivo de configuração: Criar um conjunto de dimensionamento de máquinas virtuais completo. Você pode configurar as notificações de "configuração de término" adicionando os parâmetros TerminateScheduledEvents e TerminateScheduledEventNotBeforeTimeoutInMinutes ao objeto de configuração para criar um conjunto de dimensionamento. O exemplo a seguir habilita o recurso com um tempo limite de atraso de dez minutos.

Importante

A partir de novembro de 2023, os conjuntos de dimensionamento de VM criados usando o PowerShell e a CLI do Azure serão padrão para o Modo de Orquestração Flexível se nenhum modo de orquestração for especificado. Para obter mais informações sobre essa alteração e quais ações você deve executar, acesse Alteração Interruptiva para Clientes PowerShell/CLI de VMSS – Hub de Comunidade da Microsoft

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

Use o cmdlet Update-AzVmss para habilitar notificações de término em um conjunto de dimensionamento existente.

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

O exemplo acima habilita as notificações de término em um conjunto de dimensionamento existente e define um tempo limite de 15 minutos para o evento de término.

Depois de habilitar os eventos agendados no modelo do conjunto de dimensionamento e definir o tempo limite, atualize as instâncias individuais para o modelo mais recente para que elas exibam as alterações.

CLI do Azure 2.0

O exemplo a seguir habilita a notificação de término ao criar um conjunto de dimensionamento.

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

O exemplo acima primeiro cria um grupo de recursos e depois cria um conjunto de dimensionamento com notificações de término habilitadas por um tempo limite padrão de dez minutos.

O exemplo a seguir habilita a notificação de término em um conjunto de dimensionamento existente.

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

Obter notificação de término

As notificações de término são entregues por meio dos Eventos Agendados, que são um Serviço de Metadados do Azure. O Serviço de Metadados do Azure expõe informações sobre a execução de Máquinas Virtuais usando um Ponto de Extremidade REST acessível de dentro da VM. As informações estão disponíveis por meio de um IP não roteável para que elas não sejam expostas fora da VM.

Os Eventos Agendados são habilitados para o conjunto de dimensionamento na primeira vez em que você faz uma solicitação para eventos. Você deve esperar um atraso na resposta de até dois minutos na sua primeira chamada. Consulte o ponto de extremidade periodicamente para detectar futuros eventos de manutenção e o status das atividades de manutenção em andamento.

Os Eventos Agendados serão desabilitados no seu conjunto de dimensionamento se as instâncias do conjunto de dimensionamento não fizerem uma solicitação por 24 horas.

Descoberta do ponto de extremidade

Para VMs habilitadas para VNET, o Serviço de Metadados está disponível em um IP não roteável estático, 169.254.169.254.

O ponto de extremidade completo para a versão mais recente dos eventos agendados é:

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

Resposta da consulta

Uma resposta contém uma matriz de eventos agendados. Uma matriz vazia significa que não há eventos agendados no momento.

No caso de haver eventos agendados, a resposta contém uma matriz de eventos. Para um evento "Terminate", a resposta terá a seguinte aparência:

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

O DocumentIncarnation é uma ETag e fornece um modo fácil de inspecionar se o conteúdo dos eventos foi alterado desde a última consulta.

Para obter mais informações sobre cada um dos campos acima, confira a documentação dos Eventos Agendados para Windows e Linux.

Responder a eventos

Após ter descoberto um evento futuro e concluído a sua lógica de desligamento normal, você poderá aprovar o evento pendente realizando uma chamada POST para o serviço de metadados com EventId. A chamada POST indica ao Azure que ele pode continuar com a exclusão da VM.

Veja abaixo o JSON esperado no corpo da solicitação POST. A solicitação deve conter uma lista de StartRequests. Cada StartRequest contém o EventId do evento que você deseja acelerar:

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

Verifique se cada VM no conjunto de dimensionamento está aprovando apenas o EventID relevante para essa VM. Uma VM pode obter o respectivo nome de VM por meio de metadados de instância. Esse nome usa a forma "{scale-set-name}_{instance-id}" e será exibido na seção 'Recursos' da resposta de consulta descrita acima.

Você também pode consultar scripts de exemplos para consultar e responder a eventos Python.

Dicas e práticas recomendadas

  • Notificações de término somente em operações 'delete': todas as operações delete (exclusão manual ou redução horizontal iniciada pelo dimensionamento automático) gerarão eventos Terminate se o conjunto de dimensionamento tiver scheduledEventsProfile habilitado. Outras operações, como reinicializar, refazer imagem, reimplantar e parar/desalocar, não geram eventos Terminate.
  • Nenhuma espera obrigatória para o tempo limite: você pode iniciar a operação de término a qualquer momento depois que o evento tiver sido recebido e antes que o horário NotBefore do evento tenha sido expirado.
  • Exclusão obrigatória no tempo limite: não há nenhuma funcionalidade de extensão do valor de tempo limite após a geração de um evento. Quando o tempo limite expirar, o evento de término pendente será processado e a VM será excluída.
  • Valor de tempo limite modificável: você pode modificar o valor de tempo limite a qualquer momento antes que uma instância seja excluída, modificando a propriedade notBeforeTimeout no modelo do conjunto de dimensionamento e atualizando as instâncias de VM para o modelo mais recente.
  • Aprovar todas as exclusões pendentes: se houver uma exclusão pendente na VM_1 que não foi aprovada e você tiver aprovado outro evento de término na VM_2, a VM_2 não será excluída até que o evento de término da VM_1 seja aprovado ou o tempo limite tenha decorrido. Depois de aprovar o evento de término da VM_1, a VM_1 e a VM_2 serão excluídas.
  • Aprovar todas as exclusões simultâneas: estendendo o exemplo acima, se VM_1 e VM_2 tiverem o mesmo horário NotBefore, ambos os eventos de término precisarão ser aprovados ou nenhuma VM será excluída antes que o tempo limite expire.

Solucionar problemas

Falha ao habilitar scheduledEventsProfile

Se você receber um erro 'BadRequest' com uma mensagem de erro informando "Não foi possível encontrar o membro 'scheduledEventsProfile' no objeto do tipo 'VirtualMachineProfile'", verifique a versão da API usada para as operações do conjunto de dimensionamento. A versão da API de computação 2019-03-01 ou superior é necessária.

Falha ao obter eventos Terminate

Se você não estiver obtendo eventos Terminate por meio de Eventos Agendados, verifique a versão da API usada para obter os eventos. A API do Serviço de Metadados versão 2019-01-01 ou superior é necessária para eventos Terminate.

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

O evento Terminate está sendo obtido com o horário NotBefore incorreto

Depois de habilitar o scheduledEventsProfile no modelo do conjunto de dimensionamento e definir o notBeforeTimeout, atualize as instâncias individuais para o modelo mais recente para que elas exibam as alterações.

Próximas etapas

Aprenda como Implantar o aplicativo em Conjuntos de Dimensionamento de Máquinas Virtuais.