Cronjob 실행 시간 설정

작성자 김아름 수정일 2022-10-17 15:27

#cronjob, #kubernetes, #쿠버네티스, #job, #크론잡

들어가며

  • 우리는 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의 시간대를 수정해주어야 합니다.

아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300