Configura l'ora esatta per le VM di Compute Engine

Molti sistemi software che dipendono da una sequenza accurata di eventi si basano su un orologio di sistema stabile e coerente, utilizzando i log di sistema con timestamp per garantire la sincronizzazione dell'ora e risolvere i problemi man mano che si verificano. Per mantenere sincronizzati gli orologi di sistema, le istanze di macchine virtuali (VM) Compute Engine sono preconfigurate per utilizzare il protocollo NTP (Network Time Protocol), una soluzione in bundle di hardware e software per la sincronizzazione dell'ora. Se garantire una sincronizzazione dell'ora accurata e monitorare la precisione della sincronizzazione dell'ora è importante per i tuoi obiettivi, puoi configurare l'ora accurata anziché NTP per sincronizzare l'orologio della VM con l'orologio dell'host utilizzando chrony e ptp_kvm. Questa configurazione è progettata per ottenere un'accuratezza entro 1 ms per le configurazioni supportate.

Tipi di macchine supportati

I seguenti tipi di macchine supportano l'ora accurata:

Sistemi operativi supportati

I seguenti sistemi operativi supportano l'ora accurata:

Sistema operativo Versioni Google Immagini
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

Zone supportate

Le seguenti zone supportano l'ora accurata:

Zona Località
europe-west1-b Saint-Ghislain, Belgio, Europa
europe-west1-c Saint-Ghislain, Belgio, Europa
europe-west2-b Londra, Inghilterra, Europa
europe-west3-a Francoforte, Germania, Europa
us-central1-a Council Bluffs, Iowa, Nord America
us-central1-b Council Bluffs, Iowa, Nord America
us-central1-c Council Bluffs, Iowa, Nord America
us-central1-f Council Bluffs, Iowa, Nord America
us-east1-b Moncks Corner, Carolina del Sud, Nord America
us-east1-c Moncks Corner, Carolina del Sud, Nord America
us-east4-c Ashburn, Virginia, Nord America
us-east5-a Columbus, Ohio, Nord America
us-south1-a Dallas, Texas, Nord America
us-west1-b The Dalles, Oregon, Nord America
us-west2-a Los Angeles, California, Nord America
us-west3-a Salt Lake City, Utah, Nord America

Configurare la sincronizzazione dell'ora accurata

Per configurare la sincronizzazione dell'ora accurata per le VM del progetto, completa le seguenti attività per ogni VM:

  • Configura chrony per utilizzare ptp-kvm come origine dell'ora.
  • Configura Cloud de Confiance Ops Agent per la raccolta e l'analisi dei dati.

Dopo aver completato entrambe le attività, la sincronizzazione dell'ora accurata è configurata per le VM del progetto.

Per uno script di esempio che crea una VM e completa entrambe le attività per configurare la sincronizzazione dell'ora accurata, consulta lo script di creazione della VM in GitHub.

Configurare chrony per utilizzare ptp-kvm

Per configurare chrony in modo che utilizzi ptp-kvm come origine dell'ora, esegui il seguente script all'interno di ogni VM del Cloud de Confiance progetto:

#!/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

Configurare Cloud de Confiance Ops Agent sulla VM

Per configurare Cloud de Confiance Ops Agent per la raccolta e l'analisi dei dati, esegui il seguente script all'interno di ogni VM del Cloud de Confiance progetto:

#!/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

Configurare il monitoraggio della sincronizzazione dell'ora

Per configurare il monitoraggio della sincronizzazione dell'ora per le VM del Cloud de Confiance progetto, esegui lo script di configurazione di logging e dashboard per il Cloud de Confiance progetto. Questo script ti aiuta a completare le seguenti attività per il tuo Cloud de Confiance progetto:

  • Imposta le autorizzazioni appropriate per il account di servizio associato al progetto della VM's Cloud de Confiance .
  • Crea una metrica basata su log che chrony utilizza per garantire l'accuratezza tra gli orologi della VM e del server host.
  • Crea una dashboard che misura la tracciabilità dell'orologio della VM rispetto all'ora UTC combinando le seguenti metriche:
    • La precisione dell'orologio host della VM rispetto all'ora UTC, disponibile come una Cloud de Confiance metrica, instance/clock_accuracy/ptp_kvm/nanosecond_accuracy.
    • Le metriche chrony che misurano l'accuratezza dell'orologio della VM rispetto all'orologio dell'host.

Per eseguire le attività precedenti, esegui il seguente script:

#!/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

Al termine dell'esecuzione dello script, utilizza la dashboard creata per visualizzare i dati sulla precisione dell'orologio per le VM del progetto.

Passaggi successivi