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 usan registros del sistema con marcas de tiempo para garantizar la sincronización de la hora 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 NTP, una solución integrada de hardware y software de sincronización de hora. Si garantizar la sincronización de la hora precisa y supervisar la exactitud 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 mediante 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 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

Zonas admitidas

Las siguientes zonas admiten la hora precisa:

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

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

Para configurar la supervisión de la 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 hora.
  • Configura el Cloud de Confiance Agente de operacionespara la recopilación de datos y el análisis.

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

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

Configura chrony para usar ptp-kvm

Para configurar chrony para usar ptp-kvm como su fuente de hora, ejecuta la siguiente secuencia de comandos dentro de cada una de las VMs de tu Cloud de Confiance proyecto:

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

Configura el Cloud de Confiance Agente de operacionesen tu VM

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

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

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

  • Establece los permisos adecuados en la cuenta de servicio asociada con el proyecto de tu VM Cloud de Confiance .
  • 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 a UTC combinando las siguientes métricas:
    • La precisión del reloj del host de la VM en UTC, que está disponible como una Cloud de Confiance métrica, 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 se complete 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?