본문 바로가기

About/Kubernetes

[k8s] Job/CronJob

Job/CronJob은 웹 서버와 같은 상주 서비스가 아니라 집계 등과 같은 배치 처리 또는 기계학습이나 수치해석과 같은 프로그램의 시작부터 종료까지로 완료되는 작업을 실행하기 위한 리소스입니다.

Job(잡)

잡은 실행된 후 종료해야 하는 성격의 작업을 실행시킬 때 사용하는 컨트롤러입니다. 특정 개수만큼의 파드를 정상적으로 실행 종료함을 보장합니다. 예를 들어 데이터베이스 마이그레이션과 같이 한 번의 잡으로 처리가 끝나는 것에 이용합니다.

잡에서 하나 이상의 파드를 생성하고 지정된 수의 파드가 성공적으로 종료될 때 까지 계속해서 파드의 실행을 재시도합니다. 지정된 수 만큼 파드가 성공적으로 완료되면, 작업(즉, 잡)이 완료됩니다. 잡을 삭제하게되면 생성한 파드가 정리되며, 일시 중지하게 되면 작업이 다시 재개할 때 까지 활성 파드는 삭제됩니다.

잡을 사용해서 파드를 병렬로 실행할 수도 있으며, 잡을 스케쥴에 따라 구동하고 싶은 경우 CronJob을 사용합니다.

Job 사용해보기

다음은 잡 설정 예시이며, perl을 이용하여 파이(π)의 2000자리 까지 계산해서 출력합니다. 이를 완료하는데는 약 10초의 시간이 소요됩니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never #1
  backoffLimit: 4 #2

#1 .spec.template.spec.restartPolicy 필드는 Never로 설정하여 파드가 항상 성공으로 종료되도록 합니다. Never 외에도 OnFailure도 설정할 수 있는데, 이는 파드 안 컨테이너가 비정상적으로 종료된 경우 컨테이너를 다시 시작하도록 합니다.

#2 .spec.bacoffLimit 필드는 잡 실행이 실패했을 때 자동으로 몇 번까지 재시작할 것인지 설정합니다. 파드 비정상 실행 종료의 백오프 정책이라고도 합니다.

위의 구성을 job.yaml로 저장하고 다음과 같은 명령어로 클러스터에 적용합니다.

kubectl apply -f job.yaml

그리고나서 잡 상태를 확인합니다.

kubectl describe job pi

Start Time, Completed At, Duration, Pods Statuses를 살펴보면 48초 동안 파드 하나를 실행하고 정상적으로 종료한 것을 확인할 수 있습니다.

 

CronJob(잡)

CronJob은 정해진 타이밍에 반복할 Job 실행에 사용하는 리소스입니다. 지정한 시간에 잡을 실행하거나 지정한 시간동안 주기적으로 잡을 반복 실행할 수 있습니다. 스토리지, 데이터베이스 백업 이나 메일 송신 등과 같은 처리에 사용합니다. 시간을 지정할 때는 리눅스나 유닉스의 cron 명령어에서 사용하는 옵션 형식을 그대로 사용합니다.

CronJob 사용해보기

다음과 같이 cronjob.yaml을 구성합니다. 현재 시간과 hello 메시지를 1분마다 출력하는 예시입니다.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *" # 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox # 2
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

#1에 사용된 크론 스케쥴 문법은 다음과 같습니다.

크론 스케줄 문법

#      ┌────────────────── 타임존 (옵션)
#      |      ┌───────────── 분 (0 - 59)
#      |      │ ┌───────────── 시 (0 - 23)
#      |      │ │ ┌───────────── 일 (1 - 31)
#      |      │ │ │ ┌───────────── 월 (1 - 12)
#      |      │ │ │ │ ┌───────────── 요일 (0 - 6) (일요일부터 토요일까지;
#      |      │ │ │ │ │                           특정 시스템에서는 7도 일요일)
#      |      │ │ │ │ │
#      |      │ │ │ │ │
# CRON_TZ=UTC * * * * *

 

항목 설명 표현
@yearly (or @annually) 매년 1월 1일 자정에 실행 0 0 1 1 *
@monthly 매월 1일 자정에 실행 0 0 1 * *
@weekly 매주 일요일 자정에 실행 0 0 * * 0
@daily (or @midnight) 매일 자정에 실행 0 0 * * *
@hourly 매시 0분에 시작 0 * * * *

따라서 schedule: "*/1 * * * *"는 매 1분마다 실행호도록 설정하는 것입니다.

schedule: "*/1 * * * *"

 

CronJob 실행 

다음 명령어로 CronJob을 실행합니다.

kubectl apply -f cronjob.yaml

그리고 kubectl get cronjobs 명령어로 크론잡의 스케줄 설정을 확인할 수 있습니다.

SUSPEND 항목은 현재 이 크론잡이 정지되었는 지 확인하며, ACTIVE 항목은 실행중인 잡 수를 나타냅니다.

kubectl get jobs 명령어를 입력하면 CronJob에 해당하는 잡들이 나타납니다.

kubectl get jobs

hello-xxxxxx라는 이름으로 잡이 생성된 것을 확인할 수 있습니다.

그리고 파드들을 확인하면 각 Job에 해당하는 파드들이 생성된 것을 볼 수 있습니다.

kubectl get pods

마지막으로 이 파드들의 로그를 확인해보면 처음 매니페스트 파일에서 설정한대로 출력되는 것을 확인할 수 있습니다.

kubectl logs <파드명>


Job과 CronJob에 대하여 알아보았습니다.

참고