Cloud/k8s-CKAD

[CKAD] Jobs과 Cron Job

jinkwon.kim 2024. 9. 14. 11:49
728x90
반응형

 

개요

Job과 Cron Job을 알아보겠습니다. 

Job

정의

Job은 Kubernetes에서 일회성 작업을 실행하는 리소스입니다. Job은 특정 작업이 성공적으로 완료될 때까지 하나 이상의 Pod를 실행하고 관리합니다. 

형태

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  completions: 5              # 총 5번의 작업을 수행
  parallelism: 2              # 동시에 2개의 작업을 병렬로 실행
  backoffLimit: 4             # 작업 실패 시 최대 4번까지 재시도
  template:
    spec:
      containers:
      - name: example
        image: busybox
        command: ["sh", "-c", "echo Hello, Kubernetes! && exit 1"]  # 의도적으로 실패하게 설정
      restartPolicy: Never       # Pod 실패 시 재시작하지 않음

목적

단일 실행 작업

  • 지정한 작업이 성공할 때까지 한 번만 실행합니다.

다수 반복 실행 작업

  • 여러 번 같은 작업을 실행하여 모든 작업이 성공할 때까지 관리합니다.
  • 관련 옵션 : completions: 5 # 총 5번의 작업을 수행

병렬 처리 작업

  • 작업을 여러 개의 Pod로 나누어 병렬로 실행할 수 있습니다.
  • 관련 옵션 : parallelism: 2 # 동시에 2개의 작업을 병렬로 실행

Pod재시작 원칙

Pod가 실패하면 새로운 Pod가 생성되어 작업을 다시 시도합니다.

관련 옵션

  • restartPolicy

온셥 값 및 설명

  • Never: (기본값) Pod가 실패하면 재시도하지 않고, Job 전체가 실패로 간주됩니다. 새로운 Pod가 생성됨
  • OnFailure: Pod가 실패할 때마다 재시도합니다. Pod의 Restart Count가 올라감.

Job은 기본적으로 Pod의 실패를 감지하고, Pod를 재생성하여 작업을 다시 수행하려고 시도합니다.

실패 처리 원칙

Pod가 실패하면 기존 Pod를 재사용하지 않고 새로운 Pod를 생성하여 재시도합니다.

그리고 실패한 Pod는 남겨 Debug을 위해서 남겨둡니다.  로그는 아래와 같이 남습니다. 

 

재시도 횟 수 설정

Job이 실패했을 때 몇 번까지 재시도할지 정의할 수 있습니다

 

관련 옵션

  • backoffLimit:

옵션 값 및 설명

기본값은 6으로, Job이 6번 실패하면 더 이상 재시도하지 않고 Job은 실패로 간주됩니다

재시도 간격

처음에는 10초 정도의 대기 후 재시도가 이루어지며, 이후 재시도 간격은 이전 간격보다 2배씩 증가합니다.

job에서의 재시도 간격을 조절하는 것은제공 하지 않습니다.세밀하게 조정 할며녀 Custom Contoller나 CronJob을 사용해야 합니다. 

 

CronJob

정의

CronJob은 Kubernetes에서 주기적으로 실행되는 Job을 관리하는 리소스입니다. Linux의 Cron처럼 정해진 시간에 주기적으로 Job을 실행할 수 있도록 설정됩니다. CronJob은 스케줄된 주기에 맞춰 Job을 생성하고, 그 Job이 작업을 완료하도록 관리합니다.

형태

JobTemplate부분은 Job과 동일 합니다.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: example-cronjob
spec:
  schedule: "*/5 * * * *"   # 5분마다 실행
  concurrencyPolicy: Forbid  # 동시에 여러 Job 실행을 금지
  startingDeadlineSeconds: 300  # 5분 내에 실행되지 않으면 다음 스케줄로 넘어감
  jobTemplate:
    spec:
      backoffLimit: 4       # Job이 실패했을 때 최대 4번 재시도
      parallelism: 2        # 동시에 2개의 작업을 병렬로 실행
      completions: 5        # 총 5개의 작업을 완료할 때까지 실행
      activeDeadlineSeconds: 600  # Job이 최대 10분 안에 완료되지 않으면 강제 종료
      template:
        spec:
          containers:
          - name: example
            image: busybox
            command: ["sh", "-c", "echo Hello, Kubernetes!"]
          restartPolicy: OnFailure  # 실패 시 재시도
  successfulJobsHistoryLimit: 3   # 성공한 Job 기록 보관 개수
  failedJobsHistoryLimit: 1       # 실패한 Job 기록 보관 개수

 

각필드 설명

apiVersion: batch/v1

CronJob 리소스의 API 버전입니다.

kind

CronJob: 리소스의 종류가 CronJob임을 명시합니다.

metadata

CronJob의 메타데이터, 이름을 지정합니다.

schedule

크론 표현식을 사용하여 작업이 실행될 주기를 설정합니다.

  • 위 예시는 5분마다 작업이 실행되도록 설정된 것입니다.
  • 크론 표현식은 분 시 일 월 요일 형식으로 구성되며, *는 모든 값에 매칭됨을 의미합니다.

concurrencyPolicy : 동시에 실행될 수 있는 Job의 개수를 제어하는 옵션입니다.

 

  • Allow (기본값):
    • 동시에 여러 Job이 실행될 수 있도록 허용합니다.
    • 즉, 이전 Job이 아직 실행 중이더라도 새로운 Job이 스케줄링되면 둘 다 실행됩니다.
  • Forbid:
    • 이전 Job이 아직 실행 중일 경우, 새로운 Job의 실행을 막습니다.
    • 즉, 한 번에 하나의 Job만 실행될 수 있으며, 새로운 스케줄의 Job은 건너뛰고 실행되지 않습니다.
  • Replace:
    • 이전 Job이 실행 중일 경우, 실행 중인 Job을 종료하고 새로운 Job을 실행합니다.
    • 즉, 새로운 Job이 기존의 실행 중인 Job을 교체하는 방식으로 동작합니다.

startingDeadlineSeconds : Job을 실행할 수 있는 최대 지연 시간(초)을 설정합니다. 해당 시간안에 Job이 실행되지 않으면 해당 Job은 무시합니다.

  • Ex) startingDeadlineSeconds: 300 # 5분 이내에 실행되지 않으면 Job을 건너뜀

 

jobTemplate: 실행될 Job의 템플릿입니다. CronJob은 일정에 맞춰 Job을 생성하므로, Job의 템플릿을 정의합니다.

  • containers: 실행할 컨테이너와 명령을 정의합니다. 여기서는 busybox 이미지를 사용해 "Hello, Kubernetes!" 메시지를 출력하는 작업을 실행합니다.
  • restartPolicy: (OnFailure가 기본) Job이 실패했을 때 Pod를 재시작하도록 설정합니다.

successfulJobsHistoryLimit: 성공한 Job의 히스토리를 3개까지 보관합니다.

failedJobsHistoryLimit: 실패한 Job의 히스토리를 1개까지 보관합니다.

 

Job과의 관계 

목적

정기 작업 자동화

매일, 매주, 매월 또는 사용자 정의 주기로 자동으로 작업을 실행할 수 있습니다.

시간 기반 작업 관리

예를 들어, 특정 시간에 시스템 로그를 정리하거나 데이터베이스 백업을 수행하는 등의 작업을 설정할 수 있습니다.

유연한 스케줄링

표준 크론 표현식을 사용해 매우 유연한 스케줄링을 설정할 수 있습니다.

 

CronJob schedule 표현식

* * * * *
| | | | |
| | | | └─── 요일 (0 - 6) (일요일이 0)
| | | └────── 월 (1 - 12)
| | └────────── 일 (1 - 31)
| └───────────── 시 (0 - 23)
└──────────────── 분 (0 - 59)

크론 표현식 예시:

  • "*/5 * * * *": 매 5분마다 실행
  • "0 0 * * *": 매일 자정에 실행
  • "0 9 * * 1": 매주 월요일 오전 9시에 실행
  • "30 22 * * *": 매일 오후 10시 30분에 실행

사용 사례

데이터베이스 백업: 매일 자정에 데이터베이스 백업을 자동으로 수행.

로그 파일 정리: 매주 일정 시간에 시스템 로그를 정리.

정기적인 모니터링 작업: 주기적으로 상태 모니터링 작업을 실행하여 시스템의 상태를 확인.

보고서 생성: 매달 말일에 자동으로 보고서를 생성하여 이메일로 발송하는 작업.

동작 방식

  1. 지정된 스케줄(schedule) 에 맞춰 Kubernetes는 Job을 자동으로 생성하고 실행합니다.
  2. Job이 성공적으로 완료되면, 성공한 Job의 기록이 보관됩니다.
  3. successfulJobsHistoryLimitfailedJobsHistoryLimit을 통해 성공 및 실패한 Job의 히스토리를 제한된 개수만큼 유지할 수 있습니다.
  4. 지정된 주기에 따라 새로운 Job이 계속해서 실행됩니다.

CronJob에서 사용 가능한 Job의 기능

backofflimit : Job이 실패했을때 몇 번 재시도 할지를 설정 합니다. 

parallelism : 동시에 몇개의 Pod를 병렬로 실행하지 설정 합니다. 

completions : 총 몇개의 작업을 완료할 떄까지 실행할지 설정합니다.

activeDeadlineSecond : Job이 실행되는 최대 시간을 설정하여, 그 시간이 지나면 Job을 가제 종료 할수 있습니다.

ttlSecondsAfterFinished : job이 완료된 후 얼마나 오래 Pod의 리소스를 보존할지 설정 할 수 있습니다. 

 

  • CronJob에서 생성된 Job이 끝난 후 Pod의 기록을 자동으로 정리할 때 유용합니다.

restartPolicy : Pod가 실패했을때 재시도할지 여부를 설정합니다. 

  • Never: Pod가 실패하면 재시도하지 않고, Job 전체가 실패로 간주됩니다.
  • OnFailure: Pod가 실패할 때마다 재시도합니다.

 

정리

 

  • Job: 일회성 작업을 완료할 때까지 Pod를 실행하고 관리하는 Kubernetes 리소스.
  • CronJob: 주기적으로 Job을 생성하여 반복적인 작업을 자동으로 실행하는 Kubernetes 리소스.

 

728x90
반응형