Airgapped 환경에서 클러스터 시간 동기화 방법

2–3분

클러스터 시스템을 구축할 때, 예를 들어 Kubernetes(K8s)나 OpenStack 같은 환경에서는 모든 노드 간 시간이 정확히 일치해야 합니다. 그렇지 않으면 다음과 같은 문제가 발생할 수 있습니다:

  • kubelet이나 etcd에서 인증 오류 (x509 에러 등)
  • 노드가 정상적으로 Join 되더라도 지속적으로 연결이 끊김
  • OpenStack에서 서비스 간 토큰 유효 시간 문제 발생
  • 로그 분석, 트러블슈팅 시 시간 불일치로 인해 원인 추적 실패

특히 에어갭(Air-gapped) 환경에서는 외부 시간 서버에 접근할 수 없기 때문에, 내부에 시간 서버를 구성하고 모든 노드가 해당 서버와 동기화되도록 구성하는 작업이 필수입니다.

이 글에서는 chrony를 사용해 에어갭 환경에서 내부 시간 동기화 시스템을 구성하는 방법을 소개합니다.


✅ chrony란?

  • chronyntpd를 대체하는 NTP 클라이언트/서버입니다.
  • RedHat 8 이후부터 기본 NTP 서비스로 채택되었습니다.
  • 빠른 초기 동기화, 낮은 지연 시간 등에서 ntpd보다 성능이 뛰어납니다.
  • chronydntpd는 동시에 실행되면 안 됩니다.

🔧 구성 시나리오

chrony-server의 시스템 시간이 기준이며, 클라이언트는 chrony를 통해 chrony-server로부터 시간을 받습니다.


1️⃣ 시간 서버 노드 준비: 하드웨어 시간 기준 동기화

에어갭 환경에서는 외부 시간 서버가 없기 때문에, **서버 노드의 RTC(하드웨어 시계)**를 수동으로 정확히 설정해야 합니다.

# 현재 하드웨어 시간 확인
hwclock --show

# 시스템 시간 설정 (예시)
timedatectl set-time "2025-05-10 12:00:00"

# 시스템 시간을 하드웨어 시계에 저장
hwclock --systohc


이 노드가 클러스터 전체의 시간 기준이 되므로, 최대한 정확하게 맞춰야 합니다.


2️⃣ 서버에 chrony 설정 (/etc/chrony.conf)

# 외부 시간 서버 사용 안 함
local stratum 3

# 내부 클라이언트 접근 허용
allow 192.168.0.0/16

# 로그 (선택)
log tracking measurements statistics
logdir /var/log/chrony


systemctl enable chronyd --now


3️⃣ 클라이언트 노드 설정 (/etc/chrony.conf)

# NTP 서버로 설정한 내부 서버 IP
server 192.168.0.10 iburst

# 로그 (선택)
log tracking measurements statistics
logdir /var/log/chrony

systemctl restart chronyd

iburst는 빠른 초기 동기화를 위해 사용합니다.


4️⃣ 동기화 상태 확인

timedatectl 를 통해 시간 동기화 확인

timedatectl

  • System clock synchronized: yes → 동기화 성공
  • NTP service: active → chronyd 실행 중
chronyc sources -v

예시:

MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.0.10                 3   6     7     0    +12us[  +44ms] +/-   51ms


  • ^* → 현재 사용 중인 서버
  • ^?, ^~ → 동기화 안 된 상태

⚠️ 클러스터 구성 시 시간 동기화가 중요한 이유

  • Kubernetes의 kubeletetcd는 TLS 인증서와 토큰에 시간 기반 검증을 수행합니다.
  • 시간이 어긋나면 x509: certificate has expired 오류 발생
  • OpenStack에서도 Keystone 토큰, 서비스 간 API 통신에서 시간 차이로 오류 발생
  • 노드가 Join은 되지만 지속적인 오류, 비정상 상태에 빠지기도 함
  • 로그와 이벤트 시간 차이로 디버깅이 어려워짐

✅ 정리

역할설정 요점
시간 서버hwclock --systohc, local stratum 3, allow [IP대역]
클라이언트server [서버IP] iburst
확인timedatectl, chronyc sources -v
적용systemctl restart chronyd

📌 마무리

에어갭 환경에서도 시간은 가장 기본이자 핵심 인프라입니다.

시간이 어긋난 클러스터는, 겉보기엔 작동하더라도 내부적으로 언제든 오류를 일으킬 수 있습니다.

chrony를 활용해 신뢰할 수 있는 내부 시간 서버를 구성하고, 모든 노드가 정확하게 동기화되도록 구성하세요.

✅ 클러스터 구성 전, 시간 동기화부터 체크하세요. 나중에 뒤늦게 문제 생기는 경우가 많습니다.