[Kubernetes](CronJob)How to use Kubernetes CronJob
업데이트:
- 실행 시간 제약
- 동시성 관리
- History Limit
실행 시간 제약, 동시성 관리
cronjob-concurrency.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-concurrency
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 600
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster; sleep 6000 # 6000초 동안 안끝나고 대기
restartPolicy: OnFailure
**.spec.startingDeadlineSeconds**
- 지정된 시간에 크론잡이 실행되지 못했을 때 필드 값으로 설정한 시간까지 지나면 크론잡이 실행되지 않게 한다. 이 필드 값을 설정하지 않으면 실행 시간이 지나더라도 제약 없이 잡이 실행된다.
.spec.concurrencyPolicy
- 크론잡이 실행하는 잡의 동시성을 관리한다.
- 기본 값은 Allow고 크론 잡이 여러개 잡을 동시에 실행할 수 있도록 한다.
- Forbid 로 설정하면 잡을 동시에 실행하지 않도록 한다. 새로운 잡을 실행할 시간이고 이전 잡 실행이 아직 완료되지 않은 경우, 크론 잡은 새로운 잡 실행을 건너뛴다.
- Replace 로 설정하면 새로운 잡을 실행할 시간이고 이전 잡 실행이 아직 완료되지 않은 경우, 크론 잡은 현재 실행 중인 잡 실행을 새로운 잡 실행으로 대체한다.
적용
$ kubectl apply -f cronjob-concurrency.yaml
cronjob.batch/hello-concurrency created
$ kubectl get po | grep hello
hello-concurrency-1600782180-qt5vn 1/1 Running 0 20s
- 6000초를 대기하도록 설정하였으므로, 1분이 지나고 다음 잡을 실행하려고 할때 기존 잡이 남아 있는 상태가 된다.
- concurrencyPolicy: Forbid 로 설정하였으므로 잡이 동시에 실행되지 않고 기다린다. 즉, 처음 실행했던 작업이 끝나야 다음 작업이 실행된다.
.spec.concurrencyPolicy
: Allow 로 변경
$ kubectl edit cronjob hello-concurrency
cronjob.batch/hello-concurrency edited
concurrencyPolicy: Allow
$ kubectl get po | grep hello
hello-concurrency-1600782180-qt5vn 1/1 Running 0 4m14s
hello-concurrency-1600782360-gjhtj 1/1 Running 0 24s
hello-concurrency-1600782420-fkhxg 1/1 Running 0 14s
- 크론잡이 여러개 잡을 동시에 실행할 수 있도록 한다.
새로운 파드가 실행 됨을 확인 할 수 있다.
.spec.concurrencyPolicy
: Replace 로 변경
$ kubectl edit cronjob hello-concurrency
cronjob.batch/hello-concurrency edited
concurrencyPolicy: Replace
$ kubectl get po | grep hello
hello-concurrency-1600782180-qt5vn 1/1 Terminating 0 6m50s
hello-concurrency-1600782360-gjhtj 1/1 Terminating 0 3m
hello-concurrency-1600782420-fkhxg 1/1 Terminating 0 2m50s
hello-concurrency-1600782480-swgnw 1/1 Terminating 0 109s
hello-concurrency-1600782540-2gmrg 1/1 Running 0 10s
- 새로운 잡을 실행할 시간이고 이전 잡 실행이 아직 완료되지 않은 경우, 크론 잡은 현재 실행 중인 잡 실행을 새로운 잡 실행으로 대체한다.
남아 있던 잡들을 모두 종료시키고 새로 잡이 실행됨을 볼 수 있다.
suspend
: false → true
$ kubectl get cronjob,po | grep hello
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello-concurrency */1 * * * * True 1 2m50s 11m
pod/hello-concurrency-1600782660-fgk27 1/1 Running 0 2m28s
더이상 크론잡이 실행되지 않고 멈춘다. 단, 기존 실행중이던 잡이 멈추지는 않는다.
시간이 지나 확인해보면 .spec.concurrencyPolicy: Replace 라서 기존 파드를 종료하고 새로 파드를 설정해야하지만 대기 중임을 알 수 있다.
History Limit
successfulJobsHistoryLimit, failedJobsHistroyLimit
cronjob.batch/hello-concurrency */1 * * * * True 1 13m 22m
pod/hello-1600783320-lx4xg 0/1 Completed 0 2m40s
pod/hello-1600783380-cmk6w 0/1 Completed 0 100s
pod/hello-1600783440-79s6n 0/1 Completed 0 39s
pod/hello-concurrency-1600782660-fgk27 1/1 Running 0 13m
.spec.successfulJobsHistoryLimit
- default: 3
- 첫번째 예제는 default로 설정되어 잡이 3개 남아 있음을 확인할 수 있다.
.spec.failedJobsHistroyLimit
- default 1
- 0으로 설정하면 잡이 종료된 다음 내역을 저장하지 않는다.
https://kubernetes.io/ko/docs/tasks/job/automated-tasks-with-cron-jobs/
댓글남기기