개요
정기적으로 수행하는 작업을 위한 Cronjob, 그리고 일반적인 Job은 각각 startingDeadlineSeconds, activeDeadlineSeconds라는 설정을 가지고 있다. 각각의 역할에 혼동이 생겨 개념을 적어둔다.
Job - activeDeadlineSeconds
일반적으로 Pod 실패나 컨테이너 오류로 종료되지 않는 한, Job은 중단되지 않고 실행된다. 만약 한 번 실행한 Job이 특정 시간 안에 종료되어야 한다면 activeDeadlineSeconds 지정하면 된다.
apiVersion: batch/v1
kind: Job
metadata:
name: pi-with-timeout
spec:
backoffLimit: 5
activeDeadlineSeconds: 100
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
위의 예시는 100초 내에 Job이 완료되어야 성공 상태로 종료될 수 있다. 만약 activeDeadlineSeconds를 초과하면 실행 중이던 Pod가 종료되고 reason: DeadlineExceeded / type: Failed로 Job이 종료된다.
Cronjob - startingDeadlineSeconds
Cronjob에 설정하는 startingDeadlineSeconds은 Job의 시작 기한으로, 어떤 이유로든 Job이 스케쥴 시간을 놓친 경우 스케줄을 시작할 수 있는 기한을 의미한다. 만약 startingDeadlineSeconds를 지나면 Job이 시작되지 않고, 실패한 것으로 처리한다. 필드를 지정하지 않으면 시작 기한이 없는 것에 해당한다.
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
startingDeadlineSeconds: 200
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
위의 예시의 경우 스케쥴이 지나고 200초까지는 Job이 실행될 수 있다. 참고로 크론잡 컨트롤러가 10초 주기로 상태를 확인하기 때문에 startingDeadlineSeconds를 10초 미만으로 설정하면 크론잡이 스케줄되지 않을 수 있으므로 주의해야 한다.
참고 문서
https://kubernetes.io/ko/docs/concepts/workloads/controllers/job/
https://kubernetes.io/ko/docs/concepts/workloads/controllers/cron-jobs/