Configurar la hora correcta en máquinas virtuales de Compute Engine

Muchos sistemas de software que dependen de una secuenciación cuidadosa de los eventos se basan en un reloj del sistema estable y coherente, y usan registros del sistema con marcas de tiempo para asegurar la sincronización de la hora y depurar los problemas a medida que se producen. Para mantener sincronizados los relojes del sistema, las instancias de máquina virtual (VM) de Compute Engine están preconfiguradas para usar el protocolo de tiempo de red (NTP), una solución combinada de hardware y software de sincronización de tiempo. Si es importante para tus objetivos que la sincronización de la hora sea precisa y que se monitorice su precisión, puedes configurar hora precisa en lugar de NTP para sincronizar el reloj de tu VM con el del host mediante chrony y ptp_kvm. Esta configuración se ha diseñado para conseguir una precisión de 1 ms en las configuraciones admitidas.

Tipos de máquinas admitidos

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

Sistemas operativos compatibles

Los siguientes sistemas operativos admiten la hora exacta:

SO Versiones Imágenes
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 - 6, 7 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, Norteamérica)
us-east1-c Moncks Corner (Carolina del Sur, Norteamérica)
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)

Configurar una sincronización de hora precisa

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

  • Configura chrony para que use ptp-kvm como fuente de tiempo.
  • Configura Google Cloud el agente de operaciones para recoger y analizar datos.

Una vez que hayas completado ambas tareas, se configurará la sincronización de la hora precisa para las VMs de tu proyecto.

Para ver un ejemplo de secuencia de comandos 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 VMs en GitHub.

Configurar chrony para usar ptp-kvm

Para configurar chrony de forma que use ptp-kvm como fuente de tiempo, ejecuta la siguiente secuencia de comandos en cada una de las máquinas virtuales de tu proyecto 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

Configurar el Google Cloud agente de operaciones en tu VM

Para configurar el Google Cloud agente de operaciones para la recogida y el análisis de datos, ejecuta el siguiente script en cada una de las máquinas virtuales de tu Google Cloud proyecto:

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

Configurar la monitorización de la sincronización de la hora

Para configurar la monitorización de la sincronización de la hora de las VMs de tu proyecto Google Cloud, ejecuta la secuencia de comandos de configuración de registros y del panel de control de tu proyectoGoogle Cloud . Este script te ayuda a completar las siguientes tareas de tu proyecto Google Cloud :

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

Para completar 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 se haya completado la ejecución de la secuencia de comandos, usa el panel de control que ha creado para ver los datos de precisión del reloj de las VMs de tu proyecto.

Siguientes pasos