📑 목차
- Job: 끝이 있는 작업의 시작
- Job의 핵심 파라미터: 완료와 병렬성
- CronJob: 시간표대로 움직이는 배치
- CKAD 실전 팁: 명령어 한 줄로 시간 벌기
- Hands-on: 실전 연습 문제
개요: 쿠버네티스에서 배치(Batch) 작업이란? 🤔
쿠버네티스 클러스터 위에서 돌아가는 애플리케이션은 크게 성격에 따라 두 가지로 나눌 수 있습니다.
- 서비스형 (Long-running): 웹 서버, API 서버처럼 24시간 내내 실행되며 언제 들어올지 모르는 사용자의 요청을 기다리는 애플리케이션입니다. (주로 Deployment로 관리)
- 배치형 (Batch): 특정 목적을 달성하기 위해 실행되고, 할 일을 모두 마치면 스스로 '성공적으로 종료(Completed)'되는 애플리케이션입니다.
배치 작업은 쉽게 말해 "시작과 끝이 명확한 일회성 과제"입니다.
- 예시:
- 매일 새벽 3시에 수행하는 데이터베이스 백업
- 쌓여있는 대용량 로그 데이터를 분석해서 결과 리포트 생성
- 새로운 버전 배포 전 수행하는 데이터베이스 스키마 마이그레이션
쿠버네티스는 이러한 배치성 작업을 안정적으로 처리하기 위해 Job과 CronJob이라는 전용 리소스를 제공합니다. 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: 실전 연습 문제 🛠️
아래 조건을 터미널에서 직접 구현해 보세요.
시나리오:
- 네임스페이스 batch-ns를 생성하세요.
- busybox 이미지를 사용하여 ping-job이라는 이름의 Job을 만드세요.
- 이 Job은 총 5번 성공(completions)해야 하며, 동시에 2개(parallelism)씩 실행되어야 합니다.
- 실행 명령은 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개씩 뜨고 사라지는지 확인!
'클라우드 > 쿠버네티스' 카테고리의 다른 글
| [CKAD] 쿠버네티스의 심장, Deployment로 선언적 배포 마스터하기 (0) | 2026.02.05 |
|---|---|
| [CKAD] 내 데이터는 소중하니까! 영구 볼륨(PV/PVC)과 임시 볼륨(emptyDir) 완벽 정리 (0) | 2026.02.05 |
| 쿠버네티스 작업의 시작! Context 전환과 Namespace 관리 꿀팁 🚀 (0) | 2026.02.04 |
| CKAD 정복의 시작: 쿠버네티스 Context와 Namespace 완벽 설정 가이드 (0) | 2026.02.01 |
| CKAD: 쿠버네티스 마스터를 위한 Docker 이미지 최적화 전략 (0) | 2026.02.01 |