NTP auf einer VM konfigurieren


Viele Softwaresysteme, die von einer sorgfältigen Sequenzierung der Ereignisse abhängen, verlassen sich auf eine stabile, konsistente Systemuhr. System-Logs, die von den meisten Diensten geschrieben werden, umfassen einen Zeitstempel, mit dem Probleme in verschiedenen Komponenten eines Systems einfacher behoben werden können. Compute Engine-Instanzen sind zur Verwendung von NTP (Network Time Protocol) vorkonfiguriert, um die Systemuhren synchron zu halten.

NTP hält nicht nur die Serverzeit synchron, sondern ist auch im seltenen Fall einer Schaltsekunde nützlich. Mit einer Schaltsekunde wird die UTC-Zeit um eine Sekunde angepasst, um Änderungen bei der Erdumdrehung Rechnung zu tragen. Schaltsekunden treten nicht in regelmäßigen Abständen auf, weil die Geschwindigkeit der Erdrotation zwar schwankt, diese Schwankung jedoch aufgrund von klimatischen und geologischen Ereignissen ungleichmäßig ist. In der Vergangenheit haben Schaltsekunden eine Vielzahl von Diensten und Anwendungen im Web merklich beeinträchtigt. Mit NTP-Servern wird sichergestellt, dass alle Server bei einer Schaltsekunde dieselbe Zeit melden.

In diesem Dokument wird beschrieben, wie die NTP-Server auf den virtuellen Maschinen (VMs) konfiguriert werden, damit sie sich bei einer Schaltsekunde ordnungsgemäß verhalten.

Google NTP-Server und Verteilen von Schaltsekunden

Bei einem Unix-Betriebssystem werden Schaltsekunden häufig durch Wiederholung der letzten Sekunde des Tages implementiert. Dies kann zu Problemen bei Software führen, die erwartet, dass Zeitstempel immer nur erhöht werden. Um dieses Problem zu umgehen, "verteilen" die Zeitserver bei Google Cloud die zusätzliche Sekunde über vierundzwanzig Stunden hinweg – zwölf Stunden vor und zwölf Stunden nach dem Auftreten der Schaltsekunde –, sodass betroffene Computer die zusätzliche Sekunde nicht alle zur gleichen Zeit als wiederholten Zeitstempel sehen. Dadurch wird das Risiko bei Systemen verringert, die von einem konsistenten Zeitstempel abhängig sind. Es wird empfohlen, alle Compute Engine-VM-Instanzen für die Verwendung der internen Google NTP-Dienste zu konfigurieren.

NTP für eigene Instanzen konfigurieren

Google Cloud kann nicht vorhersagen, wie externe NTP-Dienste wie pool.ntp.org mit der Schaltsekunde umgehen. Es wird empfohlen, möglichst keine externen NTP-Quellen in Verbindung mit Compute Engine-VMs zu verwenden. Noch schlimmer wäre die gleichzeitige Verwendung eines Google NTP-Dienstes und eines externen Dienstes. Dies könnte zu unvorhersehbaren Änderungen der Systemzeit führen. Die Verwendung von nur einer externen NTP-Quelle ist besser als eine Mischung. Externe NTP-Dienste, wie pool.ntp.org verwenden jedoch wahrscheinlich Stepping zur Verarbeitung der Schaltsekunde. Daher sehen Ihre VMs möglicherweise einen wiederholten Zeitstempel.

Die sicherste Lösung besteht darin, die virtuellen Compute Engine-Maschinen so zu konfigurieren, dass nur ein einziger NTP-Server verwendet wird – der interne NTP-Server von Google. Mischen Sie keine externen NTP-Server mit Google NTP-Servern, da dies zu unerwartetem Verhalten führen kann. Weitere Informationen zum internen NTP-Server, der von Google bereitgestellt wird, finden Sie in den FAQ zu Google Public NTP.

Folgen Sie dieser Anleitung, um sicherzustellen, dass Ihre VMs ordnungsgemäß konfiguriert sind.

Linux (chrony)

Standardmäßig nutzen die meisten neuen Linux-Releases chrony, um die NTP-Einstellungen und die Zeitsynchronisierung zu verwalten. Damit chrony nur den internen NTP-Dienst verwendet, prüfen Sie die chrony-Konfiguration und entfernen Sie externe NTP-Server:

  1. Stellen Sie mit ssh eine Verbindung zu Ihrer Instanz her.

    Console

    So stellen Sie über die Console eine SSH-Verbindung zur VM her:

    1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

      Zur Seite „VM-Instanzen“

    2. Klicken Sie für die VM, die Sie konfigurieren möchten, auf die Schaltfläche SSH.

      SSH-Schaltfläche

    gcloud

    Führen Sie den folgenden Befehl aus, um über die Google Cloud CLI über SSH eine Verbindung zur VM herzustellen:

    gcloud compute instances ssh VM_NAME
    

    Ersetzen Sie VM_NAME durch den Namen der VM, zu der Sie eine Verbindung herstellen möchten.

  2. Führen Sie auf der Instanz chronyc sources aus, um den aktuellen Status Ihrer NTP-Konfiguration zu prüfen:

    $ chronyc sources
    

    Die Ausgabe sieht dann ungefähr so aus:

     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
    

    Wenn ein einzelner Datensatz auf metadata.google oder metadata.google.internal verweist, brauchen Sie keine Änderungen vorzunehmen. Wenn Sie mehrere Quellen sehen, gemischt zwischen metadata.google und einer öffentlichen Quelle wie pool.ntp.org, aktualisieren Sie Ihre Quellen, um alle externen NTP-Server zu entfernen.

    In der Beispielausgabe gibt es zwei Datensätze. Der eine verweist auf metadata.google.internal und der andere auf eine externe Adresse. Da mehrere Quellen vorhanden sind, müssen Sie Ihre NTP-Server aktualisieren, um die Adresse 38.229.53.9 zu entfernen, wie im nächsten Schritt beschrieben.

  3. Konfigurieren Sie Ihre NTP-Server zum Entfernen externer NTP-Server.

    Bearbeiten Sie die Datei /etc/chrony/chrony.conf mit Ihrem bevorzugten Texteditor, um den zusätzlichen NTP-Server aus der Liste zu entfernen. Suchen Sie alle Zeilen, die mit server external_source_ip_or_name beginnen, und entfernen Sie sie.

    Nachdem Sie die /etc/chrony/chrony.conf-Datei bearbeitet haben, starten Sie den chrony-Dienst neu. Der Befehl zum Neustarten kann je nach Linux-Distribution variieren, wie in den folgenden Beispielen gezeigt:

    sudo service chrony restart
    
    sudo systemctl restart chrony
    
  4. Prüfen Sie Ihre Konfiguration. Dazu führen Sie den Befehl chronyc sources noch einmal aus:

    $ chronyc sources
    

    Die Ausgabe sollte in etwa so aussehen:

     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)

Die meisten älteren Linux-Distributionen nutzen ntpd, um ihre NTP-Einstellungen und die Zeitsynchronisierung zu verwalten. Damit ntpd nur den internen NTP-Dienst verwendet, prüfen Sie die ntpd-Konfiguration und entfernen Sie externe NTP-Server:

  1. Stellen Sie mit ssh eine Verbindung zu Ihrer Instanz her.

    Console

    So stellen Sie über die Console eine SSH-Verbindung zur VM her:

    1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

      Zur Seite „VM-Instanzen“

    2. Klicken Sie für die VM, die Sie konfigurieren möchten, auf die Schaltfläche SSH.

      SSH-Schaltfläche

    gcloud

    Führen Sie den folgenden Befehl aus, um über die Google Cloud CLI über SSH eine Verbindung zur VM herzustellen:

    gcloud compute instances ssh VM_NAME
    

    Ersetzen Sie VM_NAME durch den Namen der VM, zu der Sie eine Verbindung herstellen möchten.

  2. Führen Sie auf der Instanz ntpq -p aus, um den aktuellen Status der NTP-Konfiguration zu prüfen:

    $ ntpq -p
    

    Die Ausgabe sieht dann ungefähr so aus:

    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
    

    Wenn ein einzelner Datensatz auf metadata.google oder metadata.google.internal verweist, brauchen Sie keine Änderungen vorzunehmen. Bei mehreren Quellen, die aus einer Mischung von metadata.google und einer öffentlichen Quelle wie pool.ntp.org bestehen, müssen Sie die Quellen aktualisieren, um externe NTP-Server zu entfernen.

    In der Beispielausgabe gibt es zwei Datensätze, einer, der auf metadata.google verweist und ein weiterer, der auf eine externe Adresse verweist. Da es mehrere Quellen gibt, müssen Sie die NTP-Server aktualisieren, um die *217.162.232.173-Adresse zu entfernen, wie im nächsten Schritt beschrieben.

  3. Konfigurieren Sie die NTP-Server so, dass externe Quellen entfernt werden.

    Bearbeiten Sie zur Konfiguration der NTP-Server die Datei /etc/ntp.conf im Texteditor Ihrer Wahl. Suchen Sie den Abschnitt servers der Konfiguration und entfernen Sie alle nicht zu Google gehörenden NTP-Quellen, zum Beispiel:

    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
    

    Nachdem Sie die Datei /etc/ntp.conf bearbeitet haben, starten Sie den NTP-Dienst neu. Der Befehl zum Neustarten kann je nach Linux-Distribution variieren:

    sudo service ntp reload
    
  4. Prüfen Sie Ihre Konfiguration. Dazu führen Sie den Befehl ntpq -p noch einmal aus:

    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. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

    Zur Seite „VM-Instanzen“

  2. Klicken Sie neben der Windows-Instanz, zu der Sie eine Verbindung herstellen möchten, auf die Schaltfläche RDP.

    SSH-Schaltfläche

  3. Klicken Sie nach der Anmeldung mit der rechten Maustaste auf das PowerShell-Symbol und wählen Sie Als Administrator ausführen aus.

    PowerShell-Symbol

  4. Führen Sie an der Eingabeaufforderung den folgenden Befehl aus, um die aktuelle NTP-Konfiguration zu sehen:

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

    Wenn ein einzelner Datensatz auf metadata.google oder metadata.google.internal verweist, brauchen Sie keine Änderungen vorzunehmen. Bei mehreren Quellen als Mischung von metadata.google und einer öffentlichen Quelle müssen Sie den externen Server entfernen. Folgen Sie der Anleitung im Windows-Handbuch, um den NTP-Server zu konfigurieren.

  5. Um eine größtmögliche Softwarekompatibilität auf Windows-VMs zu gewährleisten, empfiehlt Google die Verwendung des gVNIC-Treibers, was eine NTP-Genauigkeit von weniger als einer Millisekunde mit metadata.google gewährleistet.

    Wenn Sie VirtIO mit Ihrer Windows-VM verwenden müssen, um eine Genauigkeit von weniger als einer Millisekunde zu erreichen, empfiehlt Google, dass Sie den Windows Time Service nicht verwenden (w32tm beenden und Registrierung aufheben).

    1. Beenden Sie den Windows Time Service:

      net stop w32time
      
    2. Entfernen Sie den Windows Time Service aus dem Registry:

      w32tm /unregister
      
    3. Nachdem der Windows Time Service beendet und aus der Registry entfernt wurde, installieren Sie den Meinberg NTP-Client.

      Folgen Sie der Konfigurationsanleitung in der Meinberg-Dokumentation.

    4. Konfigurieren Sie den NTP-Server für den Meinberg NTP-Client als metadata.google.internal.

      Warten Sie nach Abschluss der NTP-Konfiguration zwischen 5 und 15 Minuten, bis sich die Systemuhr in der VM mit dem NTP-Server stabilisiert hat.

      Informationen dazu, warum w32tm nicht empfohlen wird, finden Sie in der Dokumentation zu bekannten Problemen

Schaltsekundenverteilung mit Systemen außerhalb von Google Cloud verwenden

Durch das Verteilen von Schaltsekunden bei Google NTP-Servern kann das Risiko bei der Wiederholung einer Sekunde bei zeitempfindlichen Systemen umgangen werden. Andere NTP-Dienste bieten möglicherweise ebenfalls für die meisten Softwaresysteme geeignete Lösungen zur Umgehung des Problems. Es ist jedoch wichtig, Google NTP-Dienste zum Verteilen von Schaltsekunden nicht mit öffentlichen NTP-Stepping-Diensten zu kombinieren.

Wenn Sie Geräte außerhalb von Google Cloud mit der verteilten Zeit synchronisieren möchten, können Sie für diese Geräte Google Public NTP verwenden. Google Public NTP verwendet dasselbe Verteilen von Schaltsekunden wie Compute Engine-VMs.

Nächste Schritte