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

[CKAD] 한 번만 실행되는 Job부터 주기적인 CronJob까지 배치 작업 마스터하기!

by gasbugs 2026. 2. 5.

📑 목차

  1. Job: 끝이 있는 작업의 시작
  2. Job의 핵심 파라미터: 완료와 병렬성
  3. CronJob: 시간표대로 움직이는 배치
  4. CKAD 실전 팁: 명령어 한 줄로 시간 벌기
  5. Hands-on: 실전 연습 문제

 

개요: 쿠버네티스에서 배치(Batch) 작업이란? 🤔

쿠버네티스 클러스터 위에서 돌아가는 애플리케이션은 크게 성격에 따라 두 가지로 나눌 수 있습니다.

  1. 서비스형 (Long-running): 웹 서버, API 서버처럼 24시간 내내 실행되며 언제 들어올지 모르는 사용자의 요청을 기다리는 애플리케이션입니다. (주로 Deployment로 관리)
  2. 배치형 (Batch): 특정 목적을 달성하기 위해 실행되고, 할 일을 모두 마치면 스스로 '성공적으로 종료(Completed)'되는 애플리케이션입니다.

배치 작업은 쉽게 말해 "시작과 끝이 명확한 일회성 과제"입니다.

  • 예시:
    • 매일 새벽 3시에 수행하는 데이터베이스 백업
    • 쌓여있는 대용량 로그 데이터를 분석해서 결과 리포트 생성
    • 새로운 버전 배포 전 수행하는 데이터베이스 스키마 마이그레이션

쿠버네티스는 이러한 배치성 작업을 안정적으로 처리하기 위해 JobCronJob이라는 전용 리소스를 제공합니다. CKAD 시험에서는 이 둘의 차이점과 세부 설정 방법을 명확히 알고 있는지 물어봅니다.


 

 

1. Job: 끝이 있는 작업의 시작 🏁

일반적인 Deployment가 "24시간 내내 죽지 않고 떠 있어야 하는 서비스"라면, Job은 "맡은 일을 다 하면 우아하게 종료되는 작업"입니다.

  • 용도: 데이터베이스 마이그레이션, 배치 리포트 생성, 이미지 처리 등.
  • 핵심: Job에 속한 Pod는 작업이 성공적으로 완료되면 Completed 상태가 되며 종료됩니다.

💡 기본 YAML 구조

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-calculator
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never # Job에서는 반드시 Never 또는 OnFailure 사용
  backoffLimit: 4 # 실패 시 최대 재시도 횟수

⚠️ 주의: Job의 Pod 템플릿 안에서 restartPolicy는 절대 Always가 될 수 없습니다. 작업이 끝나면 종료되어야 하기 때문이죠!


2. Job의 핵심 파라미터: 완료와 병렬성 ⚙️

CKAD 시험에서는 단순히 Job을 만드는 것뿐만 아니라, 특정 횟수만큼 성공시키거나 동시에 여러 개를 띄우라고 요구합니다.

파라미터 설명
completions 총 몇 번의 성공적인 Pod 완료가 필요한가? (기본값 1)
parallelism 동시에 몇 개의 Pod를 띄울 것인가? (기본값 1)
activeDeadlineSeconds 작업이 이 시간(초)을 넘기면 강제로 종료함.
backoffLimit 실패 시 재시도 횟수. 넘어가면 실패로 간주.

3. CronJob: 시간표대로 움직이는 배치 ⏰

CronJob은 리눅스의 crontab처럼 정해진 시간에 주기적으로 Job을 생성하는 리소스입니다.

💡 크론 스케줄 문법 (Linux 표준)

* * * * * (분 시 일 월 요일)

  • */5 * * * *: 5분마다 실행
  • 0 0 * * *: 매일 자정에 실행

💡 주요 설정 포인트

  • concurrencyPolicy: 이전 작업이 안 끝났는데 다음 작업 시간이 됐을 때 어떻게 할까?
    • Allow (기본값): 그냥 또 띄움 (중복 실행)
    • Forbid: 이전 거 끝날 때까지 이번 건 건너뜀
    • Replace: 이전 거 죽이고 새 거 띄움
  • successfulJobsHistoryLimit: 성공한 기록을 몇 개나 남길지 결정 (기본 3).

 

CronJob YAML 작성 예시

apiVersion: batch/v1
kind: CronJob
metadata:
  name: etcd-backup-cronjob
  namespace: kube-system # 시스템 관리 리소스이므로 주로 kube-system에 배치
spec:
  schedule: "0 3 * * * " # 매일 새벽 3시 0분에 실행 (분 시 일 월 요일)
  concurrencyPolicy: Forbid # 이전 백업이 안 끝났으면 이번 회차는 건너뜀 (데이터 충돌 방지)
  successfulJobsHistoryLimit: 5 # 성공한 백업 기록(Job)은 최신 5개까지만 보관
  failedJobsHistoryLimit: 2     # 실패한 기록은 2개까지만 보관
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: etcd-backup
            image: busybox # 실제 환경에서는 etcdctl이 포함된 이미지를 사용
            command:
            - /bin/sh
            - -c
            - echo "Starting etcd backup..."; date; echo "Backup to MetaKage completed!"
          restartPolicy: OnFailure # 실패 시에만 다시 시도

 

 

 

4. CKAD 실전 팁: 명령어 한 줄로 시간 벌기 ⏱️

시험은 속도전입니다! YAML을 처음부터 치지 마세요.

1) Job 생성 (Imperative)

# 1. 기본 Job 생성
kubectl create job my-job --image=busybox -- echo "Hello"

# 2. YAML로 뽑아서 옵션 수정 (completions 등)
kubectl create job complex-job --image=busybox --dry-run=client -o yaml > job.yaml

2) CronJob 생성

kubectl create cronjob my-cron --image=busybox --schedule="*/1 * * * *" -- echo "Time to work!"

5. Hands-on: 실전 연습 문제 🛠️

아래 조건을 터미널에서 직접 구현해 보세요.

 

시나리오:

  1. 네임스페이스 batch-ns를 생성하세요.
  2. busybox 이미지를 사용하여 ping-job이라는 이름의 Job을 만드세요.
  3. 이 Job은 총 5번 성공(completions)해야 하며, 동시에 2개(parallelism)씩 실행되어야 합니다.
  4. 실행 명령은 ping -c 3 google.com 입니다.
# 풀이
kubectl create ns batch-ns
kubectl create job ping-job --image=busybox -n batch-ns --dry-run=client -o yaml -- ping -c 3 google.com > job.yaml

# vi job.yaml 수정
# spec 바로 밑에 completions: 5, parallelism: 2 추가

kubectl apply -f job.yaml
kubectl get pods -n batch-ns -w # Pod가 2개씩 뜨고 사라지는지 확인!