들어가며
- 우리는 cronjob을 통해 원하는 시간에 반복 실행되도록 작업 예약을 하게 됩니다.
- 한국 시간에 맞춰 작업 예약을 했지만, 제 시간에 실행되지 않은 경우가 있습니다.
- 그 이유에 대한 원인과 해결 방법에 대해 알아보겠습니다.
- cronjob 만드는 방법에 대한 설명은 여기를 확인해주세요.
Cronjob Timezone 을 설정해보자
예를 들어 cronjob을 오전 9시에 실행되도록 구성하였지만, 실제론 자정에 실행될 수 있습니다.
이는 kube-controller-manager 컨테이너 내에서 사용되는 기본 UTC(협정 세계시) 시간대가 마스터 노드에서 사용되는 시간대와 다를 때 발생합니다.
예시를 통해 문제 발생 현상과 해결 방안에 대해 알아보겠습니다.
현재 서버의 시간은 아래와 같습니다.
date Mon Sep 19 14:31:18 KST 2022
14시 매 분 마다 작업이 실행되도록 하는 cronjob을 실행시켜 보겠습니다.
cat cronjob.yaml apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: schedule: "* 14 * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox imagePullPolicy: IfNotPresent command: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster volumeMounts: - mountPath: /etc/localtime:ro name: time restartPolicy: OnFailure volumes: - hostPath: path: /etc/localtime name: time
kubectl apply -f cronjob.yaml cronjob.batch/hello created kubectl get cj NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello * 14 * * * False 0 <none> 39s
위 내용이라면 현재 14시이기 때문에 cronjob에 명시해 놓은 job이 실행되어야 합니다.
하지만, jobs을 조회해 보아도 실제론 실행되고 있지 않습니다.
그 이유는 kube-controller-manager의 시간대가 UTC 이기 때문입니다.
kubectl exec -it kube-controller-manager-master -n kube-system sh date Mon Sep 19 05:36:32 UTC 2022
cronjob의 schedule에 작성한 일정은 kube-controller-manager 시간대를 기준으로 합니다.
이를 해결하기 위해서는 kube-controller-manager, kube-apiserver, kube-scheduler, etcd의 기본 시간대를 변경해 주어야 합니다.
/etc/kubernetes/manifests로 이동하면 총 4개의 yaml파일이 있습니다.
해당 yaml을 수정하면 kube-controller-manager, kube-apiserver, kube-scheduler, etcd 에 바로 반영되어 적용 시킬 수 있습니다.
cd /etc/kubernetes/manifests/ ls -al total 16 drwxr-xr-x. 2 root root 113 Sep 19 14:33 . drwxr-xr-x. 4 root root 125 Jul 22 09:34 .. -rw------- 1 root root 1976 Sep 19 14:32 etcd.yaml -rw------- 1 root root 2954 Sep 19 14:32 kube-apiserver.yaml -rw------- 1 root root 2798 Sep 19 14:33 kube-controller-manager.yaml -rw------- 1 root root 1256 Sep 19 14:33 kube-scheduler.yaml
spec.containers.volumeMounts에 아래와 같이 작성해 줍니다.
- mountPath: /etc/localtime name: time
spec.containers.volumes에 아래와 같이 작성해 줍니다.
- hostPath: path: /etc/localtime name: time
다시 job을 조회해 보겠습니다.
kubectl get jobs NAME COMPLETIONS DURATION AGE hello-1663566180 1/1 1s 2m45s hello-1663566240 1/1 1s 105s hello-1663566300 1/1 1s 45s
cronjob으로 예약해 놓은 작업이 정상적으로 수행되고 있습니다.
kubectl logs <job pod name> kubectl logs hello-1663566360-5twkl Mon Sep 19 14:46:08 KST 2022 Hello from the Kubernetes cluster
마무리
- 컨테이너의 표준 시간은 kube-controller-manager 시간을 기준으로 합니다.
- 한국 시간에 맞게 스케쥴링 하려면, kube-controller-manager의 시간대를 수정해주어야 합니다.
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.