CronJOB Contoller
- CronJOB 안에 JOB 컨트롤 기능이 포함되어 있다.
- Deployment가 Replicaset을 컨트롤해서 Rolling Update를 지원했던 것처럼 CronJOB은 JOB을 제어해서 사용자가 원하는 시간에 JOB이 실행될 수 있도록 작업 예약을 지원하는 Controller
- Job Controller로 실행할 Application Pod를 주기적으로 반복해서 실행
- Linux의 cronjob의 스케줄링 기능을 Job Controller에 추가한 API
- 다음과 같이 반복해서 실행하는 Job을 운영해야 할 때 사용
- Data Backup
- Send email
- Cleaning tasks
- Cronjob Schedule : " 0 3 1 * *"
- 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, 0은 일요일, 1부터 월요일 )
- 0-4 식으로 범위 설정 가능, *은 전부
- Job이 쿠버에 pod를 생성해달라고 job controller에 요청
- job controller는 pod를 실행하고 그 pod가 완료되면 complete 상태로 끝난다.
- cronjob은 complete 상태로 끝나는게 아니라 설정한 스케쥴대로 정해진 기간마다 반복해서 실행
- 이것이 cronjob controller
CronJob Schedule
분 ( 0-59 ) | 시 ( 0-23 ) | 일 ( 1-31 ) | 월 ( 1-12 ) | 요일 ( 0-6 ) |
0 | 9 | 1 | * | * |
- 매월 1일 아침 9시 정각에 Job을 실행
분 ( 0-59 ) | 시 ( 0-23 ) | 일 ( 1-31 ) | 월 ( 1-12 ) | 요일 (0-6 ) |
0 | 3 | * | * | 1-5 |
- 주중(월~금) 새벽 3시에 job을 실행
- 주말(토~일)이라면 0,6
분 ( 0-59 ) | 시 (0-23 ) | 일 ( 1-31 ) | 월 ( 1-12 ) | 요일 ( 0-6 ) |
*/5 | * | * | * | * |
- job을 5분마다 한번씩 실행
- *만 적는다면 매분(1분)마다 작업을 수행한다.
- * 옆에 /숫자를 넣는다면 그 숫자마다 돌린다 /5를 넣으면 5분마다 /10을 넣는다면 10분마다
분 ( 0-59 ) | 시 (0-23 ) | 일 ( 1-31 ) | 월 ( 1-12 ) | 요일 ( 0-6 ) |
0 | */2 | * | * | * |
- 2시간마다 매시 정각에 실행
- 만약 일에 1,15는 넣는다면 매월 1일과 15일에 2시간마다 실행
CronJob definition
Job definition | CronJob definition |
apiVersion: batch/v1 kind: Job metadata: name: centos-job spec: template: spec: containers: - name: centos-container image: centos:7 command: ["bash"] args: - "-c" - "echo 'Hello'; sleep 5; echo 'Bye'" restartPolicy: Never |
apiVersion: batch/v1 kind: CronJob metadata: name: cronjob-definition spec: schedule: "0 3 1 * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello restartPolicy: Never |
- Job과 CronJob의 spec 내용은 같고 스케줄을 추가해준 것이 CronJob
- 영상에서는 쿠버네티스가 구버전이라 CronJob의 apiVersion을 v1beta1로 해놨지만 최신버전에서는 그대로 v1 사용
CronJob example(1)
$cat cronjob-exam.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-exam
spec:
schedule: "* * * * *"
startingDeadlineSeconds: 500
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- echo Hello; sleep 10; echo Bye
restartPolicy: Never
- 1분마다 실행
- startingDeadlineSeconds : 500초 안에 JobTemplate에 정의된 애플리케이션이 실행을 못하면 그 작업을 취소시키겠다.
- concurrencyPolicy
- Forbid : 실행 상태인 Job이 있을 경우 다음 Job을 실행해야할 시간이 오더라도 실행하지 않음
- Allow : 기본값, CronJob이 여러개의 Job을 동시에 실행, 80초 슬립이라 1분안에 안끝나도 1분마다 하나 더 실행
- Replace : 실행 상태인 Job이 있을 경우 실행중인 Job을 종료시키고 다음 실행해야 할 Job을 실행
- Hello 출력 ,10초 대기, Bye 출력
TEST
- 근데 이렇게 놔두면 Completed 상태인 Pod들이 엄청나게 쌓이게 될 것인다.
- cronjob을 yaml 형태로 확인해보자
- kubectl get cronjob -o yaml
- successfulJobsHistoryLimit : 이 옵션으로 완료 pod 갯수 조절, 오래된 것부터 삭제, yaml에 포함 시킬 수 있음
$vi cronjob-exam.yaml
...
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 5
jobTemplate:
...
$kubectl apply -f cronjob-exam.yaml
- yaml에 successfulJobsHistoryLimit를 추가하고 적용해보자
Controller 총정리
- Replication Controller : pod의 개수를 보장해주는 가장 Basic한 Controller
- Replicaset : Replication Controller에 Label과 Selector를 넣어서 Matchlabel등 풍부한 Label를 지원
- Deployment : Replicaset을 제어 ( Rolling Update / Roll Back )
- DaemonSet : Node당 1개씩 실행되도록 보장
- StatefulSet : Pod의 이름을 보장
- Job : 배치처리에 유용, Pod가 정상적인 종료인지 아닌지 판단해서 리스타트할지 완료시킬지 결정
- CronJob : Job 스케쥴링 예약 사용 지원