[k8s] Controller - CronJob

2022. 10. 1. 15:18[ DevOps ]/[ k8s ]

 

 

CronJob

- Deployment와 ReplicaSet의 관계처럼 CronJob에도 Job의 기능이 포함되어 있다.

- Deployment가 ReplicaSet을 컨트롤하여 Rolling Update를 지원했던 것처럼 CronJob은 Job을 컨트롤해서 원하는 특정 시간에 Job이 실행될 수 있도록 작업 '예약' 기능을 지원한다.

- 예를 들어, 이메일을 주기적으로 보내는 작업, 로그파일을 주기적으로 정리하는 작업, 데이터 백업 작업, 가비지 데이터를 주기적으로 삭제해주는 작업 등 특정 주기를 가지고 반복해서 실행해주는 작업에 대해 CronJob으로 정의할 수 있다.

- 애플리케이션이 비정상적으로 동작하여 Pod를 재시작하거나 컨테이너를 재시작하는 것은 Job 컨트롤러 고유의 기능이며 CronJob은 이러한 Job 컨트롤러를 제어하면서 주기적으로 실행하는 기능을 더한 컨트롤러이다.

 

 

 

 

 


 

 

CronJob 표기식

- CronJob은 유닉스, 리눅스에서 사용하는 크론잡과 표기식이 동일하다.

 

https://code.tutsplus.com/tutorials/scheduling-tasks-with-cron-jobs--net-8800

 

 

예시

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