הגדרת זמן מדויק למכונות וירטואליות ב-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

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

באזורים הבאים יש תמיכה בזמן מדויק:

תחום (zone) מיקום
europe-west1-b סנט ג׳יסלאן, בלגיה, אירופה
europe-west1-c סנט ג׳יסלאן, בלגיה, אירופה
europe-west2-b לונדון, אנגליה, אירופה
europe-west3-a פרנקפורט, גרמניה, אירופה
us-central1-a קאונסיל בלאפס, איווה, צפון אמריקה
us-central1-b קאונסיל בלאפס, איווה, צפון אמריקה
us-central1-c קאונסיל בלאפס, איווה, צפון אמריקה
us-central1-f קאונסיל בלאפס, איווה, צפון אמריקה
us-east1-b מונקס קורנר, דרום קרוליינה, צפון אמריקה
us-east1-c מונקס קורנר, דרום קרוליינה, צפון אמריקה
us-east4-c אשבורן, וירג'יניה, צפון אמריקה
us-east5-a קולומבוס, אוהיו, צפון אמריקה
us-south1-a דאלאס, טקסס, צפון אמריקה
us-west1-b דה דיילס, אורגון, צפון אמריקה
us-west2-a לוס אנג'לס, קליפורניה, צפון אמריקה
us-west3-a סולט לייק סיטי, יוטה, צפון אמריקה

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

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

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

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

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

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

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

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

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

  • הוא מגדיר הרשאות מתאימות בחשבון השירות שמשויך לפרויקט של המכונה הווירטואלית Google Cloud .
  • הכלי יוצר מדד מבוסס-יומן שמשמש כדי לוודא שהשעונים במכונה הווירטואלית ובשרת המארח שלה מסונכרנים.chrony
  • נוצר מרכז בקרה למדידת יכולת המעקב של שעון ה-VM אחרי שעון 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

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

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