Kubernetes Job & CronJob
목차
- Job는 Pod와 같은 종류지만, Pod와 다르게 특정 작업만 수행하고 종료된다.
- Job는 일회성 및 일괄 작업 실행에 적합, CronJob은 반복작업 예약하는데 사용
- Job은 작업을 정의하고 완료될 때까지 실행되도록 보장, 하나 이상의 Pod의 수명 주기를 관리하여 원하는 성공횟수가 도달할때 까지 관리
- CronJob리소스는 사전 정의된 일정(매시, 일일, 주간, 월간 등)에 따라 Job 생성
- CronJob에 의해 생성된 각 Job은 특정작업 또는 작업 집합을 Pod로 실행
- 백업, 보고서 생성 등과 같은 정기적인 예약 작업을 수행하기 위해
- 작업을 시작해야하는 특정 시점이 존재하는 경우
- 리눅스 cronjob과 동일 한 스케쥴 작성( 분, 시, 일, 월, 요일)

- 매주 금요일 22시 30분에 backup.sh를 실행 →
30 22 * * 5 /bin/bash /root/backup.sh - 1 ~ 8월 까지 2개월마다 1일 12시 →
00 12 1 1-10/2 *
job
$ kubectl create job nodeversion --image node -- node -v
job.batch/nodeversion created
$ kubectl get po,job | grep node
pod/nodeversion-rgfqz 0/1 Completed 0 2m56s
job.batch/nodeversion 1/1 45s 2m56s
#로그 확인
$ kubectl logs nodeversion-rgfqz
v21.7.3
#job 정보 확인
$ kubectl describe job nodeversion
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m51s job-controller Created pod: nodeversion-rgfqz
Normal Completed 3m6s job-controller Job completed
#job.yaml 생성
$ kubectl create job hello-job --image=busybox --dry-run=client -o yaml -- echo "Hello I'm running job" > job-cronjob.yaml
#내용
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: hello-job
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- echo
- Hello I'm running job
image: busybox
name: hello-job
resources: {}
restartPolicy: Never
status: {}
#현재 진행되고 있는 job 확인
$ kubectl get jobs.batch -wjob.yaml + 옵션
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: hello-job
spec:
activeDeadlineSeconds: 15 # 작업이 실행될 시간, 시간전까지 완료된 작업만 유지 나머지 작업은 종료
# 15초에 완료 작업 2개 진행, 3개라하면 3개 terminate
parallelism: 5 # 병렬로 실행할 최대 Pod수 - 이부분 없을 시 순차 실행
completions: 10 # 원하는 Pod 수 지정, 하나씩 완료될때 까지 관리
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- echo
- Hello I'm running job
image: busybox
name: hello-job
resources: {}
restartPolicy: Never
status: {}cronjob
$ kubectl create cronjob hello-date-1m --image=busybox \
--schedule='*/1 * * * *' --dry-run=client -o yaml \
-- /bin/sh -c "date && echo 'Hello from the Kubernetes cluster'" > hello-date-1m.yaml
#내용
apiVersion: batch/v1
kind: CronJob
metadata:
creationTimestamp: null
name: hello-date-1m
spec:
jobTemplate:
metadata:
creationTimestamp: null
name: hello-date-1m
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- /bin/sh
- -c
- date && echo 'Hello from the Kubernetes cluster'
image: busybox
name: hello-date-1m
resources: {}
restartPolicy: OnFailure
schedule: '*/1 * * * *'
status: {}
$ kubectl apply -f hello-date-1m.yaml
#분마다 실행 된 것을 확인 가능
$ kubectl get cj,po | grep hello
cronjob.batch/hello-date-1m */1 * * * * False 0 58s 3m37s
pod/hello-date-1m-28555604-ddrb7 0/1 Completed 0 2m58s
pod/hello-date-1m-28555605-ncxdk 0/1 Completed 0 118s
pod/hello-date-1m-28555606-tznpl 0/1 Completed 0 58shello-date-1m.yaml + 옵션
apiVersion: batch/v1
kind: CronJob
metadata:
creationTimestamp: null
name: hello-date-1m
spec:
schedule: '*/1 * * * *' # 리눅스 cronjob와 같은 형식
successfulJobsHistoryLimit: 5 # 기본값 3. CronJob 컨트롤러가 성공한 마지막 작업기록 갯수
failedJobsHistoryLimit: 5 # 실패한 마지막 작업기록 작업갯수 지정
concurrencyPolicy: Allow # 동시 작업 실행을 처리하는 방법 지정
# Allow: 동일한 작업 동시실행 허용
# Forbid: 동일한 작업이 순차적으로 실행되는 경우 동시실행 방지
# Replace: 현재 실행 중인 작업취소하고 새작업으로 대체
jobTemplate:
metadata:
creationTimestamp: null
name: hello-date-1m
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- /bin/sh
- -c
- date && echo 'Hello from the Kubernetes cluster'
image: busybox
name: hello-date-1m
resources: {}
restartPolicy: OnFailure