Configurer une heure précise pour les VM Compute Engine

De nombreux systèmes logiciels qui dépendent d'un séquençage minutieux des événements reposent sur une horloge système stable et cohérente. Ils utilisent des journaux système avec des horodatages pour assurer la synchronisation horaire et résoudre les problèmes au fur et à mesure qu'ils se produisent. Pour que les horloges système restent synchronisées, les instances de machine virtuelle (VM) Compute Engine sont préconfigurées pour utiliser le protocole NTP (Network Time Protocol), une solution groupée de matériel et de logiciels de synchronisation horaire. Si la synchronisation horaire précise et la surveillance de sa précision sont importantes pour atteindre vos objectifs, vous pouvez configurer l'heure précise au lieu du protocole NTP pour synchroniser l'horloge de votre VM avec l'horloge hôte à l'aide de chrony et ptp_kvm. Cette configuration est conçue pour atteindre une précision de 1 ms dans les configurations compatibles.

Types de machines compatibles

Les types de machines suivants sont compatibles avec l'heure précise :

Systèmes d'exploitation compatibles

Les systèmes d'exploitation suivants sont compatibles avec l'heure précise :

OS Versions Images
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

Zones compatibles

Les zones suivantes sont compatibles avec l'heure précise :

Zone Emplacement
europe-west1-b Saint-Ghislain, Belgique, Europe
europe-west1-c Saint-Ghislain, Belgique, Europe
europe-west2-b Londres, Angleterre, Europe
europe-west3-a Francfort, Allemagne, Europe
us-central1-a Council Bluffs, Iowa, Amérique du Nord
us-central1-b Council Bluffs, Iowa, Amérique du Nord
us-central1-c Council Bluffs, Iowa, Amérique du Nord
us-central1-f Council Bluffs, Iowa, Amérique du Nord
us-east1-b Moncks Corner, Caroline du Sud, Amérique du Nord
us-east1-c Moncks Corner, Caroline du Sud, Amérique du Nord
us-east4-c Ashburn, Virginie, Amérique du Nord
us-east5-a Columbus, Ohio, Amérique du Nord
us-south1-a Dallas, Texas, Amérique du Nord
us-west1-b The Dalles, Oregon, Amérique du Nord
us-west2-a Los Angeles, Californie, Amérique du Nord
us-west3-a Salt Lake City, Utah, Amérique du Nord

Configurer la synchronisation horaire précise

Pour configurer la synchronisation horaire précise pour les VM de votre projet, effectuez les tâches suivantes pour chaque VM :

  • Configurez chrony pour qu'il utilise ptp-kvm comme source de temps.
  • Configurez l'agent Google Cloud Ops pour la collecte et l'analyse des données.

Une fois les deux tâches effectuées, la synchronisation horaire précise est configurée pour les VM de votre projet.

Pour obtenir un exemple de script qui crée une VM et effectue les deux tâches pour configurer la synchronisation horaire précise, consultez le script de création de VM sur GitHub.

Configurer chrony pour qu'il utilise ptp-kvm

Pour configurer chrony afin qu'il utilise ptp-kvm comme source de temps, exécutez le script suivant dans chacune des VM de votre Google Cloud projet :

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

Configurer Google Cloud l'agent Ops sur votre VM

Pour configurer Google Cloud l'agent Ops pour la collecte et l'analyse des données, exécutez le script suivant dans chacune des VM de votre Google Cloud projet :

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

Configurer la surveillance de la synchronisation horaire

Pour configurer la surveillance de la synchronisation horaire pour les Google Cloud VM de votre projet, exécutez le script de configuration de la journalisation et du tableau de bord pour votre Google Cloud projet. Ce script vous aide à effectuer les tâches suivantes pour votre Google Cloud projet :

  • Il définit les autorisations appropriées sur le compte de service associé au projet Google Cloud de vos VM.
  • Il crée une métrique basée sur les journaux que chrony utilise pour garantir la précision entre les horloges de la VM et de son serveur hôte.
  • Il crée un tableau de bord mesurant la traçabilité de l'horloge de la VM par rapport à l'UTC en combinant les métriques suivantes :
    • La précision de l'horloge hôte de la VM par rapport à l'UTC, disponible en tant que Google Cloud métrique, instance/clock_accuracy/ptp_kvm/nanosecond_accuracy.
    • Les métriques chrony mesurant la précision de l'horloge de la VM par rapport à l'horloge de son hôte.

Pour effectuer les tâches précédentes, exécutez le script suivant :

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

Une fois le script exécuté, utilisez le tableau de bord qu'il a créé pour afficher les données de précision de l'horloge des VM de votre projet.

Étape suivante