본문 바로가기
클라우드/쿠버네티스

⏰ 일회성 임무부터 주기적인 알람까지! 쿠버네티스 Job & CronJob 완전 정복

by gasbugs 2025. 9. 3.

안녕하세요, 쿠버네티스 엔지니어 여러분! 🚀 우리가 평소에 다루는 대부분의 애플리케이션은 웹 서버처럼 영원히 실행되는(long-running) 서비스들입니다. 하지만 모든 작업이 그런 것은 아니죠. "데이터베이스 스키마를 딱 한 번만 최신 버전으로 마이그레이션해줘" 라거나 "매일 아침 9시에 어제 자 리포트를 생성해서 이메일로 보내줘" 와 같은 작업도 분명히 필요합니다.

 

이러한 배치(Batch) 및 스케줄링 작업을 위해 쿠버네티스는 아주 훌륭한 두 가지 도구를 제공합니다. 바로 Job(잡)과 CronJob(크론잡)입니다. 오늘은 이 두 리소스가 무엇이고, 언제 어떻게 사용해야 하는지 자세히 알아보겠습니다!


1. Job: 딱 한 번의 임무를 완수하라! 🎯

Job은 한 번 실행되고 성공적으로 완료되면 종료되는 작업을 정의하는 리소스입니다. 웹 서버처럼 계속 살아있는 것이 아니라, 주어진 임무를 완수하는 것이 목적인 파드(Pod)를 관리합니다.

  • 역할: 하나 이상의 파드를 생성하여, 지정된 수의 파드가 성공적으로 완료될 때까지 실행을 보장합니다.
  • 핵심 동작:
    • Job은 파드를 생성하고, 해당 파드 내의 컨테이너가 성공적으로 종료(Exit Code 0)되기를 기다립니다.
    • 만약 파드가 노드 장애나 컨테이너 에러 등으로 실패하면, Job 컨트롤러는 restartPolicy에 따라 파드를 다시 생성하여 작업을 재시도합니다. (OnFailure 또는 Never만 사용 가능)
    • 설정된 완료 횟수(completions)에 도달하면 Job은 성공적으로 종료됩니다.
  • 주요 사용 사례:
    • 데이터베이스 스키마 마이그레이션
    • 초기 데이터 설정 또는 대용량 데이터 처리
    • 보고서 생성 또는 데이터 백업 (일회성)
  • 비유: Job은 특수 요원에게 주어진 '일회성 임무' 🕵️‍♂️와 같습니다. 목표(작업)를 완수하면 조용히 사라지는 것이죠. 임무 수행 중 문제가 생기면, 본부(Job 컨트롤러)에서 다른 요원(새 파드)을 투입하여 임무를 완수시킵니다.

YAML 예시:

Pi 값 계산을 1000자리까지 수행하고 종료되는 간단한 Job 예시입니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-calculation
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(1000)"]
      restartPolicy: OnFailure # 실패 시에만 파드를 다시 생성
  backoffLimit: 4 # 최대 4번까지 재시도

2. CronJob: 정해진 시간에 임무를 반복하라! 🗓️

CronJob은 이름에서 알 수 있듯이, Job을 스케줄에 따라 주기적으로 실행해주는 리소스입니다. 리눅스의 crontab과 거의 동일한 개념을 쿠버네티스 네이티브 방식으로 구현한 것입니다.

  • 역할: 지정된 크론(cron) 스케줄에 따라 Job 리소스를 자동으로 생성합니다.
  • 핵심 동작:
    • CronJob 컨트롤러는 현재 시간을 계속 확인하다가, schedule 필드에 정의된 시간과 일치하면 해당 CronJob의 템플릿을 사용하여 새로운 Job을 생성합니다.
    • 생성된 Job은 위에서 설명한 대로 자신의 임무를 수행하고 종료됩니다.
    • CronJob은 이전 실행 기록(성공/실패한 Job)을 정해진 수만큼 보관하여 히스토리 추적을 돕습니다.
  • 주요 사용 사례:
    • 주기적인 데이터 백업
    • 매일, 매주, 매월 보고서 생성 및 발송
    • 캐시 비우기, 데이터 동기화 등 정기적인 유지보수 작업
  • 비유: CronJob은 매일 아침 같은 시간에 울리는 '알람 시계' ⏰와 같습니다. 알람이 울릴 때마다(스케줄 도달), 특정 행동(Job 실행)을 하도록 만드는 것이죠.

YAML 예시:

매 분마다 "Hello from Kubernetes cluster"를 출력하는 CronJob 예시입니다.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello-cronjob
spec:
  schedule: "*/1 * * * *" # 매 1분마다 실행 (Cron 스케줄 형식)
  jobTemplate:             # 이 템플릿을 사용하여 Job을 생성
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox:1.28
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo "Hello from Kubernetes cluster"
          restartPolicy: OnFailure
  successfulJobsHistoryLimit: 3 # 성공한 Job 기록은 3개까지 보관
  failedJobsHistoryLimit: 1     # 실패한 Job 기록은 1개까지 보관

🎉 결론: 자동화의 날개를 달아주는 Job과 CronJob

Job과 CronJob은 쿠버네티스 환경에서 수동으로 처리해야 했던 많은 일회성 및 반복 작업을 자동화하여 운영 효율성을 극대화해주는 강력한 도구입니다.

  • 딱 한 번만 실행하고 끝낼 작업이 필요하다면 Job을,
  • 정해진 스케줄에 따라 작업을 반복해야 한다면 CronJob을 사용하세요.

이 두 리소스를 잘 활용하여 단순 반복 업무에서 벗어나 더 창의적인 일에 집중하는 스마트한 쿠버네티스 전문가가 되시길 바랍니다!