הגדרת זמן מדויק למכונות וירטואליות ב-Compute Engine

הרבה מערכות תוכנה שמסתמכות על רצף מדויק של אירועים נשענות על שעון מערכת יציב ועקבי. הן משתמשות ביומני מערכת עם חותמות זמן כדי לוודא שהזמן מסונכרן ולפתור בעיות בזמן שהן מתרחשות. כדי לשמור על סנכרון של שעוני המערכת, מכונות וירטואליות (VM) של Compute Engine מוגדרות מראש לשימוש בפרוטוקול זמן ברשת (NTP), פתרון משולב של חומרה ותוכנה לסנכרון זמן. אם חשוב לכם להבטיח סנכרון מדויק של השעה ולעקוב אחרי הדיוק של סנכרון השעה, אתם יכולים להגדיר שעה מדויקת במקום NTP, כדי לסנכרן את השעון של המכונה הווירטואלית עם שעון המארח באמצעות chrony ו-ptp_kvm. התצורה הזו נועדה להשיג דיוק של עד 1 אלפית השנייה בהגדרות נתמכות.

סוגי מכונות נתמכים

סוגי המכונות הבאים תומכים בשעה מדויקת:

מערכות הפעלה נתמכות

מערכות ההפעלה הבאות תומכות בשעה מדויקת:

מערכת הפעלה גרסאות תמונות
‫CentOS Stream 9 centos-stream-9
מערכת הפעלה שמותאמת לקונטיינרים ‫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

אזורים נתמכים

סנכרון מדויק של השעה נתמך בכל Google Cloud האזורים והאזורים הציבוריים הרגילים עבור סוגי מכונות ומערכות הפעלה נתמכים.

הגדרת סנכרון מדויק של השעה

כדי להגדיר סנכרון מדויק של השעה במכונות הווירטואליות של הפרויקט, צריך לבצע את המשימות הבאות לכל מכונה וירטואלית:

  • מגדירים את chrony כך שישתמש ב-ptp-kvm כמקור הזמן שלו.
  • מגדירים את Google Cloud Ops Agent לאיסוף ולניתוח נתונים.

אחרי שתסיימו את שתי המשימות, תוגדר סנכרון מדויק של הזמן במכונות הווירטואליות בפרויקט.

ב-GitHub אפשר לראות סקריפט לדוגמה שיוצר מכונת VM ומשלים את שתי המשימות כדי להגדיר סנכרון מדויק של השעה.

הגדרה של chrony לשימוש ב-ptp-kvm

כדי להגדיר את chrony כך שישתמש ב-ptp-kvm כמקור הזמן שלו, מריצים את הסקריפט הבא בכל אחת מהמכונות הווירטואליות של פרויקט 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 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

הגדרת Google Cloud סוכן תפעול במכונה הווירטואלית

כדי להגדיר את Google Cloud Ops Agent לאיסוף ולניתוח נתונים, מריצים את הסקריפט הבא בכל מכונה וירטואלית של 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

הגדרת מעקב אחר סנכרון הזמן

כדי להגדיר מעקב אחר סנכרון הזמן במכונות ה-VM של פרויקט Google Cloud, מריצים את הסקריפט להגדרת ה-Logging ולוח הבקרה של פרויקטGoogle Cloud . הסקריפט הזה עוזר לכם לבצע את המשימות הבאות בפרויקט Google Cloud :

  • הוא מגדיר הרשאות מתאימות בחשבון השירות שמשויך לפרויקט של מכונת ה-VM Google Cloud .
  • הכלי יוצר מדד מבוסס-יומן שמשמש chrony כדי לוודא ש השעונים במכונה הווירטואלית ובשרת המארח שלה מסונכרנים.
  • נוצר לוח בקרה למדידת יכולת המעקב של השעון במכונה הווירטואלית לפי UTC, על ידי שילוב של המדדים הבאים:
    • הדיוק של השעון במארח של המכונה הווירטואלית ביחס ל-UTC, שזמין בתורGoogle Cloud מדד, instance/clock_accuracy/ptp_kvm/nanosecond_accuracy.
    • המדדים chrony מודדים את רמת הדיוק של השעון במכונה הווירטואלית ביחס לשעון במארח.

כדי לבצע את המשימות הקודמות, מריצים את הסקריפט הבא:

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

אחרי שהסקריפט מסיים לפעול, אפשר להשתמש בלוח הבקרה שהוא יצר כדי לראות את נתוני הדיוק של השעון במכונות הווירטואליות של הפרויקט.

המאמרים הבאים