티스토리 뷰

쿠버네티스 타임존은 기본적으로 UTC로 동작하며 이를 변경할수 없음

파드 내부의 타임존은 timezone파일을 마운트 하여 맞출수 있지만 크론탭의 경우 불가능함

일반적인 사용에는 -9해서 만들면 되니까 큰 문제가 없는데

 

만약 매달 1일 05시에 도는 잡이라면 문제가 발생

 

 
 
30 8 1 * * /usr/bin/bash test3
0 5 1 * * /usr/bin/bash  test1
0 6 1 * * /usr/bin/bash  test

 

이게 왜 문제냐면 위 시간은 UTC라 KST로 조정하면 1일이 아니고 매달 말일임

 

매달 말일의 경우 크론탭으로는 설정이 불가능(28일,30일,31일 등 여러가지 조건이 있으므로)

 

해서 일반적으로 크론탭에서는 아래와 같은 방법을 쓰는데

 

 
30 23 28-31 * * [ $(date +\%d -d tomorrow) = 02 ] && /usr/bin/bash test
 

위와같이 설정하면 매달 28~31일날(UTC기준) 실행되는데 다음날이 2일(KST기준)인 경우에만 실행 한다(원래는 1일이나 파드내부는 KST 크론잡 타임은 UTC이므로 위와같이 설정해야함) 외 내부 타임존이 다르기때문에 계산하는것도 두번해야하고 관리도 번거로움

이렇게 적용을 하려다가 크론잡 doc을 보니 1.25부터 크론잡 타임존이 베타로 승격됨

 

타임 존

크론잡에 타임 존이 명시되어 있지 않으면, kube-controller-manager는 로컬 타임 존을 기준으로 스케줄을 해석한다.

기능 상태: Kubernetes v1.25 [beta]

CronJobTimeZone 기능 게이트를 활성화하면, 크론잡에 대해 타임 존을 명시할 수 있다(기능 게이트를 활성화하지 않거나, 타임 존에 대한 실험적 지원을 제공하지 않는 쿠버네티스 버전을 사용 중인 경우, 클러스터의 모든 크론잡은 타임 존이 명시되지 않은 것으로 동작한다).

이 기능을 활성화하면, spec.timeZone을 유효한 타임 존으로 지정할 수 있다. 예를 들어, spec.timeZone: "Etc/UTC"와 같이 설정하면 쿠버네티스는 협정 세계시를 기준으로 스케줄을 해석한다.

Go 표준 라이브러리의 타임 존 데이터베이스가 바이너리로 인클루드되며, 시스템에서 외부 데이터베이스를 사용할 수 없을 때 폴백(fallback)으로 사용된다

 

아래와 같이 설정

 

 
spec:
  schedule: "30 8 1 * *"
  successfulJobsHistoryLimit: 1
  timeZone: 'Asia/Seoul'

굳이 -9 계산안해도 편하게 타임존 설정가능

 

쿠버네티스 기본 기조자체가 UTC를 써라 tz관련된 그 어떤 피쳐도 없다 였는데

 

크론잡의 경우 위같은 문제가 워낙 많아 최근에 생긴듯

 

위와같이 모든 잡에 적용 했으며 매일 6~9시 사이 도는 잡이 있으니 익일 KST기준으로 잘 도는지 체크

 

기존잡에 timezone만 추가해서 그런지 정상적으로 적용이 되지 않았음(09시 도는 잡이 18시에 돔)

전체 잡을 삭제하고 다시 적용했고

 
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Wed, 26 Jul 2023 09:05:01 +0900
      Finished:     Wed, 26 Jul 2023 09:05:01 +0900

 

정상적으로 KST 09시에 돔

 

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함