Serviço de Metadados do Azure: Eventos Agendados para VMs do Linux

Aplica-se a: ✔️ VMs do Linux ✔️ Conjuntos de dimensionamento flexíveis ✔️ Conjunto de dimensionamento uniformes

Os eventos agendados são um serviço de metadados do Azure que dá ao aplicativo tempo para se preparar para a manutenção de máquinas virtuais (VM). Ele fornece informações sobre eventos de manutenção futuros (por exemplo, reinicializar) para que seu aplicativo possa se preparar e limitar a interrupção. Ele está disponível para todos os tipos de Máquinas Virtuais do Azure, incluindo PaaS e IaaS no Windows e no Linux.

Para saber mais sobre os eventos agendados no Windows, veja Eventos Agendados para VMs do Windows.

Observação

Eventos Agendados estão disponível geralmente em todas as regiões do Azure. Consulte Disponibilidade de Versão e Região para obter informações sobre a versão mais recente.

Por que usar Eventos Agendados?

Muitos aplicativos podem se beneficiar do tempo para se preparar para a manutenção de VMs. O tempo pode ser usado para executar tarefas específicas de aplicativo que melhoram a disponibilidade, a confiabilidade e a capacidade de manutenção, incluindo:

  • Ponto de verificação e restauração.
  • Descarregamento de conexão.
  • Failover de réplica primária.
  • Remoção de um pool de balanceador de carga.
  • Log de eventos.
  • Desligamento normal.

Com Eventos Agendados, seu aplicativo pode descobrir quando a manutenção ocorrerá e acionará tarefas para limitar seu impacto.

Os eventos agendados fornecem eventos nos seguintes casos de uso:

Noções básicas

O Serviço de Metadados do Azure expõe informações sobre a execução de VMs 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 ele não seja exposto fora da VM.

Escopo

Os eventos agendados são entregues a:

  • Máquinas virtuais autônomas.
  • Todas as VMs em um serviço de nuvem.
  • Todas as VMs em um conjunto de disponibilidade.
  • Todas as VMs em uma zona de disponibilidade.
  • Todas as VMs em um grupo de posicionamento do conjunto de dimensionamento.

Observação

Específico para VMs em uma zona de disponibilidade, os eventos agendados vão para VMs únicas em uma zona. Por exemplo, se você tiver 100 VMs em um conjunto de disponibilidade e houver uma atualização para uma delas, o evento agendado irá para todas as 100, mas, se houver 100 VMs únicas em uma zona, o evento irá apenas para a VM que está sendo afetada.

Como resultado, verifique o campo Resources no evento para identificar quais VMs são afetadas.

Descoberta do ponto de extremidade

Para VMs habilitadas para VNET, o serviço de metadados está disponível de 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=2020-07-01

Se a VM não for criada em uma Rede Virtual, os casos padrão para serviços de nuvem e VMs clássicas, uma lógica adicional será necessária para descobrir o endereço IP a ser utilizado. Consulte esse exemplo para saber como descobrir o ponto de extremidade do host.

Disponibilidade de Versão e Região

O serviço de Eventos Agendados tem controle de versão. As versões são obrigatórias; a versão atual é 2020-07-01.

Versão Tipo de Versão Regiões Notas de versão
2020-07-01 Disponibilidade geral Todos
  • Suporte adicionado à Duração do Evento
  • 01-08-2019 Disponibilidade geral Todos
  • Suporte adicionado à origem do evento
  • 01-04-2019 Disponibilidade geral Todos
  • Adição de suporte para a Descrição do Evento
  • 2019-01-01 Disponibilidade geral Todos
  • Suporte adicionado para conjuntos de dimensionamento de máquinas virtuais EventType “Terminate”
  • 2017-11-01 Disponibilidade geral Todos
  • Suporte adicionado para o EventType de remoção de VM spot “Preempt”
  • 2017-08-01 Disponibilidade geral Todos
  • Removido o sublinhado inicial dos nomes de recursos para as VMs de IaaS
  • Requisito de cabeçalho de metadados imposto para todas as solicitações
  • 2017-03-01 Visualização Todos
  • Versão inicial
  • Observação

    Versões prévias anteriores de Eventos Agendados compatíveis {mais recentes} como a api-version. Esse formato não é mais suportado e será substituído no futuro.

    Habilitar e Desabilitar Eventos Agendados

    Eventos Agendados são habilitados para o serviço na primeira vez em que você faz uma solicitação para eventos. Você deve esperar um atraso na resposta em sua primeira chamada de até dois minutos.

    Eventos Agendados são desabilitados para o serviço se ele não fizer uma solicitação por 24 horas.

    Manutenção iniciada pelo usuário

    A manutenção de VMs iniciada pelo usuário pelo Portal do Azure, API, CLI ou PowerShell resulta em um evento agendado. Você pode então testar a lógica de preparação de manutenção em seu aplicativo e permite que seu aplicativo se prepare para manutenção iniciada pelo usuário.

    Se você reinicia uma VM, um evento com o tipo Reboot é agendado. Se você reimplanta uma VM, um evento com o tipo Redeploy é agendado.

    Usar a API

    headers

    Ao consultar o Serviço de Metadados você deverá fornecer o cabeçalho Metadata:true para garantir que a solicitação não foi redirecionada de forma involuntária. O cabeçalho Metadata:true é necessário para todas as solicitações de eventos programados. A não inclusão do cabeçalho na solicitação resulta em uma resposta de "Solicitação Incorreta" do Serviço de Metadados.

    Consulta de eventos

    Você pode consultar Eventos Agendados realizando a chamada a seguir:

    Exemplo de bash

    curl -H Metadata:true http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
    

    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.

    {
        "DocumentIncarnation": {IncarnationID},
        "Events": [
            {
                "EventId": {eventID},
                "EventType": "Reboot" | "Redeploy" | "Freeze" | "Preempt" | "Terminate",
                "ResourceType": "VirtualMachine",
                "Resources": [{resourceName}],
                "EventStatus": "Scheduled" | "Started",
                "NotBefore": {timeInUTC},       
                "Description": {eventDescription},
                "EventSource" : "Platform" | "User",
                "DurationInSeconds" : {timeInSeconds},
            }
        ]
    }
    

    Propriedades do evento

    Propriedade Descrição
    EventId Identificador global exclusivo para esse evento.

    Exemplo:
    • 602d9444-d2cd-49c7-8624-8643e7171297
    EventType Impacto desse evento.

    Valores:
    • Freeze: A máquina virtual está agendada para ser colocada em pausa por alguns segundos. A conectividade de CPU e rede pode ser suspensa, mas não há nenhum impacto na memória ou arquivos abertos.
    • Reboot: A Máquina Virtual está agendada para ser reinicializada (a memória não persistente é perdida). Esse evento é disponibilizado assim que possível
    • Redeploy: A Máquina Virtual está agendada para ser movida para outro nó (os discos efêmeros são perdidos).
    • Preempt: A máquina virtual spot está sendo excluída (discos efêmeros são perdidos).
    • Terminate: a máquina virtual está agendada para ser excluída.
    ResourceType O tipo de recurso que esse evento afeta.

    Valores:
    • VirtualMachine
    Recursos A lista de recursos que esse evento afeta. É garantido que a lista contém máquinas de no máximo um domínio de atualização, mas pode não conter todas as máquinas no UD.

    Exemplo:
    • ["FrontEnd_IN_0", "BackEnd_IN_0"]
    EventStatus Status desse evento.

    Valores:
    • Scheduled: Esse evento está agendado para ser iniciado após o tempo especificado na propriedade NotBefore.
    • Started: Esse evento foi iniciado.
    Nenhum Completed ou status semelhante é fornecido em nenhum momento. O evento não é mais retornado quando é concluído.
    NotBefore Tempo após o qual esse evento pode começar.

    Exemplo:
    • Segunda-feira, 19 de setembro de 2016 18:29:47 GMT
    Descrição A descrição deste evento.

    Exemplo:
    • O servidor host está passando por manutenção.
    EventSource Iniciador do evento.

    Exemplo:
    • Platform: esse evento é iniciado pela plataforma.
    • User: esse evento é iniciado pelo usuário.
    DurationInSeconds A duração esperada da interrupção causada pelo evento.

    Exemplo:
    • 9: A interrupção causada pelo evento durará 9 segundos.
    • -1: O valor padrão usado se a duração do impacto for desconhecida ou não aplicável.

    Agendamento do evento

    Cada evento é agendado uma quantidade mínima de tempo no futuro com base no tipo de evento. Esse tempo é refletido na propriedades NotBefore de um evento.

    EventType Aviso mínimo
    Congelamento 15 minutos
    Reboot 15 minutos
    Reimplantar 10 minutos
    Preempt 30 segundos
    Terminate Configurável pelo usuário: De 5 a 15 minutos

    Observação

    Em alguns casos, o Azure é capaz de prever a falha do host devido a hardware degradado e agendará uma migração para tentar reduzir a interrupção em seu serviço. As máquinas virtuais afetadas receberão um evento agendado com um NotBefore, que normalmente é de alguns dias no futuro. O tempo real depende da avaliação de risco da falha prevista. O Azure tenta avisar com sete dias de antecedência, quando possível, mas o tempo real varia e poderá ser menor se houver uma previsão de grande chance de falha de software iminente. Para minimizar o risco para o serviço caso o hardware falhe antes da migração iniciada pelo sistema, recomendamos que você reimplante sua máquina virtual assim que possível.

    Observação

    Quando o nó de host apresenta uma falha de hardware, o Azure ignora o período mínimo de aviso prévio e inicia imediatamente o processo de recuperação das máquinas virtuais afetadas. Isso reduz o tempo de recuperação, caso as VMs afetadas não consigam responder. Durante o processo de recuperação, um evento é criado para todas as VMs afetadas com EventType = Reboot e EventStatus = Started

    Frequência de sondagem

    Você pode fazer uma sondagem do ponto de extremidade para buscar atualizações com a frequência que desejar. No entanto, quanto maior o tempo entre as solicitações, mais tempo você pode perder para reagir a um evento futuro. A maioria dos eventos tem entre 5 e 15 minutos de aviso prévio, embora, em alguns casos, esse aviso possa ser de apenas 30 segundos. Para garantir que você tenha o máximo de tempo possível para realizar ações de mitigação, recomendamos monitorar o serviço uma vez por segundo.

    Iniciar um evento

    Após a descoberta de um evento futuro e concluído sua lógica de desligamento normal, você poderá aprovar o evento pendente fazendo uma chamada POST para o Serviço de Metadados com EventId. Essa chamada indica para o Azure que ele pode encurtar o tempo mínimo de notificação (quando possível).

    A seguir vemos o exemplo de JSON esperado no corpo da solicitação POST. A solicitação deve conter uma lista de StartRequests. Cada StartRequest contém o EventId para o evento que você deseja agilizar:

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

    Exemplo de bash

    curl -H Metadata:true -X POST -d '{"StartRequests": [{"EventId": "f020ba2e-3bc0-4c40-a10b-86575a9eabd5"}]}' http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
    

    Observação

    Reconhecer um evento permite que o evento prossiga para todos Resources no evento, e não apenas a VM que reconhece o evento. Portanto, é possível eleger um líder para coordenar o reconhecimento, que pode ser tão simples como a primeira máquina no campo Resources.

    Exemplo de Python

    O exemplo a seguir consulta o Serviço de Metadados para eventos agendados e aprova cada evento pendente:

    #!/usr/bin/python
    
    import json
    import socket
    import urllib2
    
    metadata_url = "http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01"
    this_host = socket.gethostname()
    
    
    def get_scheduled_events():
        req = urllib2.Request(metadata_url)
        req.add_header('Metadata', 'true')
        resp = urllib2.urlopen(req)
        data = json.loads(resp.read())
        return data
    
    
    def handle_scheduled_events(data):
        for evt in data['Events']:
            eventid = evt['EventId']
            status = evt['EventStatus']
            resources = evt['Resources']
            eventtype = evt['EventType']
            resourcetype = evt['ResourceType']
            notbefore = evt['NotBefore'].replace(" ", "_")
    	description = evt['Description']
    	eventSource = evt['EventSource']
            if this_host in resources:
                print("+ Scheduled Event. This host " + this_host +
                    " is scheduled for " + eventtype + 
    		" by " + eventSource + 
    		" with description " + description +
    		" not before " + notbefore)
                # Add logic for handling events here
    
    
    def main():
        data = get_scheduled_events()
        handle_scheduled_events(data)
    
    
    if __name__ == '__main__':
        main()
    

    Próximas etapas