본문 바로가기
K8s/Core Concept

[K8s] Jobs & CronJobs

by okms1017 2024. 11. 26.
728x90

✍ Posted by Immersive Builder  Seong

 

Jobs

컨테이너가 수행하는 워크로드에는 여러가지 종류가 있습니다. 웹, 어플리케이션, 데이터베이스와 같이 수동으로 중단하기 전까지 장시간 실행되는 워크로드와 배치 프로세스, 분석, 리포팅 등 특정 작업을 짧은 시간동안만 수행하고 완료되는 워크로드가 있습니다. 이중에서 특정 작업을 완료하기 위해 파드 세트를 실행하는 쿠버네티스 오브젝트가 바로 Job입니다.

 

Job은 매니페스트 파일로 정의하여 생성할 수 있습니다. 아래의 예시에서 Job은 bpi 연산을 수행하는 파드를 생성하고, 연산이 완료되면 화면에 출력한 후 컨테이너를 종료합니다. 이 때 파드는 Completed 상태가 되고, Job은 restartPolicy 정책에 따라 파드를 재시작하지 않습니다. 그리고 Job을 삭제하면 파드도 함께 삭제됩니다. 

 


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

 

  • completions : 작업을 완료하기 위한 파드의 개수 
  • parallelism : 병렬로 실행할 파드의 개수 
  • backoffLimit : 작업이 완료될 때까지 파드 생성을 시도하는 횟수 
  • restartPolicy : 파드 재시작 정책 ex) Never - 재시작하지 않음, OnFailure - 실패한 경우에만 재시작

 


CronJobs

CronJob

CronJob은 반복되는 일정에 따라 Job을 생성하고 실행합니다. CronJob은 백업, 리포팅 등 정기적으로 예약된 작업을 수행하기 위한 쿠버네티스 오브젝트입니다. Cron 데몬은 지속적으로 시스템 시간과 작업 예약 시간이 일치하는지 체크합니다. 그리고 Cron 데몬은 시스템 시간과 작업 예약 시간이 일치하면 새로운 프로세스를 포크하고 시스템 콜을 호출하여 작업을 수행합니다. 

 

CronJob은 매니페스트 파일을 정의하여 생성할 수 있고, 주요 필드는  schedule jobTemplate 입니다. 

 


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

 

  • schedule : Cron 형식의 스트링 값으로 작업이 수행될 시간을 예약
  • jobTemplate : 실제 수행될 작업의 내용을 표시 

 

Schedule syntax 

CronJob을 구현하기 위한 Cron 형식은 리눅스의 Crontab 문법을 그대로 따릅니다. 

 

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday)
# │ │ │ │ │                                   OR sun, mon, tue, wed, thu, fri, sat
# │ │ │ │ │ 
# │ │ │ │ │
   * * * * *

 

월별, 주별, 일별 등 자주 사용하는 표준 형식은 아래와 같습니다. 

 

Entry Description Cron Expression
@yearly Run once a year at midnight of 1 January 0 0 1 1 *
@monthly Run once a month at midnight of the first day of the month  0 0 1 * *
@weekly Run once a week at midnight on Sunday morning 0 0 * * 0
@daily Run once a day at midnight  0 0 * * *
@hourly Run once an hour at the beginning of the hour 0 * * * *
*/2 Run every 2 minutes */2 * * * *
*/2, 8-17 Run every 2 minutes between 8 AM and 5 PM */2 8-17 * * *
*/5, 17-19, '6,7' Every 5 minutes between 5 PM and 7 PM on weekends */5 17-19 * * 6,7
0,12 Run at midnight and noon every day 0 0,12 * * *
0-23/2 Run every 2 hours starting at midnight 0 0-23/2 * * *
1,15 Run at midnight on the 1st and 15th of every month 0 0 1,15 * *

 

Job Template

.spec.jobTemplate 필드는 CronJob이 생성하는 Job의 템플릿을 정의하며 필수입니다. apiVersion 또는 kind를 제외하면 Job과 정확히 동일한 형식을 가집니다. 그리고 레이블이나 주석 등 공통 메타데이터를 여기에 지정할 수 있습니다.

 

Concurrency Policy

.spec.concurrencyPolicy 필드는 옵션입니다. CronJob에 의해 생성된 작업들의 동시 실행을 처리하는 정책을 지정합니다. 아래의 정책 중 하나를 지정할 수 있습니다. 

 

  • Allow : 동시 실행 허용(기본값) 
  • Forbid : 동시 실행 비허용 
  • Replace : 새 Job을 실행할 시간이고 이전 Job 실행이 끝나지 않은 경우, 현재 실행 중인 Job을 새 Job으로 대체함 
 
 

[출처]

1) https://kubernetes.io/docs/concepts/workloads/controllers/job/

 

Jobs

Jobs represent one-off tasks that run to completion and then stop.

kubernetes.io

2) https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/

 

CronJob

A CronJob starts one-time Jobs on a repeating schedule.

kubernetes.io

728x90

'K8s > Core Concept' 카테고리의 다른 글

[K8s] Liveness Probes 란?  (0) 2024.11.24
[K8s] Readiness Probes 란?  (0) 2024.11.23
[K8s] 소프트웨어 배포 전략(Software Deployment Strategies)  (0) 2024.11.19
[K8s] CoreDNS 란?  (0) 2024.11.16
[K8s] Helm 이란?  (1) 2024.11.14