Kubernetes/따라하면서 배우는 쿠버네티스

[쿠버네티스] 6-7. CronJob / 컨트롤러 총정리

맨날화남 2023. 8. 8. 14:16

https://youtu.be/eAvoH0Cqd7E

 

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

1분마다 실행이기에 바로 올라오지는 않는다
1분에 스케줄대로 pod가 생성되고 10초 후 완료
다시 1분 후 새로운 pod 생성

  • 근데 이렇게 놔두면 Completed 상태인 Pod들이 엄청나게 쌓이게 될 것인다.
  • cronjob을 yaml 형태로 확인해보자
  • kubectl get cronjob -o yaml

successfulJobsHistoryLimit 확인

  • successfulJobsHistoryLimit : 이 옵션으로 완료 pod 갯수 조절, 오래된 것부터 삭제, yaml에 포함 시킬 수 있음
$vi cronjob-exam.yaml
...
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: 5
  jobTemplate:
...

$kubectl apply -f cronjob-exam.yaml
  • yaml에 successfulJobsHistoryLimit를 추가하고 적용해보자

완료된 pod가 5개까지 늘어났다.

 

 

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 스케쥴링 예약 사용 지원