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 Systemprotokolle mit Zeitstempeln, um die Zeitsynchronisierung zu gewährleisten und Fehler zu beheben, sobald sie auftreten. Um die Systemuhren synchron zu halten, sind Compute Engine-VM-Instanzen zur Verwendung von NTP (Network Time Protocol) vorkonfiguriert. NTP ist 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 mit der Hostuhr zu synchronisieren. Verwenden Sie dazu chrony und ptp_kvm. Diese Konfiguration ist darauf ausgelegt, bei unterstützten Setups eine Genauigkeit von 1 ms zu erreichen.

Unterstützte Maschinentypen

Die folgenden Maschinentypen unterstützen die 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

In den folgenden Zonen wird die genaue Zeit unterstützt:

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 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-Agent 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 Skript 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 therefor 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 Skript auf jeder VM Ihres Google Cloud Projekts aus, um 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 Skript können Sie die folgenden Aufgaben für Ihr Google Cloud -Projekt ausführen:

  • Damit werden die entsprechenden Berechtigungen für das Dienstkonto festgelegt, das mit dem Projekt Ihrer VMs verknüpft ist. Google Cloud
  • Dadurch 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:

Führen Sie das folgende Skript aus, um die vorherigen 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 im erstellten Dashboard die Daten zur Taktgenauigkeit für die VMs Ihres Projekts ansehen.

Nächste Schritte