CronJob 은 리눅스 크론탭처럼 스케쥴된 일정 시각마다 Job 을 실행시키는 리소스이다. Job 의 또다른 형태로 보이지만, 실제로는 Deployment 와 ReplicaSet 의 관계처럼 CronJob 이 Job 을 관리하고, Job 이 Pod 를 관리하는 관계이다.
1. 크론잡 생성
apiVersion: batch/v1
kind: CronJob
metadata:
name: sample-cronjob
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Allow
startingDeadlineSeconds: 30
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 3
suspend: false
jobTemplate:
spec:
completions: 1
parallelism: 1
backoffLimit: 1
template:
spec:
containers:
- name: sleep-container
image: centos:7
command:
- "sh"
- "-c"
args:
# 약 50% 확률로 성공하는 명령어
- "sleep 40; date +'%N' | cut -c 9 | egrep '[1|3|5|7|9]'"
restartPolicy: Never
위의 매니페스트를 기반으로 50% 확률로 성공하는 Job 을 실행하는 CronJob 을 생성하고, 아래 커맨드로 CronJob, Job, Pod 를 조회해보자
$ kubectl get cronjobs.batch
$ 크론잡 생성 직후에는 아직 다음 시작 1분에 도달하지 않아서 크롭잡만 존재하고, ACTIVE 잡이 없다.
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
sample-cronjob */1 * * * * <none> False 0 <none> 5s
$ kubectl get jobs
No resources found in default namespace.
# 몇초가 지난 후 재실행하면 ACTIVE 상태로 변경되며, Job 도 조회된다.
$ kubectl get cronjobs.batch
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
sample-cronjob */1 * * * * <none> False 1 40s 52s
$ kubectl get jobs
NAME STATUS COMPLETIONS DURATION AGE
sample-cronjob-29329291 Running 0/1 30s 30s
# 50퍼센트 확률로 실패했다.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
sample-cronjob-29329291-wg8rp 0/1 Error 0 48s
# 몇분간 방치한 후 매분 생성된 Job 과 Pod 들을 조회한다.
$ kubectl get jobs
NAME STATUS COMPLETIONS DURATION AGE
sample-cronjob-29329300 Failed 0/1 11m 11m
sample-cronjob-29329301 Failed 0/1 10m 10m
sample-cronjob-29329305 Complete 1/1 92s 6m39s
sample-cronjob-29329306 Complete 1/1 93s 5m39s
sample-cronjob-29329307 Complete 1/1 93s 4m39s
sample-cronjob-29329308 Complete 1/1 43s 3m39s
sample-cronjob-29329309 Failed 0/1 2m39s 2m39s
sample-cronjob-29329310 Complete 1/1 43s 99s
sample-cronjob-29329311 Running 0/1 39s 39s
$ kubectl get pods
# backoffLimit: 1 이므로, 실패한 경우 한번 더 Pod 를 생성하여 시도한다.
NAME READY STATUS RESTARTS AGE
sample-cronjob-29329300-4gdrc 0/1 Error 0 11m
sample-cronjob-29329300-8ts96 0/1 Error 0 10m
sample-cronjob-29329301-6wsxr 0/1 Error 0 10m
sample-cronjob-29329301-ww9jj 0/1 Error 0 9m56s
sample-cronjob-29329306-96zcl 0/1 Completed 0 4m56s
sample-cronjob-29329306-p7nmp 0/1 Error 0 5m46s
sample-cronjob-29329307-45pnz 0/1 Error 0 4m46s
sample-cronjob-29329307-pr9ls 0/1 Completed 0 3m56s
sample-cronjob-29329308-cvc4k 0/1 Completed 0 3m46s
sample-cronjob-29329309-6nrc9 0/1 Error 0 2m46s
sample-cronjob-29329309-6qhs6 0/1 Error 0 116s
sample-cronjob-29329310-fwj22 0/1 Completed 0 106s
sample-cronjob-29329311-rlmls 0/1 Completed 0 46s
2. 크론잡 일시정지
spec.suspend: true 로 설정하여 적용하면 스케쥴링 대상에서 제외된다. 매니페스트를 변경 후 kubectl apply 를 하거나, 아래처럼 kubectl patch 를 하여 적용한다. 다시 suspend: false 로 적용하면 일시정지가 풀린다.
$ kubectl patch cronjob sample-cronjob -p '{"spec":{"suspend":true}}'
# SUSPEND: True 로 변경되며, 스케쥴링에서 제외된 상태이다.
$ kubectl get cronjobs
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
sample-cronjob */1 * * * * <none> True 1 52s 45m
3. 크론잡을 스케쥴링 이외의 시점에 실행
CronJob 으로부터 Job 을 생성하여 1회 자율적으로 실행할 수 있다.
$ kubectl create job job-from-cronjob --from cronjob/sample-cronjob
4. 이전 잡이 종료되지 않았을 경우 동시성 제어
일반적으로 크론잡은 작업 완료까지 소요되는 시간을 고려하여 충분한 시간 간격으로 스케쥴링을 해야한다. 이전에 수행된 잡이 다음 수행시점 이전에 종료되었다면 다음 수행시점에는 새로운 잡을 생성하여 실행하지만, 만약에 이전 잡이 아직 실행중이라면 새로운 잡 실행 방식에 대해서 아래와 같이 spec.concurrencyPolicy 필드에 지정할 수 있다.
spec.concurrencyPolicy 값 | 설명 |
Allow | 새로운 잡을 생성하여 이전 잡과 동시에 실행(기본값) |
Forbid | 새로운 잡을 생성하지 않음(동시실행 제한) |
Replace | 이전 잡을 삭제하고 새로운 잡을 생성하여 실행 |
5. 잡 실행 시작 기한 설정
크론잡으로 스케쥴링한 시각에는 kubernetes master 가 잡을 생성한다. 그러므로 해당 시각에 마스터 노드의 시스템 리소스가 부족하거나 일시적으로 다운되어 시작시각에 정확히 시작하지 못하면, 얼마나 지연 시작을 허용하지를 spec.startingDeadlineSeconds 필드에 지정할 수 있다. 예를 들어 매시 정각에 실행되는 크론잡인 경우(schedule: "0 * * * *") 정각부터 5분이 경과되기 전까지 시작을 허용하고자 한다면, spec.startingDeadlineSeconds: 300 값을 지정해주면 된다. 미지정시 아무리 지연되더라도 잡을 실행하게 되어있다.
6. 크론잡 이력 저장
크론잡이 생성한 잡은 종료된 후에도 삭제되지 않고 남아있는데, 남길 갯수를 지정할 수 있다.
필드 | 설명 |
spec.successfulJobsHistoryLimit | 성공한 잡 저장 개수(기본값 3) |
spec.failedJobsHistoryLimit | 실패한 잡 저장 개수(기본값 3) |
잡이 남아있으므로, 잡이 관리하는 파드도 Completed(정상종료) 또는 Error(비정상종료) 상태로 남아있게 된다.(1번 항목에서 조회한 Pod 참고) 0으로 지정하면 잡은 종료 즉시 삭제된다.
'Kubernetes' 카테고리의 다른 글
[Kubernetes] 완료된 잡 정리(ttlSecondsAfterFinished) (0) | 2025.10.06 |
---|---|
[Kubernetes] 잡 병렬 실행 (0) | 2025.10.04 |
[Kubernetes] 잡 (0) | 2025.10.04 |
[Kubernetes] 스테이트풀셋 삭제와 영구 볼륨 정리 (0) | 2025.09.07 |
[Kubernetes] 스테이트풀셋 업데이트 전략 (0) | 2025.09.07 |