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 il debug dei 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 Network Time Protocol (NTP), una soluzione in bundle di hardware e software di sincronizzazione dell'ora. Se garantire una sincronizzazione dell'ora accurata e monitorare l'accuratezza della sincronizzazione dell'ora sono importanti per i tuoi obiettivi, puoi configurare l'ora esatta anziché NTP per sincronizzare l'orologio della VM con l'orologio dell'host utilizzando chrony e ptp_kvm. Questa configurazione è progettata per ottenere una precisione di 1 ms per le configurazioni supportate.

Tipi di macchine supportati

I seguenti tipi di macchine supportano l'ora esatta:

Sistemi operativi supportati

I seguenti sistemi operativi supportano l'ora esatta:

Sistema operativo Versioni 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 esatta:

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 accurata dell'ora

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

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

Una volta completate entrambe le attività, la sincronizzazione accurata dell'ora viene configurata per le VM nel tuo progetto.

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

Configura chrony per utilizzare ptp-kvm

Per configurare chrony in modo che utilizzi ptp-kvm come origine temporale, esegui il seguente script all'interno di ciascuna VM del progetto Google Cloud :

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

Configura Google Cloud Ops Agent sulla tua VM

Per configurare Google Cloud Ops Agent per la raccolta e l'analisi dei dati, esegui il seguente script all'interno di ciascuna VM del tuo Google Cloud 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 tuo progetto Google Cloud, esegui lo script di configurazione di logging e dashboard per il tuo progettoGoogle Cloud . Questo script ti aiuta a completare le seguenti attività per il tuo progetto Google Cloud :

  • Imposta le autorizzazioni appropriate per il account di servizio associato al progetto Google Cloud della VM.
  • Crea una metrica basata sui log che chrony utilizza per garantire l'accuratezza tra gli orologi della VM e del relativo server host.
  • Crea una dashboard che misura la tracciabilità dell'orologio della VM rispetto al fuso orario UTC combinando le seguenti metriche:

Per completare le attività precedenti, esegui lo script seguente:

#!/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 di precisione dell'orologio per le VM del tuo progetto.

Passaggi successivi