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, en utilisant des journaux système avec des codes temporels pour assurer la synchronisation temporelle 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 machines virtuelles (VM) Compute Engine sont préconfigurées pour utiliser le protocole NTP (Network Time Protocol), une solution groupée de matériel et de logiciel de synchronisation horaire. Si la synchronisation précise de l'heure et la surveillance de la précision de la synchronisation de l'heure sont importantes pour vos objectifs, vous pouvez configurer l'heure précise au lieu de 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 pour les configurations compatibles.

Types de machines compatibles

Les types de machines suivants sont compatibles avec l'heure exacte :

Systèmes d'exploitation compatibles

Les systèmes d'exploitation suivants sont compatibles avec l'heure exacte :

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 exacte :

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 une synchronisation horaire précise

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

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

Une fois ces deux tâches effectuées, la synchronisation précise de l'heure 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 de configuration d'une synchronisation temporelle précise, consultez le script de création de VM sur GitHub.

Configurer chrony pour utiliser 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 projet 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

Configurer l'agent Ops sur votre VM Google Cloud

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

#!/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 de l'heure pour les VM de votre projet Google Cloud, exécutez le script de configuration de la journalisation et du tableau de bord pour votre projetGoogle Cloud . Ce script vous aide à effectuer les tâches suivantes pour votre projet Google Cloud  :

  • Il définit les autorisations appropriées sur le compte de service associé au projet Google Cloud de votre VM.
  • Il crée une métrique basée sur les journaux que chrony utilise pour assurer la précision entre les horloges de la VM et de son serveur hôte.
  • Il crée un tableau de bord qui mesure la traçabilité de l'horloge de la VM par rapport à l'UTC en combinant les métriques suivantes :
    • Précision de l'horloge de la VM hôte par rapport à l'UTC, disponible en tant que métriqueGoogle Cloud , instance/clock_accuracy/ptp_kvm/nanosecond_accuracy.
    • Métriques chrony mesurant la précision de l'horloge de la VM par rapport à celle 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 sur la précision de l'horloge pour les VM de votre projet.

Étapes suivantes