Genaue Zeit für Compute Engine-VMs konfigurieren

Viele Softwaresysteme, die von einer sorgfältigen Sequenzierung der Ereignisse abhängen, verlassen sich auf eine stabile, konsistente Systemuhr. Sie verwenden Systemlogs mit Zeitstempeln, um die Zeitsynchronisierung zu gewährleisten und Fehler zu beheben. Damit die Systemuhren synchronisiert bleiben, sind Compute Engine-VM-Instanzen (virtuelle Maschinen) vorkonfiguriert, um das Network Time Protocol (NTP) zu verwenden. Dabei handelt es sich um eine gebündelte Lösung aus Hardware und Software zur Zeitsynchronisierung. Wenn eine genaue Zeitsynchronisierung und die Überwachung der Genauigkeit Ihrer Zeitsynchronisierung für Ihre Ziele wichtig sind, können Sie anstelle von NTP Genaue Zeit konfigurieren, um die Uhr Ihrer VM mithilfe von chrony und ptp_kvm mit der Hostuhr zu synchronisieren. Diese Konfiguration ist darauf ausgelegt, bei unterstützten Setups eine Genauigkeit von 1 ms zu erreichen.

Unterstützte Maschinentypen

Die folgenden Maschinentypen unterstützen eine genaue Zeit:

Unterstützte Betriebssysteme

Die folgenden Betriebssysteme unterstützen eine genaue Zeit:

Betriebssystem Versionen Bilder
CentOS Stream 9 centos-stream-9
Container-Optimized OS COS 105 LTS, COS 109 LTS, COS 113 LTS, COS 117 LTS cos-105-lts, cos-109-lts, cos-113-lts, cos-117-lts
Debian 11 (Bullseye), 12 (Bookworm) debian-11, debian-12
Logo: Fedora Cloud 39 fedora-cloud-39
RHEL 8, 9 rhel-8-4-sap-ha, rhel-8-6-sap-ha, rhel-8-8-sap-ha, rhel-8-10-sap-ha, rhel-9, rhel-9-0-sap-ha, rhel-9-2-sap-ha, rhel-9-4-sap-ha
Rocky Linux 8, 9 rocky-linux-8, rocky-linux-8-optimized-gcp, rocky-linux-9-optimized-gcp, rocky-linux-9-optimized-gcp
SLES 15 sles-15, sles-15-sp2-byos, sles-15-sp2-sap, sles-15-sp3-byos, sles-15-sp3-sap, sles-15-sp4-byos, sles-15-sp4-sap, sles-15-sp5-byos, sles-15-sp5-sap
Ubuntu 22.04 LTS (Jammy Jellyfish), 24.04 LTS (Noble Numbat) ubuntu-2204-lts, ubuntu-2404-lts-amd64
Ubuntu Pro 2004 ubuntu-pro-2004-lts, ubuntu-pro-2004-lts-amd64

Unterstützte Zonen

Die genaue Zeitsynchronisierung wird in allen öffentlichen Google Cloud Regionen und Zonen für unterstützte Maschinentypen und Betriebssysteme unterstützt.

Genaue Zeitsynchronisierung konfigurieren

Führen Sie die folgenden Aufgaben für jede VM aus, um eine genaue Zeitsynchronisierung für die VMs Ihres Projekts zu konfigurieren:

  • Konfigurieren Sie chrony so, dass ptp-kvm als Zeitquelle verwendet wird.
  • Konfigurieren Sie den Google Cloud Ops-Agenten für die Datenerhebung und -analyse.

Nachdem Sie beide Aufgaben erledigt haben, ist die genaue Zeitsynchronisierung für die VMs in Ihrem Projekt eingerichtet.

Ein Beispielskript, mit dem eine VM erstellt und beide Aufgaben zur Konfiguration einer genauen Zeitsynchronisierung ausgeführt werden, finden Sie im VM-Erstellungsskript auf GitHub.

chrony für die Verwendung von ptp-kvm konfigurieren

Führen Sie das folgende Script auf jeder VM Ihres Google Cloud -Projekts aus, um chrony so zu konfigurieren, dass ptp-kvm als Zeitquelle verwendet wird:

#!/bin/bash

# Install chrony as needed
if ! command -v chronyc &>/dev/null; then
    # Detect the package manager and install chrony
    if command -v apt &>/dev/null; then
        # Debian, Ubuntu, and derivatives
        echo "Detected apt. Installing chrony..."
        apt-get update
        apt-get install -y chrony
    elif command -v dnf &>/dev/null; then
        # Fedora, RHEL 8+, CentOS 8+
        echo "Detected dnf. Installing chrony..."
        dnf install -y chrony
    elif command -v yum &>/dev/null; then
        # RHEL 7, CentOS 7
        echo "Detected yum. Installing chrony..."
        yum install -y chrony
    elif command -v zypper &>/dev/null; then
        # openSUSE, SLES
        echo "Detected zypper. Installing chrony..."
        zypper install -y chrony
    else
        echo "Please install chrony manually."
        exit 1
    fi
fi

# Different distros place chrony config in
# different locations, detect this.
if [ -f "/etc/chrony/chrony.conf" ]; then
    CHRONY_CONF="/etc/chrony/chrony.conf"
else
    CHRONY_CONF="/etc/chrony.conf"
fi

# Load PTP-KVM clock for high-accuracy clock synchronization
# PTP-KVM allows the VM to read a cross time-stamp of a platform
# provided clock and the VM CPU Clock (CycleCounter), providing
# resiliency from network and virtualization variability when
# synchronizing the realtime/wall clock
/sbin/modprobe ptp_kvm
echo "ptp_kvm" >/etc/modules-load.d/ptp_kvm.conf

# NTP servers might indicate the wrong time due to chrony
# greatly reducing the polling frequency, resulting in
# overall negative impact to the clock synchronization
# achieved, especially after live migration events.
#
# We disable NTP servers to prevent these issues.
#
# Customers interested in monitoring the clock accuracy compared to NTP sources
# should run a second instance of chrony in a no-change mode to do so.

# Disable NTP servers:
sed -i '/^server /d' $CHRONY_CONF
sed -i '/^pool /d' $CHRONY_CONF
sed -i '/^include /d' $CHRONY_CONF

#Disable DHCP based NTP config:
sed -i 's/^NETCONFIG_NTP_POLICY="auto"/NETCONFIG_NTP_POLICY=""/' /etc/sysconfig/network/config
truncate -s 0 /var/run/netconfig/chrony.servers
echo PEERNTP=no | sudo tee -a /etc/sysconfig/network
service NetworkManager restart
systemctl disable systemd-timesyncd.service
timedatectl set-ntp false

# Configure PTP-KVM based HW refclock, with leap second smearing
# Google's clocks are doing leap second smearing, and therefore chrony shouldn't attempt to adjust
# the time received from PTP-KVM to adjust for leap seconds.
sed "s/^leapsectz/#leapsectz/" -i $CHRONY_CONF
echo "refclock PHC /dev/ptp_kvm poll -1" >>$CHRONY_CONF
# For extra debugging logging, uncomment the following line
#echo "log measurements statistics tracking" >> $CHRONY_CONF
# Enable chrony's clock accuracy tracking log,
# for monitoring and auditing.
echo "log tracking" >>$CHRONY_CONF

# Restart chrony (Ubuntu named it differently)
systemctl restart chronyd
systemctl restart chrony

Ops-Agent auf Ihrer VM konfigurieren Google Cloud

Führen Sie das folgende Script auf jeder VM Ihres Google Cloud Projekts aus, um den Google Cloud Ops-Agent für die Datenerfassung und -analyse zu konfigurieren:

#!/bin/bash

# From https://cloud.google.com/stackdriver/docs/solutions/agents/ops-agent/installation#install-latest-version
curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
bash add-google-cloud-ops-agent-repo.sh --also-install

OPS_AGENT_CONF="
logging:
    receivers:
        chrony_tracking_receiver:
            type: files
            include_paths:
                - /var/log/chrony/tracking.log
    processors:
        chrony_tracking_processor:
            type: parse_regex
            regex: \"^.*PHC0.*  (?<max_error>[-\d\.eE]+)$\"
    service:
        pipelines:
            chrony_tracking_pipeline:
                receivers: [chrony_tracking_receiver]
                processors: [chrony_tracking_processor]
"

OPS_AGENT_CONF_PATH="/etc/google-cloud-ops-agent/config.yaml"
echo "$OPS_AGENT_CONF" >"$OPS_AGENT_CONF_PATH"
systemctl restart google-cloud-ops-agent

Monitoring der Zeitsynchronisierung konfigurieren

Wenn Sie die Zeitabgleichsüberwachung für die VMs Ihres Google Cloud-Projekts konfigurieren möchten, führen Sie das Script zum Einrichten von Logging und Dashboard für IhrGoogle Cloud -Projekt aus. Mit diesem Script können Sie die folgenden Aufgaben für Ihr Google Cloud -Projekt ausführen:

  • Es werden die entsprechenden Berechtigungen für das Dienstkonto festgelegt, das mit dem Projekt Ihrer VMs Google Cloud verknüpft ist.
  • Damit wird ein logbasierter Messwert erstellt, mit dem chrony die Genauigkeit zwischen den Uhren auf der VM und dem zugehörigen Hostserver sicherstellt.
  • Es wird ein Dashboard erstellt, in dem die Rückverfolgbarkeit der VM-Uhrzeit zu UTC anhand der folgenden Messwerte gemessen wird:
    • Die Genauigkeit der VM-Hostuhr im Vergleich zu UTC, die alsGoogle Cloud -Messwert verfügbar ist: instance/clock_accuracy/ptp_kvm/nanosecond_accuracy.
    • Die chrony-Messwerte, mit denen die Genauigkeit der VM-Uhr im Vergleich zur Uhr des Hosts gemessen wird.

Führen Sie das folgende Script aus, um die oben genannten Aufgaben auszuführen:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: time-sync-logging-dashboard.sh <project_id>" >&2
    exit 1
fi

PROJECT_ID="$1"
PROJECT_NUMBER=$(gcloud projects describe "$PROJECT_ID" --format="value(projectNumber)")
SERVICE_ACCOUNT_EMAIL=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --role="roles/compute.instanceAdmin"

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --role="roles/monitoring.metricWriter"

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --role="roles/logging.logWriter"

cp clock-error-metric.json /tmp/clock-error-metric.json
sed -i "s/PROJECT_ID/${PROJECT_ID}/" /tmp/clock-error-metric.json

gcloud logging metrics create --project "${PROJECT_ID}" phc-clock-max-error-gce --config-from-file=/tmp/clock-error-metric.json
gcloud monitoring dashboards create --project "${PROJECT_ID}" --config-from-file=metric-dashboard.json

Nachdem das Skript ausgeführt wurde, können Sie das erstellte Dashboard verwenden, um die Daten zur Taktgenauigkeit für die VMs Ihres Projekts anzusehen.

Nächste Schritte