Kubernetes

CronJob

라온클 2023. 5. 24. 05:44

CronJob 요약

<한줄 요약>

CronJob은 batch성 Job을 특정 주기를 지정하여 실행할 수 있다.

 

<세줄 요약>

CronJob은 주로 백업, 리포트 생성 등의 정기적 작업을 수행하기 위해 사용된다. 

CronJob은 크론 스케쥴 문법을 따른다.

CronJob의 JobTemplate는 Job과 동일하다

 

 

 

그림으로 보는 CronJob manifest

CronJob의 manifest파일 구조

 

CronJob의 Job template은 Job과 동일하다

 

 

CronJob 특징

<특징>

.spec.schedule (크론 스케줄)

CronJob은 크론 스케쥴 문법을 따른다.



 

 

.spec.startingDeadlineSeconds  (시작 기한)

원래 CronJob이 실행해야 하는 시각으로부터 '시작 기한'(초단위)까지는 봐준다는 뜻이다.

예시 : 매시간마다 실행되는 CronJob의 startingDeadlineSeconds(시작 기한)이 30초로 설정되어 있으면 1시 정각 직후 30초까지는 봐준다는 뜻이다. 30초 기한이 지나면, CronJob이 잡을 시작하지 않는다. 

 

⚠️시작 기한이 10초 미만의 값으로 설정되면, 크론잡이 스케줄되지 않을 수 있다. 이는 크론잡 컨트롤러가 10초마다 항목을 확인하기 때문이다.

이렇게 시작 기한까지 줬는데도 기한을 못 맞춘 잡은 실패한 잡으로 간주한다.

 

startingDeadlineSeconds 사용 예시

<상황>

  • 크론잡이 08:30:00부터  '매 분마다' 새로운 Job을 실행한다
  • 크론잡 컨트롤러가 08:29:00 부터 10:21:00 까지(총 112분) 고장이 났다

 

i) startingDeadlineSeconds이 없을때

일정을 놓친 작업 수가 100개를 초과하여 잡이 실행되지 않을 것이다.
왜냐하면 크론잡 컨트롤러가 100회 이상의 일정이 누락되었다면, 잡을 실행하지 않고 에러 로그를 남긴다.

Cannot determine if job needs to be started. Too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew.

 

 

ii) startingDeadlineSeconds이 200일때(=200초까진 봐준다)
CronJob 컨트롤러가 복구된 10:22:00 로부터 최근 200초동안 일정을 놓친 작업 수가 3번이므로 OK!

그래서 잡은 10:22:00 부터 시작될 것이다. 

 

 

 

 

 

 

.spec.concurrencyPolicy (동시성 정책)

특정 CronJob에 의해 생성된 Job의 '동시 실행'을 처리하는 방법을 지정한다.

concurrencyPolicy은 동일한 CronJob에 의해 생성된 잡에만 적용된다. 

 

Allow(기본값)

  • CronJob 속 Job이 동시에 실행되는 것을 허용한다.

 

Forbid

  • CronJob 속 Job이 동시에 실행되는 것을 허용하지 않는다.
  • 새로운 Job을 실행할 시간인데 이전 Job 실행이 아직 완료되지 않은 경우, CronJob은 새로운 Job 실행을 건너뛴다.
  • CronJob은 정해진 일정에 Job 실행을 실패하면 놓쳤다고 카운팅된다. 

 

Replace

  • 새로운 Job을 실행할 시간인데, 이전 Job 실행이 아직 완료되지 않은 경우, CronJob은 현재 실행 중인 Job 실행을 새로운 Job 실행으로 대체한다.

<장단점(한계)>

장점

Job을 주기적으로 예약(스케쥴링)할 수 있다

따라서 CronJob은 백업을 수행하거나 이메일을 보내는 것과 같이 주기적이고 반복적인 작업들을 생성하는 데 유용하다.

CronJob은 시스템 사용이 적은 시간에 잡을 스케줄하려는 경우처럼 특정 시간에 개별 작업을 스케줄할 수도 있다.

 

단점

CronJob은 일정의 실행시간 마다 약 한 번의 Job 오브젝트를 생성한다. 즉 불명확하다.

"약" 이라고 하는 이유는 특정 환경에서는 두 개의 Job이 만들어지거나, Job이 생성되지 않기도 하기 때문이다. 
startingDeadlineSeconds가 10초 미만의 값으로 설정되면, CronJob이 스케줄되지 않을 수 있다. (이유는 CronJob 컨트롤러가 10초마다 항목을 확인하기 때문이다.)


<존재 이유>

워크로드에서 주기적이고 반복적인 batch성 작업(Job)들을 생성하는 데 유용하다



<만드는 법>

manifest파일로 만들기

https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#writing-a-cronjob-spec 

 

kubectl 명령어로 만들기

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-em-cronjob-em- 

 

 

참고 링크

크론잡(CronJob) 개념

https://kubernetes.io/ko/docs/concepts/workloads/controllers/cron-jobs/ 

 

CronJob 의 매니페스토 파일 

https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/cron-job-v1/

 

크론잡(CronJob) 명세 작성

https://kubernetes.io/ko/docs/tasks/job/automated-tasks-with-cron-jobs/#writing-a-cron-job-spec 

 

크론 스케줄 문법

https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-syntax 

 

크론잡(CronJob)으로 자동화된 작업 실행

https://kubernetes.io/ko/docs/tasks/job/automated-tasks-with-cron-jobs/