Encerrar notificação para instâncias do Conjunto de Dimensionamento de Máquina Virtual do Azure

As instâncias do conjunto de dimensionamento podem optar por receber notificações de encerramento de instância e definir um tempo limite de atraso predefinido para a operação de encerramento. A notificação de rescisão é enviada por meio do Serviço de Metadados do Azure – Eventos Agendados, que fornece notificações e atrasos de operações impactantes, como reinicializações e reimplantações. A solução adiciona outro evento – Terminate – à lista de Eventos Agendados, e o atraso associado do evento terminate dependerá do limite de atraso, conforme especificado pelos usuários em suas configurações de modelo de conjunto de escala.

Depois de se inscrever em Eventos Agendados chamando o ponto de extremidade apropriado do Serviço de Metadados, as instâncias do conjunto de dimensionamento não precisam esperar o tempo limite especificado expirar antes que a instância seja excluída. Depois de receber uma notificação de encerramento, a instância pode optar por ser excluída a qualquer momento antes que o tempo limite de encerramento expire. As notificações de encerramento não podem ser ativadas em instâncias spot. Para obter mais informações sobre instâncias spot, consulte Azure Spot Virtual Machines for Virtual Machine Scale Sets

Ativar notificações de encerramento

Há várias maneiras de habilitar notificações de rescisão em suas instâncias de conjunto de escala, conforme detalhado nos exemplos abaixo.

Portal do Azure

As etapas a seguir habilitam a notificação de encerramento ao criar um novo conjunto de escalas.

  1. Vá para Conjuntos de Dimensionamento de Máquina Virtual.
  2. Selecione + Adicionar para criar um novo conjunto de escalas.
  3. Vá para a guia Gerenciamento .
  4. Localize a seção Encerramento da instância.
  5. Para Notificação de rescisão de instância, selecione Ativado.
  6. Para Atraso de término (minutos), defina o tempo limite padrão desejado.
  7. Quando terminar de criar o novo conjunto de escalas, selecione o botão Rever + criar .

Você também pode habilitar notificações de encerramento em um conjunto de escala existente.

  1. Navegue até o conjunto de escalas desejado
  2. Vá para a guia Configuração
  3. Em Ativar notificação de encerramento de instância, selecione Ativado.
  4. Para Atraso de término (minutos), defina o tempo limite padrão desejado.
  5. Selecione o botão Salvar .

API REST

O exemplo a seguir permite a notificação de encerramento no modelo de conjunto de escala.

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 5 minutos (conforme indicado pelo PT5M) para qualquer operação de encerramento em todas as instâncias do seu conjunto de escalas. O campo notBeforeTimeout pode ter qualquer valor entre 5 e 15 minutos no formato ISO 8601. Você pode alterar o tempo limite padrão para a operação terminate modificando a propriedade notBeforeTimeout em terminateNotificationProfile descrita acima.

Depois de habilitar scheduledEventsProfile no modelo de conjunto de escala e definir o notBeforeTimeout, atualize as instâncias individuais para o modelo mais recente para refletir as alterações.

Nota

As notificações de encerramento em instâncias de conjunto de escala só podem ser ativadas com a versão da API 2019-03-01 e superior

Azure PowerShell

Ao criar um novo conjunto de escalas, você pode habilitar notificações de encerramento no conjunto de escalas usando o cmdlet New-AzVmssConfig .

Este script de exemplo percorre a criação de um conjunto de escala e recursos associados usando o arquivo de configuração: Criar um Conjunto de Escala de Máquina Virtual completo. Você pode fornecer notificações de "configurar encerrar" adicionando os parâmetros TerminateScheduledEvents e TerminateScheduledEventNotBeforeTimeoutInMinutes ao objeto de configuração para criar o conjunto de escalas. O exemplo a seguir habilita o recurso com um tempo limite de atraso de 10 minutos.

Importante

A partir de novembro de 2023, os conjuntos de dimensionamento de VM criados usando o PowerShell e a CLI do Azure assumirão como padrão 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 tomar, vá para Breaking Change for VMSS PowerShell/CLI Customers - Microsoft Community Hub

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 encerramento em um conjunto de escala existente.

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

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

Depois de habilitar eventos agendados no modelo de conjunto de escala e definir o tempo limite, atualize as instâncias individuais para o modelo mais recente para refletir as alterações.

CLI 2.0 do Azure

O exemplo a seguir é para habilitar a notificação de término ao criar um novo conjunto de escalas.

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, em seguida, cria um novo conjunto de escala com notificações de encerramento habilitadas para um tempo limite padrão de 10 minutos.

O exemplo a seguir é para habilitar a notificação de término em um conjunto de escala existente.

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

Receber notificações de encerramento

As notificações de encerramento são entregues por meio de Eventos Agendados, que é 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 não sejam expostas fora da VM.

Os Eventos Agendados estão ativados para o seu conjunto de escalas na primeira vez que faz um pedido de eventos. Pode esperar uma resposta atrasada na sua primeira chamada de até dois minutos. Consulte o ponto de extremidade periodicamente para detetar eventos de manutenção futuros e o status das atividades de manutenção em andamento.

Eventos agendados será desabilitado para seu conjunto de escala se as instâncias do conjunto de escala não fizerem uma solicitação por 24 horas.

Descoberta de ponto de extremidade

Para VMs habilitadas para VNET, o Serviço de Metadados está disponível a partir de um IP estático não roteável, 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 à consulta

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

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

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

O DocumentIncarnation é um ETag e fornece uma maneira fácil de inspecionar se a carga útil de Eventos foi alterada desde a última consulta.

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

Responder a eventos

Depois de saber sobre um evento futuro e concluir sua lógica para o desligamento normal, você pode aprovar o evento pendente fazendo uma chamada POST para o serviço de metadados com o EventId. A chamada POST indica ao Azure que ele pode continuar com a exclusão da VM.

Abaixo está o json esperado no corpo de solicitação POST. A solicitação deve conter uma lista de StartRequests. Cada StartRequest contém o EventId para o evento que você deseja acelerar:

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

Certifique-se de que cada VM no conjunto de escala esteja apenas aprovando o EventID relevante apenas para essa VM. Uma VM pode obter seu próprio nome de VM por meio de metadados de instância. Esse nome assume 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 exemplo para consultar e responder a eventos Python.

Sugestões e melhores práticas

  • Encerrar notificações somente em operações de 'exclusão' – Todas as operações de exclusão (exclusão manual ou escalonamento iniciado automaticamente) gerarão eventos Encerrar se o conjunto de escalas tiver scheduledEventsProfile habilitado. Outras operações, como reboot, reimage, redeploy e stop/deallocate não geram eventos Terminate.
  • Sem espera obrigatória pelo tempo limite – Você pode iniciar a operação de encerramento a qualquer momento após o evento ter sido recebido e antes que o tempo NotBefore do evento expire.
  • Exclusão obrigatória no tempo limite – Não há qualquer capacidade de estender o valor de tempo limite após um evento ter sido gerado. Quando o tempo limite expirar, o evento terminate 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 de conjunto de escala e atualizando as instâncias de VM para o modelo mais recente.
  • Aprovar todas as exclusões pendentes – Se houver uma exclusão pendente em VM_1 que não foi aprovada e você tiver aprovado outro evento de encerramento no VM_2, VM_2 não será excluído até que o evento de término para VM_1 seja aprovado ou seu tempo limite tenha decorrido. Depois de aprovar o evento terminate para VM_1, VM_1 e VM_2 serão excluídos.
  • Aprovar todas as exclusões simultâneas – Estendendo o exemplo acima, se VM_1 e VM_2 tiverem o mesmo tempo NotBefore , ambos os eventos de encerramento deverão ser aprovados ou nenhuma VM será excluída antes que o tempo limite expire.

Resolver problemas

Falha ao ativar 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 escala. É necessária a versão 2019-03-01 ou superior.

Falha ao obter eventos de encerramento

Se você não estiver obtendo nenhum evento Encerrar 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 Encerrar.

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

Obtendo o evento Terminate com o tempo NotBefore incorreto

Depois de habilitar scheduledEventsProfile no modelo de conjunto de escala e definir o notBeforeTimeout, atualize as instâncias individuais para o modelo mais recente para refletir as alterações.

Próximos passos

Saiba como implantar seu aplicativo em conjuntos de dimensionamento de máquina virtual.