[따배쿠] Controller - Cronjob
Cronjob
- 사용자가 원하는 시간에 Job 실행 예약 지원
- Job 컨트롤러로 실행할 Application Pod를 주기적으로 반복해서 실행
- Linux의 Cronjob의 스케줄링 기능을 Job Controller에 추가한 API
- 다음과 같은 반복해서 실행하는 Job을 운영해야 할 때 사용
- Data Backup
- Send Email
- Cleaning tasks
- 즉, CronJob이란 Job의 기능을 그대로 갖고 있지만 주기적으로 Job을 실행할 수 있도록 해주는 컨트롤러
CronJob Schedule
- Cronjob Schedule " 0 3 1 * * "
- Minutes (from 0 to 59)
- Hours (from 0 to 23)
- Day of the month (from 1 th 31)
- Month (from 1 to 12)
- Day of the weke (from 0 to 6)
- 예시
- 0 9 1 * * : 매월 1일 아침 9시 정각에 job을 실행
- 0 3 * * 0 : 매주 일요일 새벽 3시에 job을 실행
- * * * * * : 매 분마다 실행
- */5 * * * * : 5분마다 실행 (0분, 5분, 10분, …)
- 0 */2 * * * : 2시간마다 실행 (0시, 2시, 4시, …)
Cronjob Definition
Cronjob은 Job을 주기적으로 실행하도록 하는 Controller이기때문에
spec 내 template은 유사하고, schedule만 추가해준 정도이다.
예시
# cronjob-exam.yaml 파일 작성
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-exam
spec:
schedule: "* * * * *"
startingDeadlineSeconds: 500
concurrencyPolicy: Allow
# concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- echo Hello; sleep 80; echo Bye
restartPolicy: Never
- schedule: Cron 형식으로 작업이 실행될 일정을 정의합니다. * * * * *는 매 분마다 실행됨을 의미합니다.
- startingDeadlineSeconds: 예약된 시간에 작업이 시작되지 않을 경우, 시작할 수 있는 최대 시간(초)입니다. 이 시간 내에 작업이 시작되지 않으면 해당 작업은 건너뛰게 됩니다. 여기서는 500초로 설정되어 있습니다.
- concurrencyPolicy: 동시 실행되는 작업을 처리하는 방식을 제어합니다. Forbid 값은 이전 작업이 완료되지 않은 경우 새로운 작업이 시작되지 않도록 합니다. 주석 처리된 Allow를 활성화하면 동시 실행이 허용됩니다.
이 CronJob은 매 분마다, "Hello"를 출력하고 10초 동안 대기한 후 "Bye"를 출력하는 작업을 수행합니다. Forbid 동시 실행 정책 덕분에 이전 작업이 완료되지 않은 경우 새로운 작업이 시작되지 않도록 설정되어 있습니다.
# 생성 및 확인
root@master:~/Getting-Start-Kubernetes/6# kubectl create -f cronjob-exam.yaml
cronjob.batch/cronjob-exam created
root@master:~/Getting-Start-Kubernetes/6# kubectl get jobs
NAME STATUS COMPLETIONS DURATION AGE
cronjob-exam-28892312 Complete 1/1 15s 2m30s
cronjob-exam-28892313 Complete 1/1 15s 90s
cronjob-exam-28892314 Complete 1/1 14s 30s
root@master:~/Getting-Start-Kubernetes/6# kubectl get pods
NAME READY STATUS RESTARTS AGE
cronjob-exam-28892312-2nwgx 0/1 Completed 0 2m33s
cronjob-exam-28892313-wpk5x 0/1 Completed 0 93s
cronjob-exam-28892314-6fwmv 0/1 Completed 0 33s
cronjob에 의해 1분에 1개씩 생성되는 것을 확인 가능하다.
# cronjobs.batch 파일 확인
root@master:~/Getting-Start-Kubernetes/6# kubectl get cronjobs.batch -o yaml
apiVersion: v1
items:
- apiVersion: batch/v1
kind: CronJob
metadata:
creationTimestamp: "2024-12-07T02:30:30Z"
generation: 1
name: cronjob-exam
namespace: default
resourceVersion: "286055"
uid: 55d80431-a9df-4243-8cb7-2185ed4b8e44
spec:
concurrencyPolicy: Forbid
failedJobsHistoryLimit: 1
jobTemplate:
metadata:
creationTimestamp: null
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- args:
- /bin/sh
- -c
- echo Hello; sleep 10; echo Bye
image: busybox
imagePullPolicy: Always
name: hello
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Never
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
schedule: '* * * * *'
startingDeadlineSeconds: 500
successfulJobsHistoryLimit: 3
suspend: false
status:
lastScheduleTime: "2024-12-07T02:41:00Z"
lastSuccessfulTime: "2024-12-07T02:41:15Z"
kind: List
metadata:
resourceVersion: ""
successfulJobsHistoryLimit는 Kubernetes의 CronJob 리소스에서 사용되는 필드 중 하나로, 성공적으로 완료된 작업의 기록을 유지하는 수를 지정합니다. 이 필드는 CronJob이 생성한 성공적인 Job의 수를 제한하여, 클러스터의 리소스를 효율적으로 관리하고 불필요한 Job 기록이 쌓이지 않도록 도와줍니다.
successfulJobsHistoryLimit은 별도로 spec에 명시하지 않아도, defualt 값이 3이다.
즉, 1분동안 job이 실행 되지만 최근 성공한 job 3개까지만 history로 남준다.
# 삭제
root@master:~/Getting-Start-Kubernetes/6# kubectl delete cronjob.batch cronjob-exam
cronjob.batch "cronjob-exam" deleted
# 번외) cronjob-exam.yaml 파일
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-exam
spec:
schedule: "* * * * *"
startingDeadlineSeconds: 500
concurrencyPolicy: Allow
# concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- echo Hello; sleep 80; echo Bye
restartPolicy: Never
concurrencyPolicy : 한 번에 여러 개의 job 실행을 허용
이 CronJob은 매 분마다 실행되어 "Hello"를 출력하고 80초 동안 대기한 후 "Bye"를 출력합니다. 작업이 완료되는 데 1분 이상 걸리면, Allow 동시 실행 정책 덕분에 이후의 작업이 여전히 예약에 따라 시작됩니다.