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 Probleme zu beheben. Um die Systemuhren synchron zu halten, sind Compute Engine-VM-Instanzen (virtuelle Maschinen) zur Verwendung von NTP (Network Time Protocol) vorkonfiguriert. Dabei handelt es sich um eine gebündelte Lösung aus Hardware und Software für die Zeitsynchronisierung. Wenn eine genaue Zeitsynchronisierung und die Überwachung der Genauigkeit der Zeitsynchronisierung für Ihre Ziele wichtig sind, können Sie anstelle von NTP genaue Zeit konfigurieren, um die Uhr Ihrer VM mit der Host-Uhr zu synchronisieren. Dazu verwenden Sie chrony und ptp_kvm. Diese Konfiguration ist so konzipiert, dass bei unterstützten Setups eine Genauigkeit von 1 ms erreicht wird.

Unterstützte Maschinentypen

Die folgenden Maschinentypen unterstützen die genaue Zeit:

Unterstützte Betriebssysteme

Die folgenden Betriebssysteme unterstützen die genaue Zeit:

Betriebssystem Versionen Google 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
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 folgenden Zonen unterstützen die genaue Zeit:

Zone Standort
europe-west1-b St. Ghislain, Belgien, Europa
europe-west1-c St. Ghislain, Belgien, Europa
europe-west2-b London, England, Europa
europe-west3-a Frankfurt, Deutschland, Europa
us-central1-a Council Bluffs, Iowa, Nordamerika
us-central1-b Council Bluffs, Iowa, Nordamerika
us-central1-c Council Bluffs, Iowa, Nordamerika
us-central1-f Council Bluffs, Iowa, Nordamerika
us-east1-b Moncks Corner, South Carolina, Nordamerika
us-east1-c Moncks Corner, South Carolina, Nordamerika
us-east4-c Ashburn, Virginia, Nordamerika
us-east5-a Columbus, Ohio, Nordamerika
us-south1-a Dallas, Texas, Nordamerika
us-west1-b The Dalles, Oregon, Nordamerika
us-west2-a Los Angeles, Kalifornien, Nordamerika
us-west3-a Salt Lake City, Utah, Nordamerika

Genaue Zeitsynchronisierung konfigurieren

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

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

Nachdem Sie beide Aufgaben ausgeführt 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 der genauen Zeitsynchronisierung ausgeführt werden, finden Sie unter dem VM-Erstellungsskript auf GitHub.

chrony für die Verwendung von ptp-kvm konfigurieren

Führen Sie das folgende Skript in jeder VM Ihres Cloud de Confiance 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

Cloud de Confiance Ops-Agent auf Ihrer VM konfigurieren

Führen Sie das folgende Skript in jeder VM Ihres Cloud de Confiance Projekts aus, um den Cloud de Confiance Ops-Agent für die Datenerhebung 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

Überwachung der Zeitsynchronisierung konfigurieren

Führen Sie das Setupscript zur Einrichtung von Logging und Dashboard für Ihr Cloud de Confiance Projekt aus, um die Überwachung der Zeitsynchronisierung für die VMs Ihres Cloud de Confiance Projekts zu konfigurieren. Mit diesem Skript können Sie die folgenden Aufgaben für Ihr Cloud de Confiance Projekt ausführen:

  • Es legt die entsprechenden Berechtigungen für das Dienstkonto fest, das mit dem Projekt Ihrer VMs Cloud de Confiance verknüpft ist.
  • Es erstellt einen logbasierten Messwert, mit dem chrony die Genauigkeit zwischen den Uhren auf der VM und dem Hostserver sicherstellt.
  • Es erstellt ein Dashboard, mit dem die Rückverfolgbarkeit der VM-Uhr zu UTC gemessen wird. Dazu werden die folgenden Messwerte kombiniert:
    • Die Genauigkeit der VM-Host-Uhr im Vergleich zu UTC, die als Cloud de Confiance Messwert instance/clock_accuracy/ptp_kvm/nanosecond_accuracy verfügbar ist.
    • Die chrony-Messwerte, mit denen die Genauigkeit der VM-Uhr im Vergleich zur Uhr des Hosts gemessen wird.

Führen Sie das folgende Skript 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 mit dem erstellten Dashboard die Daten zur Uhrengenauigkeit für die VMs Ihres Projekts ansehen.

Nächste Schritte