Configure a hora exata para VMs do Compute Engine

Muitos sistemas de software que dependem de uma sequenciação cuidadosa de eventos baseiam-se num relógio do sistema estável e consistente, usando registos do sistema com indicações de tempo para garantir a sincronização de tempo e resolver problemas à medida que ocorrem. Para ajudar a manter os relógios do sistema sincronizados, as instâncias de máquinas virtuais (VM) do Compute Engine estão pré-configuradas para usar o protocolo de tempo de rede (NTP), uma solução integrada de hardware e software de sincronização de tempo. Se garantir uma sincronização de tempo precisa e monitorizar a precisão da sincronização de tempo for importante para os seus objetivos, pode configurar tempo preciso em vez de NTP para sincronizar o relógio da VM com o relógio do anfitrião através de chrony e ptp_kvm. Esta configuração foi concebida para alcançar uma precisão de 1 ms para configurações suportadas.

Tipos de máquinas suportados

Os seguintes tipos de máquinas suportam a hora exata:

Sistemas operativos compatíveis

Os seguintes sistemas operativos (SO) suportam a hora exata:

SO Versões Imagens
CentOS Stream 9 centos-stream-9
SO otimizado para contentores 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 suportadas

As seguintes zonas suportam a hora exata:

Zona Localização
europe-west1-b St. Ghislain, Bélgica, Europa
europe-west1-c St. Ghislain, Bélgica, Europa
europe-west2-b Londres, Inglaterra, Europa
europe-west3-a Frankfurt, Alemanha, Europa
us-central1-a Council Bluffs, Iowa, América do Norte
us-central1-b Council Bluffs, Iowa, América do Norte
us-central1-c Council Bluffs, Iowa, América do Norte
us-central1-f Council Bluffs, Iowa, América do Norte
us-east1-b Moncks Corner, Carolina do Sul, América do Norte
us-east1-c Moncks Corner, Carolina do Sul, América do Norte
us-east4-c Ashburn, Virgínia, América do Norte
us-east5-a Columbus, Ohio, América do Norte
us-south1-a Dallas, Texas, América do Norte
us-west1-b The Dalles, Oregon, América do Norte
us-west2-a Los Angeles, Califórnia, América do Norte
us-west3-a Salt Lake City, Utah, América do Norte

Configure uma sincronização de tempo precisa

Para configurar uma sincronização de tempo precisa para as VMs do seu projeto, conclua as seguintes tarefas para cada VM:

  • Configure o chrony para usar o ptp-kvm como origem de tempo.
  • Configure o Google Cloud agente de operações para a recolha e a análise de dados.

Depois de concluir ambas as tarefas, a sincronização de tempo precisa é configurada para as VMs no seu projeto.

Para ver um script de exemplo que cria uma VM e conclui ambas as tarefas para configurar uma sincronização de tempo precisa, consulte o script de criação de VMs no GitHub.

Configure o chrony para usar o ptp-kvm

Para configurar o chrony para usar o ptp-kvm como origem de tempo, execute o seguinte script nas VMs de cada um dos seus projetos: 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

Configure o Google Cloud agente de operações na sua VM

Para configurar o Google Cloud agente de operações para a recolha e análise de dados, execute o seguinte script nas VMs de cada um dos seus Google Cloud projetos:

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

Configure a monitorização da sincronização de tempo

Para configurar a monitorização da sincronização de tempo para as VMs do seu projeto Google Cloud, execute o script de configuração de registo e painel de controlo para o seu projetoGoogle Cloud . Este script ajuda a concluir as seguintes tarefas para o seu projeto Google Cloud :

  • Define as autorizações adequadas na conta de serviço associada ao projeto da sua VM Google Cloud .
  • Cria uma métrica baseada em registos que o chrony usa para garantir a precisão entre os relógios na VM e no respetivo servidor anfitrião.
  • Cria um painel de controlo que mede a rastreabilidade do relógio da VM para UTC combinando as seguintes métricas:
    • A precisão do relógio do anfitrião da VM em relação à UTC, que está disponível como uma Google Cloud métrica, instance/clock_accuracy/ptp_kvm/nanosecond_accuracy.
    • As métricas chrony que medem a precisão do relógio da VM em relação ao relógio do respetivo anfitrião.

Para realizar as tarefas anteriores, execute o seguinte script:

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

Depois de o script terminar a execução, use o painel de controlo que criou para ver os dados de precisão do relógio das VMs do seu projeto.

O que se segue?