Compute Engine VM의 정확한 시간 구성

이벤트의 세밀한 시퀀싱에 의존하는 많은 소프트웨어 시스템에서는 안정적이고 일관된 시스템 시계를 사용하며, 타임스탬프가 있는 시스템 로그를 사용하여 시간 동기화를 보장하고 문제가 발생할 때 디버그합니다. 시스템 시계가 동기화 상태를 유지할 수 있도록 Compute Engine 가상 머신 (VM) 인스턴스는 시간 동기화 하드웨어 및 소프트웨어의 번들 솔루션인 네트워크 시간 프로토콜 (NTP)을 사용하도록 사전 구성됩니다. 정확한 시간 동기화와 시간 동기화 정확도 모니터링이 목표에 중요한 경우 NTP 대신 정확한 시간을 구성하여 chronyptp_kvm를 사용하여 VM의 시계를 호스트 시계와 동기화할 수 있습니다. 이 구성은 지원되는 설정에서 1ms 이내의 정확도를 달성하도록 설계되었습니다.

지원되는 머신 유형

다음 머신 유형은 정확한 시간을 지원합니다.

지원되는 운영체제

다음 운영체제 (OS)는 정확한 시간을 지원합니다.

OS 버전 이미지
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

지원되는 영역

다음 영역은 정확한 시간을 지원합니다.

영역 위치
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 북미 유타 솔트레이크시티

정확한 시간 동기화 구성

프로젝트의 VM에 대해 정확한 시간 동기화를 구성하려면 각 VM에 대해 다음 작업을 완료하세요.

  • ptp-kvm를 시간 소스로 사용하도록 chrony를 구성합니다.
  • 데이터 수집 및 분석을 위해 Google Cloud 운영 에이전트를 구성합니다.

두 작업을 모두 완료하면 프로젝트의 VM에 정확한 시간 동기화가 설정됩니다.

VM을 만들고 정확한 시간 동기화를 구성하는 두 작업을 모두 완료하는 샘플 스크립트는 GitHub의 VM 생성 스크립트를 참고하세요.

ptp-kvm를 사용하도록 chrony 구성

ptp-kvm을 시간 소스로 사용하도록 chrony을 구성하려면 각 Google Cloud 프로젝트의 VM 내에서 다음 스크립트를 실행하세요.

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

VM에서 Google Cloud 운영 에이전트 구성

데이터 수집 및 분석을 위해 Google Cloud 운영 에이전트를 구성하려면 각 Google Cloud 프로젝트의 VM 내에서 다음 스크립트를 실행하세요.

#!/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프로젝트의 VM에 시간 동기화 모니터링을 구성하려면Google Cloud 프로젝트의 로깅 및 대시보드 설정 스크립트를 실행하세요. 이 스크립트는 Google Cloud 프로젝트에 대해 다음 작업을 완료하는 데 도움이 됩니다.

  • VM의 Google Cloud 프로젝트와 연결된 서비스 계정에 적절한 권한을 설정합니다.
  • VM과 호스트 서버의 시계 간 정확성을 보장하는 데 chrony 사용하는 로그 기반 측정항목을 만듭니다.
  • 다음 측정항목을 결합하여 VM 시계의 UTC 추적 가능성을 측정하는 대시보드를 만듭니다.

앞의 작업을 완료하려면 다음 스크립트를 실행합니다.

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

스크립트 실행이 완료되면 스크립트에서 만든 대시보드를 사용하여 프로젝트 VM의 시계 정확도 데이터를 확인합니다.

다음 단계