Configura la hora exacta para las VMs de Compute Engine

Muchos sistemas de software que dependen de una secuencia de eventos cuidadosa usan un reloj de sistema estable y coherente, y registran los eventos con marcas de tiempo para garantizar la sincronización del tiempo y depurar los problemas a medida que ocurren. Para ayudar a mantener sincronizados los relojes del sistema, las instancias de máquina virtual (VM) de Compute Engine se configuran con anterioridad para usar el protocolo de tiempo de red (NTP), una solución integrada de hardware y software de sincronización de tiempo. Si garantizar la sincronización precisa de la hora y supervisar la precisión de la sincronización de la hora son importantes para tus objetivos, puedes configurar hora precisa en lugar de NTP para sincronizar el reloj de tu VM con el reloj del host usando chrony y ptp_kvm. Esta configuración está diseñada para lograr una precisión de 1 ms en las configuraciones compatibles.

Tipos de máquina admitidos

Los siguientes tipos de máquinas admiten la hora precisa:

Sistemas operativos compatibles

Los siguientes sistemas operativos (SO) admiten la hora precisa:

SO Versiones Imágenes
CentOS Stream 9 centos-stream-9
Container-Optimized OS LTS de COS 105, LTS de COS 109, LTS de COS 113 y LTS de COS 117 cos-105-lts, cos-109-lts, cos-113-lts, cos-117-lts
Debian 11 (Bullseye) y 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

Zonas admitidas

Las siguientes zonas admiten la hora exacta:

Zona Ubicación
europe-west1-b Saint-Ghislain, Bélgica, Europa
europe-west1-c Saint-Ghislain, Bélgica, Europa
europe-west2-b Londres, Inglaterra, Europa
europe-west3-a Fráncfort, Alemania, Europa
us-central1-a Council Bluffs, Iowa, Norteamérica
us-central1-b Council Bluffs, Iowa, Norteamérica
us-central1-c Council Bluffs, Iowa, Norteamérica
us-central1-f Council Bluffs, Iowa, Norteamérica
us-east1-b Moncks Corner, Carolina del Sur, América del Norte
us-east1-c Moncks Corner, Carolina del Sur, América del Norte
us-east4-c Ashburn, Virginia, Norteamérica
us-east5-a Columbus, Ohio, Norteamérica
us-south1-a Dallas, Texas, Norteamérica
us-west1-b The Dalles, Oregón, Norteamérica
us-west2-a Los Ángeles, California, Norteamérica
us-west3-a Salt Lake City, Utah, Norteamérica

Configura una sincronización de hora precisa

Para configurar una sincronización de hora precisa para las VMs de tu proyecto, completa las siguientes tareas para cada VM:

  • Configura chrony para usar ptp-kvm como su fuente de tiempo.
  • Configura el Google Cloud agente de operaciones para la recopilación y el análisis de datos.

Después de completar ambas tareas, se configurará la sincronización de hora precisa para las VMs de tu proyecto.

Para ver una secuencia de comandos de muestra que crea una VM y completa ambas tareas para configurar una sincronización de hora precisa, consulta la secuencia de comandos de creación de VM en GitHub.

Configura chrony para que use ptp-kvm

Para configurar chrony de modo que use ptp-kvm como su fuente de tiempo, ejecuta la siguiente secuencia de comandos dentro de cada una de las VMs de tu proyecto de 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 el Google Cloud Agente de operaciones en tu VM

Para configurar Google Cloud el agente de operaciones para la recopilación y el análisis de datos, ejecuta la siguiente secuencia de comandos dentro de cada una de las VMs de tu proyecto 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

Configura la supervisión de la sincronización de hora

Para configurar la supervisión de la sincronización de hora de las VMs de tu proyecto de Google Cloud, ejecuta la secuencia de comandos de configuración del registro y el panel para tu proyecto deGoogle Cloud . Esta secuencia de comandos te ayuda a completar las siguientes tareas para tu proyecto de Google Cloud :

  • Establece los permisos adecuados en la cuenta de servicio asociada con el proyecto de tu VM. Google Cloud
  • Crea una métrica basada en registros que chrony usa para garantizar la precisión entre los relojes de la VM y su servidor host.
  • Crea un panel que mide la trazabilidad del reloj de la VM con respecto al UTC combinando las siguientes métricas:
    • La precisión del reloj del host de la VM en relación con la hora UTC, que está disponible como una métrica deGoogle Cloud , instance/clock_accuracy/ptp_kvm/nanosecond_accuracy.
    • Las métricas de chrony que miden la precisión del reloj de la VM en relación con el reloj de su host.

Para realizar las tareas anteriores, ejecuta la siguiente secuencia de comandos:

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

Una vez que finalice la ejecución de la secuencia de comandos, usa el panel que creó para ver los datos de precisión del reloj de las VMs de tu proyecto.

¿Qué sigue?