티스토리 뷰
CronJob
- Deployment와 ReplicaSet의 관계처럼 CronJob에도 Job의 기능이 포함되어 있다.
- Deployment가 ReplicaSet을 컨트롤하여 Rolling Update를 지원했던 것처럼 CronJob은 Job을 컨트롤해서 원하는 특정 시간에 Job이 실행될 수 있도록 작업 '예약' 기능을 지원한다.
- 예를 들어, 이메일을 주기적으로 보내는 작업, 로그파일을 주기적으로 정리하는 작업, 데이터 백업 작업, 가비지 데이터를 주기적으로 삭제해주는 작업 등 특정 주기를 가지고 반복해서 실행해주는 작업에 대해 CronJob으로 정의할 수 있다.
- 애플리케이션이 비정상적으로 동작하여 Pod를 재시작하거나 컨테이너를 재시작하는 것은 Job 컨트롤러 고유의 기능이며 CronJob은 이러한 Job 컨트롤러를 제어하면서 주기적으로 실행하는 기능을 더한 컨트롤러이다.
CronJob 표기식
- CronJob은 유닉스, 리눅스에서 사용하는 크론잡과 표기식이 동일하다.
예시
1) 매월 1일 오전 9시: 0 9 1 * *
2) 매주 일요일 오전 3시: 0 3 * * 0
3) 매 주중 오전 3시: 0 3 * * 1-5
4) 매 주말 오전 3시: 0 3 * * 0,6
5) 1분마다: * * * * *
6) 5분마다: */5 * * * *
7) 2시간마다 정각에: 0 */2 * * *
8) 매월 1일과 15일에 2시간마다: 0 */2 1,15 * *
CronJon Definition
- kind로 CronJob을 사용한다.
- 기존 컨트롤러의 template 필드와 다르게 jobTemplate 필드를 사용한다.
- CronJob은 Job을 컨트롤하기 때문에 jobTemplate 하위 부분은 Job Definition과 동일하게 사용할 수 있다.
- schedule 필드를 사용해 크론식을 등록한다. schedule에 등록한 크론식을 기반으로 jobTemplate을 해당 주기 간격으로 실행한다.
- apiVersion은 batch/v1beta1에서 batch/v1 로 변경되었다. (k8s v1.22 기준)
실습
- cronjob-exam.yaml 파일
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-exam
spec:
schedule: "* * * * *"
startingDeadlineSeconds: 300
# 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
출처: https://github.com/237summit/Getting-Start-Kubernetes/blob/main/6/cronjob-exam.yaml
- concurrencyPolicy: 기본값은 Allow이며 이는 한 번에 여러 개의 Job이 실행 중인 상황을 허용하는 설정이다. 위 예시에서는 schedule이 '* * * * *'이기 때문에 매 1분마다 jobTemplate이 실행되지만 만약 jobTemplate에 sleep 60 이상을 넣게 되면 위 Job이 동시에 2개 이상 실행되는 상황이 발생할 수 있다. 이를 허용하는 것이 'Allow'이다. 'Forbid'는 기존에 실행 중인 작업이 있으면 새로운 작업은 실행시키지 않는다. 즉, 동시에 실행 중인 job이 존재하지 않게 된다.
- startingDeadlineSeconds만큼 설정한 시간 안에 jobTemplate에 정의된 job을 실행을 못하면 해당 job을 취소시킨다.
- restartPolicy 부분은 Job 컨트롤러 정의에 해당한다.
- 1분마다 Pod가 생성되고 있음을 확인할 수 있다.
히스토리 개수 제한
위와 같이 매 1분마다 Pod에 대한 정보가 남겨진다면 리소스 낭비가 될 것이다. 따라서 아래와 같이 성공한 Job에 대해 남길 히스토리 최대 개수를 지정할 수 있다.
$ kubectl get cronjobs.batch -o yaml
- successfulJobsHistoryLimit 필드를 수정하여 남길 기록의 개수를 지정한다. 기본값은 3이다.
Reference
- 따배쿠, https://youtu.be/eAvoH0Cqd7E
- k8s docs CronJob, https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/
- k8s docs Automated Tasks with a CronJob, https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/
'[ DevOps ] > [ k8s ]' 카테고리의 다른 글
[k8s] 오토스케일링(HPA, VPA) 기본개념 (0) | 2023.07.01 |
---|---|
[k8s] Kustomize (0) | 2022.12.05 |
[k8s] Controller - Job (0) | 2022.09.27 |
[k8s] Controller - StatefulSet(sf) (0) | 2022.09.22 |
[k8s] Controller - DaemonSet (0) | 2022.09.16 |
- Total
- Today
- Yesterday
- github actions
- kafka
- Java
- Kubernetes
- 카프카
- Stream
- 코틀린
- ci/cd
- container
- 컨트롤러
- docker
- ubuntu
- jvm
- 쿠버네티스
- db
- spring
- rolling update
- golang
- go
- RDB
- 우분투
- argocd
- GitOps
- Non-Blocking
- helm
- LFCS
- Controller
- Linux
- K8s
- CICD
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |