Configurar NTP em uma VM


Muitos sistemas de software que dependem de um cuidadoso sequenciamento de eventos se baseiam em um relógio de sistema estável e consistente. Os registros de sistema gravados pela maioria dos serviços incluem um carimbo de data/hora que ajuda a depurar os problemas que ocorrem entre os diversos componentes do sistema. Para manter os relógios em sincronia, as instâncias do Compute Engine são pré-configuradas com o Network Time Protocol (NTP).

Além de manter o horário do servidor em sincronia, o NTP é útil no caso raro de um segundo bissexto. Um segundo bissexto é um ajuste de um segundo aplicado ao horário UTC para corrigir as variações na rotação da Terra. Ele não acontece em intervalos regulares, porque a velocidade da rotação da Terra varia de maneira irregular, em resposta a eventos climáticos e geológicos. Ele tem um impacto perceptível em vários serviços e aplicativos na Web. Os servidores NTP ajudam a garantir que o mesmo horário seja informado por todos os servidores durante o evento de um segundo bissexto.

Neste documento, descrevemos como configurar servidores NTP em máquinas virtuais (VMs) para que se comportem corretamente no caso de um segundo bissexto.

Servidores NTP do Google e leap smearing

Em geral, os segundos bissextos de um sistema operacional Unix são implementados repetindo o último segundo do dia. Isso pode causar problemas se o comportamento previsto no software é que o carimbo de data/hora sempre aumente. Para contornar esse problema, os servidores de horário do Google Cloud “distribuem” o segundo extra em 24 horas, 12 antes e 12 após o evento do segundo bissexto. Desse modo, o segundo extra não fica todo concentrado em um carimbo de data/hora repetido nos computadores. Isso reduz o risco em sistemas que dependem de um carimbo de data/hora consistente. É recomendável configurar todas as instâncias de máquina virtual (VM) do Compute Engine para usar os serviços internos do Google NTP.

Configurar NTP nas instâncias

O Google Cloud não consegue prever como os serviços externos de NTP, como pool.ntp.org, vão processar o segundo bissexto. Se possível, não use fontes de NTP externas com as VMs do Compute Engine. Além disso, o uso do serviço de NTP do Google com um serviço externo pode resultar em alterações imprevisíveis no horário do sistema. É preferível usar apenas uma única fonte de NTP externa do que usar essa combinação, mas saiba que os serviços de NTP externos, como o pool.ntp.org, usam stepping para processar o segundo bissexto. Como resultado, as VMs poderão ter um carimbo de data/hora repetido.

A abordagem mais segura é configurar as VMs do Compute Engine para usar um único servidor NTP, o servidor interno fornecido pelo Google. Não misture servidores NTP externos com servidores NTP do Google, porque isso pode resultar em um comportamento inesperado. Para mais informações sobre o servidor NTP interno fornecido pelo Google, consulte as Perguntas frequentes sobre o NTP público do Google.

Para garantir que suas VMs estejam configuradas corretamente, siga estas instruções.

Linux (chrony)

Por padrão, a maioria das novas versões do Linux usa chrony para gerenciar as configurações do NTP e a sincronização de tempo. Para garantir que chrony use apenas o serviço NTP interno, verifique a configuração de chrony e remova os servidores NTP externos:

  1. Use ssh para se conectar à instância.

    Console

    Para usar o console e se conectar à VM usando SSH, siga estas etapas:

    1. Acesse a página Instâncias de VMs no Console do Google Cloud.

      Acessar instâncias de VM

    2. Clique no botão SSH da VM que você quer configurar.

      Botão SSH.

    gcloud

    Para usar a CLI do Google Cloud para se conectar à VM usando SSH, execute o comando abaixo:

    gcloud compute instances ssh VM_NAME
    

    Substitua VM_NAME pelo nome da VM a que você está se conectando.

  2. Na instância, execute chronyc sources para verificar o estado atual da configuração do NTP:

    $ chronyc sources
    

    A resposta será semelhante a:

     210 Number of sources = 2
     MS Name/IP address         Stratum Poll Reach LastRx Last sample
     ===============================================================================
     ^* metadata.google.internal      2   6   377     4    -14us[  -28us] +/-  257us
     ^- 38.229.53.9                   2   6    37     4   -283us[ -297us] +/-   28ms
    

    Quando há um único registro apontando para metadata.google ou metadata.google.internal, não é necessário fazer alterações. Se houver várias fontes, misturando metadata.google e uma fonte pública, como pool.ntp.org, atualize-as para remover todos os servidores NTP externos.

    No exemplo de saída, há dois registros, um apontando para metadata.google.internal e outro para um endereço externo. Como há várias fontes, atualize os servidores NTP para remover o endereço 38.229.53.9, conforme descrito na próxima etapa.

  3. Configure os servidores NTP para remover os que são externos.

    Para remover um servidor NTP adicional da lista, edite o arquivo /etc/chrony/chrony.conf com o editor de texto de sua preferência. Encontre todas as linhas que começam com server external_source_ip_or_name e remova-as.

    Depois de editar o arquivo /etc/chrony/chrony.conf, reinicie o serviço chrony. O comando de reinicialização pode variar dependendo da distribuição do Linux, conforme mostrado nos exemplos a seguir:

    sudo service chrony restart
    
    sudo systemctl restart chrony
    
  4. Verifique a configuração executando o comando chronyc sources novamente:

    $ chronyc sources
    

    A saída será parecida com esta:

     210 Number of sources = 1
     MS Name/IP address         Stratum Poll Reach LastRx Last sample
     ===============================================================================
     ^* metadata.google.internal      2   7   377    98  -1343ns[-1588ns] +/-  396us
    

Linux (ntpd)

A maioria das distribuições Linux mais antigas usa ntpd para gerenciar as configurações do NTP e a sincronização de tempo. Para garantir que ntpd use apenas o serviço NTP interno, verifique a configuração de ntpd e remova os servidores NTP externos:

  1. Use ssh para se conectar à instância.

    Console

    Para usar o console e se conectar à VM usando SSH, siga estas etapas:

    1. Acesse a página Instâncias de VMs no Console do Google Cloud.

      Acessar instâncias de VM

    2. Clique no botão SSH da VM que você quer configurar.

      Botão SSH.

    gcloud

    Para usar a CLI do Google Cloud para se conectar à VM usando SSH, execute o comando abaixo:

    gcloud compute instances ssh VM_NAME
    

    Substitua VM_NAME pelo nome da VM a que você está se conectando.

  2. Na instância, execute ntpq -p para verificar o estado atual da configuração do NTP:

    $ ntpq -p
    

    A saída fica mais ou menos assim:

    remote           refid           st t when poll reach   delay   offset  jitter
    
    ==============================================================================
    *metadata.google 255.28.23.83     2 u   27   64    1    0.634   -2.537   2.285
    *217.162.232.173 130.149.17.8     2 u  191 1024  176   79.245    3.589  27.454
    

    Quando há um único registro apontando para metadata.google ou metadata.google.internal, não é necessário fazer alterações. Se houver várias fontes, misturadas entre o metadata.google e uma fonte pública como pool.ntp.org, será necessário atualizar as fontes para remover todos os servidores NTP externos.

    No exemplo de saída, há dois registros, um apontando para metadata.google e outro para um endereço externo. Como há várias fontes, é necessário atualizar os servidores NTP para remover o endereço *217.162.232.173, conforme descrito na próxima etapa.

  3. Configure os servidores NTP para remover as fontes externas.

    Para configurar os servidores NTP, edite o arquivo /etc/ntp.conf no editor de texto de sua preferência. Encontre a seção servers da configuração e remova todas as fontes NTP que não sejam do Google, por exemplo:

    vim /etc/ntp.conf
    
    # You do need to talk to an NTP server or two (or three).
    #server ntp.your-provider.example
    ...
    server metadata.google.internal iburst
    

    Depois de editar o arquivo /etc/ntp.conf, reinicie o serviço NTP. O comando para reiniciar pode variar conforme a distribuição do Linux:

    sudo service ntp reload
    
  4. Verifique a configuração executando o comando ntpq -p novamente:

    ntpq -p
    
    remote           refid           st t when poll reach   delay   offset  jitter
    ==============================================================================
    *metadata.google 255.28.23.83     2 u   27   64    1    0.634   -2.537   2.285
    

Windows

  1. Acesse a página Instâncias de VMs no Console do Google Cloud.

    Acessar instâncias de VM

  2. Clique no botão RDP ao lado da instância do Windows à qual você quer se conectar.

    Botão SSH.

  3. Depois de fazer login, clique com o botão direito do mouse no ícone do PowerShell e selecione Executar como administrador.

    O ícone do PowerShell.

  4. Quando o prompt de comando carregar, execute o seguinte comando para ver a configuração atual do NTP:

    w32tm /query /configuration
    
    [Configuration]
    ...
    Type: NTP (Local)
    NtpServer: metadata.google.internal,
    ...
    

    Quando há um único registro apontando para metadata.google ou metadata.google.internal, não é necessário fazer alterações. Quando há várias fontes, misturando o metadata.google com uma fonte pública, é necessário remover o servidor externo. Consulte o guia do Windows para configurar o servidor NTP.

  5. Para garantir a compatibilidade de software mais generalizada nas VMs do Windows, o Google recomenda que você use o driver gVNIC para garantir a precisão de NTP de submilissegundo com metadata.google.

    Se você precisa usar o VirtIO com sua VM do Windows para ter precisão de submilissegundos com servidores NTP, o Google recomenda não usar o serviço de tempo do Windows (interrompa e cancele o registro w32tm).

    1. Pare o Serviço de Tempo do Windows:

      net stop w32time
      
    2. Remova o Serviço de Tempo do Windows do registro:

      w32tm /unregister
      
    3. Depois que o Serviço de Tempo do Windows for interrompido e removido do registro, instale o cliente Meinberg NTP.

      Siga as instruções de configuração conforme fornecido na documentação do Meinberg.

    4. Configure o servidor NTP para o cliente NTP Meinberg como metadata.google.internal.

      Depois de concluir a configuração do NTP, aguarde entre 5 e 15 minutos para que o relógio do sistema na VM se estabilize com o servidor NTP.

      Para saber por que o uso de w32tm não é recomendado, consulte a documentação de problemas conhecidos.

Uso de segundo bissexto distribuído com sistemas externos ao Google Cloud.

O recurso leap smearing dos servidores NTP do Google é uma maneira conveniente de gerenciar o risco envolvido na repetição de um segundo nos sistemas afetados pelo tempo. Os outros serviços NTP talvez forneçam recursos aceitáveis para a maioria dos sistemas de software. No entanto, é importante que você não misture os serviços NTP de segundo bissexto distribuído do Google com os serviços de acompanhamento de NTP públicos.

Para sincronizar dispositivos fora do Google Cloud com o horário distribuído, é possível usar o NTP público do Google para esses dispositivos. O NTP público do Google usa a mesma distribuição de segundo bissexto fornecida às VMs do Compute Engine.

A seguir