CronJob 이란?
- 사용자가 원하는 시간에 JOB 실행 예약 지원
- job 컨트롤러로 실행할 Application Pod를 주기적으로 반복해서 실행
Linux의 cronjab의 스케줄링 기능을 Job Controller에 추가한 API
다음과 같은 반복해서 실행하는 Job을 운영해야 할 때 사용
1. Data Backup
2. Send email
3. Cleaning tasks
- Cronjob Schedule : "0 3 1 * *" → " 매월 1일 3시 정각에 반복해서 실행"
. Minutes (from 0 to 59)
. Hours (from 0 to 23)
. Day of the month (from 1 to 31)
. Month (from 1 to 12)
. Day of the week (from 0 to 6)
EX)
- 매월 1일 아침 9시 정각에 job을 실행 "0 9 1 * *"
- 주중 새벽 3시에 job을 실행 "0 3 * * 1-5"
- 주말 새벽 3시에 job을 실행 "0 3 * * 0,6"
- job을 5분 마다 한번씩 실행 "*/5 * * * *"
- 2시간 마다 매시 정각에 한번씩 실행 "0 */2 * * *"
cronjob-exam.yaml
- 500초 안에 컨테이너가 실행되지 못하면 해당 작업 취소하는 예제
apiVersion: batch/v1beta1
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 10; echo Bye
restartPolicy: Never
concurrencyPolicy: Allow → default 값이며 한번에 여러개의 job이 실행해도 괜찮다는 옵션
concurrencyPolicy: Forbid → 한번에 하나씩만 동작
kubernetes 1.25 버전을 사용중인 상태에서 apiVersion: batch/v1beta1 사용시 아래와 같은 에러가 발생
yaml 파일에서 apiVersion: batch/v1beta1 → batch/v1 으로 수정
# kubectl create -f cronjob-exam.yaml
error: resource mapping not found for name: "cronjob-exam" namespace: "" from "cronjob-exam.yaml": no matches for kind "CronJob" in version "batch/v1beta1"
ensure CRDs are installed first
1분 마다 pod 실행되며 Forbid 설정을 했기 때문에 한번에 하나씩 동작
# kubectl create -f cronjob-exam.yaml
cronjob.batch/cronjob-exam created
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cronjob-exam-27848899-jz54d 0/1 Completed 0 99s 10.44.0.1 node2.example.com <none> <none>
cronjob-exam-27848900-8f8qr 0/1 Completed 0 39s 10.36.0.1 node1.example.com <none> <none>
cronjab 을 yaml 형식으로 확인할 때 "successfulJobsHistoryLimit: 3" 부분이 3으로 설정 되었기 때문에 pod는 계속 생성
되지 않고 3개 까지만 남겨준다.
# kubectl get cronjobs.batch -o yaml
apiVersion: v1
items:
- apiVersion: batch/v1
kind: CronJob
metadata:
creationTimestamp: "2022-12-13T12:18:18Z"
generation: 1
name: cronjob-exam
namespace: default
resourceVersion: "90624"
uid: a9207f42-e653-4f6e-82bb-c5c3071f95d2
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: "2022-12-13T12:22:00Z"
lastSuccessfulTime: "2022-12-13T12:22:17Z"
kind: List
metadata:
resourceVersion: ""
cronjob 삭제
# kubectl delete cronjobs.batch cronjob-exam
cronjob.batch "cronjob-exam" deleted
[참고]
- https://www.youtube.com/watch?v=eAvoH0Cqd7E
'Kubernetes' 카테고리의 다른 글
[Kubernetes] Service 4가지 종류 실습 (0) | 2022.12.14 |
---|---|
[Kubernetes] Service 개념과 종류 (0) | 2022.12.13 |
[Kubernetes] Job Controller (0) | 2022.12.12 |
[Kubernetes] StatefulSet (0) | 2022.12.12 |
[Kubernetes] DaemonSet + RollingUpdate (1) | 2022.12.12 |