티스토리 뷰
쿠버네티스 타임존은 기본적으로 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시에 돔
'클라우드 > 쿠버네티스' 카테고리의 다른 글
1개의 ALB-Ingress로 여러개의 타켓 사용시 타켓별 설정 하는법 (0) | 2024.01.04 |
---|---|
Cluster Autoscaler에서 0개짜리인 ASG를 스케일아웃 하는법 (0) | 2024.01.04 |
무중단 배포를 위해 필요한 기술들 (0) | 2024.01.04 |
NPD(Node Problem Detector) 활용 (1) | 2024.01.04 |
GitOps를 위한 Jenkins Pipeline 작성 (0) | 2022.07.14 |