서버 시간 동기화: 제발 21세기엔 rdate 쓰지 말자

한줄 요약: 시간 동기화는 간단하지 않다.

최소한 NTP 프로토콜 사용

이 글을 쓰는 이유는… 2020년 12월 현 시점에서 rdate(와 cron)로 시간 동기화 하겠다는 충격적인 블로그 글을 봐서…

결론부터 말하면 NTP 프로토콜 지원하는 프로그램으로 동기화 하자.

시간 보정 방법

step: 즉시 시간 보정

slew: 시계 회전 속도를 조절하여 시간 보정. 단조증가 시계 Monotonic clock.

시간 동기화 프로토콜 종류

Time Server udp/37 rdate 등이 사용하는 시간 서비스. 정확하지도 않고 개인 시스템이더라도 쓰지 말자…

NTP udp/123 시간 동기화 표준 프로토콜, 윈도, 리눅스 동일

SNTP udp/123 NTP의 서브셋, NTP와 동일 포트 사용. 1-50ms 정도의 정확도

PTP Precision Time Protocol, NTP보다 더 정밀한 프로토콜. chrony 에서 미지원, 지원 계획 없음. 참고#1, 참고#2

  • 과학, 금융 수준에서 사용… 커널과 하드웨어가 지원되어야 사용 가능.

NTS Network Time Security for the Network Time Protocol. chrony 4.0 부터 지원.

시간동기화 프로그램

rdate udp/37 사용, xinetd 등에서 사용하는 단순 시간 변경 툴. 쓰면 안된다. step 방식으로만 보정하기 때문.
systemd-timesyncd systemd에서 사용하는 시간 동기화 데몬. SNTP 구현체인데 구현이 약간 다름. 오차 100 ms 정도 된다고.

ntpd NTP 구현체 CentOS 6까지 기본 시간 동기화 데몬.
chrony ntpd보다 개선된 구현체. 보안면에서 가장 좋다는 평가. CentOS 7부터 기본 시간 동기화 데몬. NTP 구현체 비교
w32tm 윈도 시간동기화 툴. Windows Server 메뉴얼을 보면 알겠지만… 정확도가 2016에서야 좋아졌다(아래 이미지 참조)

rdate와 ntp(chrony)의 차이점

  • rdate 실행 시 서버쪽 시간을 바로 적용. 시간 서버 – 클라이언트 60초의 오차가 있을 때 60초를 즉시 건너 뛴다.
    그래서 시간이 빠른 장비의 시간 보정을 rdate로 하면 (장비 관점에서)시간이 과거로 돌아가는 문제가 있음 -> DB의 경우 과거 시간으로 데이터가 쌓이면 DB 테이블이 깨질 수 있음.
  • ntpd(chrony)는 오차 시간을 빠르게 혹은 느리게 시간을 돌려서 맞춰(slewing) rdate와 같은 문제 발생하지 않음.
    • 시간 오차가 너무 클 때는 NTP 구현체도 step 방식으로 시간 보정.

시간

1초. 1초의 정의가 지속적으로 바뀌었음. https://ko.wikipedia.org/wiki/%EC%B4%88_(%EC%8B%9C%EA%B0%84)#cite_note-1

  • 지구 자전(하루)에 의한 평균 태양일의 1/86,400 으로 정의
    • 지구의 자전이 불규칙함. 계속 느려지고 있으며, 큰 지진에도 영향 받아 정확도 보장이 안됨.
      • 2021-01-09 지구 자전이 빨라져서 역윤초(음의 윤초) 적용 검토 필요할 수 있다는 뉴스.
      • 지구 온난화로 빙하가 녹아 지구 질량 재분배가 발생한게 아닐까 하는 연구결과가 2015년 경에 있었음.
  • 1956년, 1900년 1월 0일 12시 기준 태양년의 1/31556925.9747, 자전에서 공전으로 기준 변경
  • 1967년, 원자 시계 발명 되어 세슘-133 원자의 1초간 진동 수 (보조적으로 루비듐 원자)

그 외 시간 관련해 알면 좋은 것

  • 2020년 현재까지 가장 정밀한 시간(초) 측정 장치는 ‘광격자 시계(or 광시계)’.
    • 가장 정밀하지만 아직 표준 시간 기준으로 채택되어 사용 중은 아닌 듯.
  • 고도에 따라 시간이 다르게 흐름(중력 영향 차이 발생하기 때문)
  • 윤초(Leap second): 원자시계와 태양시간의 오차 보정하기 위함
  • UTC 세계 협정시, KST는 UTC +9h
  • epoch

IT 인프라의 시간 동기화

인증 시스템이나 클러스터에서 모든 기준은 시간이 되기 때문에 각 시스템간 시간 차이가 발생하면 신뢰할 기준이 없어지는 상황이 된다. 그렇다면 시간 오차를 모든 단위에서 ‘0’로 할 수 있는가?

시간 오차 제로: 매우 어렵다… 물리적으로 불가능. NTP 가 실제 네트워크에서 잘 동작한다고 보장할 수 있는 사람/단체는 아무도 없음. 다만 같은 서비스 그룹끼리 비슷한 시간 유지하여 서비스 데몬에서 로그가 뒤섞이지 않는 정밀도를 목표로 해야. NTP 프로토콜은 어디까지나 네 가지 시간을 조합, 추정하여 오차 보정하여 적용하는 것이지 오차를 ‘0’으로 해주는 프로토콜이 아니다.

메인보드와 OS시간: 메인보드가 UTC를 쓰는가, KST를 쓰는가? 보드에서 이미 KST를 쓰는데 OS에서 추가로 +9 하는 경우가 있음.

Linux 에서 윤초 해결: Timezone 패키지(tzdata) 수시로 업데이트 해야함.

chrony 의 원격지 chrony 관리: authhash 명령 실행해보면 ‘Authentication is no longer supported in the command protocol.’ 라고 뜨는데, chrony 2.2 에서 보안 문제로 제거된 기능이라고… CentOS 6 에 설치되는 chrony 는 2.1이라 사용 가능하지만 CentOS 7만 돼도 버전이 더 높아서 원격지 chrony 관리는 못함.


관련링크

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-configuring_ntp_using_the_chrony_suite#sect-Using_chrony
https://ubuntu.com/server/docs/network-ntp
http://time.ewha.or.kr/

2020년 결산

북마크 정리

웹브라우저 Firefox 의 북마크를 정리.

Firefox 로 이름 바뀌기 전의 Firebird 0.5 (DB Firebird의 항의를 받아 이름을 Firefox로 바꿨다) 부터 북마크 위주로 사용해서 SNS 활성화 되기 전 북마크가 많은데, 개인 블로그는 싹 다 전멸 수준… 블로그 서비스 종료도 많지만 글을 숨김 처리 하거나 잠궈버리는 경우가 많았다.

왜 그럴까 생각해보니 한국 인터넷 들어올 때 사람들이 직장인은 아니었을거고 대부분 학생이었을테고, 스스로 열심히 흑역사 적립하다 취업 하고 보니 SNS 스크리닝 하거나 계정명으로 검색하는 세태를 보고 화들짝 해서 과거 정리한게 아닌가 싶다.

개인 블로그는 그렇다 치고 언론사 기사 괜찮은 것들을 북마크 해놓았는데 퍼머링크(permalink)가 없는건지 역시 대부분 열 수가 없었다. 그나마 외국 사이트들은 한국 사이트 대비 잘 열리는 편.

자산

노동 소득 외 부수입 전무… 미국 주식도 싹 다 팔았고 내년 세금 낼꺼 안 까먹고 있어야 현금 빵꾸 안날거 같다. 주식 다 정리하고 나니까 전세계 주식이 급발진. 배가 … 아프다…

미디어 감상

웹툰은 지옥사원 외에 보는게 없고, 넷플릭스나 유튜브 보는거 말고 특별히 하는게 없다. 게임은 크루세이더 킹즈3 출시 직후에 좀 하다 확장팩 나올만큼 나온 크킹2보다 뭔가 심심하게 느껴 도로 크킹2 플레이. 게임 중 올해 가장 많이 플레이 했을듯.

넷플릭스는 드라마는 빌리언즈, 퀸즈 갬빗… 영화는 블레이드 러너 2049… 정도 기억나고 연초엔 뭐 봤는지 모르겠다.

유튜브는 12월에 유퀴즈 정주행을 계속 뿌리는거 주말 내내 봄. 시민들 인터뷰 내용이 재미있다.

먹기

쿠팡, 쿠팡잇츠, 마켓컬리로 먹다보니 매주 종이 박스 버리느라 정신없다. 코로나 초기 종이박스 회사 주식 많이 올랐던데 배달 시켜먹는걸로 생활 습관 바꾸면서 주식은 살 생각은 못함.

WSL2 에서 minikube 로 k8s 사용

결론: minikube 는 WSL 내부의 리눅스 바이너리로 실행하면 안됨, 윈도우에 minikube.exe 설치해놓고 사용해야 함.

윈도용 docker 설치 / 윈도용 minikube 설치 / WSL 머신

minikube.exe 경로 확인하여 WSL 내에서 실행 가능하도록 설정(WSL는 윈도 바이너리 실행 된다…). 내 경우 ‘/c/Program Files/Kubernetes/Minikube/minikube’ 경로였으며 WSL 에서 실행하기 위해 .bashrc 에 아래와 같이 설정했다.

export PATH="$HOME/minikube:$PATH"
export DOCKER_CERT_PATH=/mnt/c/Users/사용자명/.minikube/certs

cat ~/minikube/minikube

#!/bin/sh
/mnt/c/Program\ Files/Kubernetes/Minikube/minikube.exe $@

minikube start 해보면 인증서 경로를 못 찾는 다는 내용이 다수 발생..

cat ~/.kube/config 파일에 윈도쪽에 있는 인증서 경로를 넣어주면 됨.

apiVersion: v1
clusters:
- cluster:
certificate-authority: /mnt/c/Users/jelly/.minikube/ca.crt
server: https://192.168.49.2:8443
name: minikube
contexts:
- context:
cluster: minikube
namespace: default
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
user:
client-certificate: /mnt/c/Users/jelly/.minikube/profiles/minikube/client.crt
client-key: /mnt/c/Users/jelly/.minikube/profiles/minikube/client.key

참고문서

https://medium.com/@joaoh82/setting-up-kubernetes-on-wsl-to-work-with-minikube-on-windows-10-90dac3c72fa1