Kubernetes에서는 일반적인 애플리케이션 배포 외에도 **일회성 작업(배치 작업)**이 필요할 때가 있습니다.
이때 사용하는 리소스가 Job과 CronJob입니다.
이번 글에서는 Job과 CronJob의 개념, 차이점, 동작 방식, 그리고 실전 활용법을 정리해 보겠습니다.
🔹 Job이란?
Job은 한 번 실행된 후 완료되는 작업을 수행하는 Kubernetes 리소스입니다.
배포된 Pod는 작업이 끝나면 자동으로 종료됩니다.
✔️ 한 번만 실행되는 작업 수행
✔️ Pod 장애 발생 시 자동 재시작
✔️ 성공적으로 완료되면 종료됨
📌 Job 사용 사례
- 데이터베이스 마이그레이션
- 백업 및 데이터 스냅샷
- 로그 분석 및 처리
- 특정 이벤트 발생 시 실행해야 하는 작업
🔹 Job YAML 예제 (일회성 작업)
아래 Job은 10초 후 종료되는 Pod를 실행하는 예제입니다.
apiVersion: batch/v1 # Job 리소스의 API 버전
kind: Job # Job 리소스를 생성
metadata:
name: example-job # Job의 이름
spec:
completions: 1 # 총 1개의 작업(완료할 Pod 수)
parallelism: 1 # 동시에 실행할 Pod 개수
template: # 실행할 Pod의 정의
metadata:
labels:
app: example-job
spec:
restartPolicy: Never # 실패 시 자동 재시작하지 않음
containers:
- name: job-container
image: busybox # BusyBox 컨테이너 사용
command: ["sh", "-c", "echo Hello, Kubernetes! && sleep 10"] # 10초 후 종료
📌 주요 필드 설명
필드 설명
completions: 1 | 완료해야 하는 작업 개수 (1이면 1번 실행) |
parallelism: 1 | 동시에 실행할 Pod 개수 |
restartPolicy: Never | 실패해도 자동 재시작하지 않음 |
command | 컨테이너에서 실행할 명령어 (10초 후 종료) |
🔹 Job 배포 및 실행 확인
kubectl apply -f job.yaml
kubectl get jobs
kubectl get pods
💡 Job은 실행이 완료되면 Pod가 자동으로 종료됩니다.
📌 실행 로그 확인
kubectl logs <pod-name>
출력 예시:
Hello, Kubernetes!
🔹 Job 병렬 실행 (Parallelism & Completions)
여러 개의 작업을 병렬로 실행하려면 parallelism과 completions 값을 조정합니다.
spec:
completions: 5 # 총 5개의 작업 수행
parallelism: 2 # 동시에 2개씩 실행
💡 최대 2개씩 실행되며, 총 5개의 Pod가 순차적으로 실행됩니다.
🔹 CronJob이란?
CronJob은 Job을 정해진 일정에 따라 반복 실행하는 리소스입니다.
리눅스의 cron 명령어와 동일한 방식으로 작동합니다.
✔️ 정해진 시간에 Job 실행
✔️ 스케줄링(예약 실행) 가능
✔️ 이전 Job이 실패해도 다음 실행에 영향 없음
📌 CronJob 사용 사례
- 매일 자정에 로그 백업 실행
- 매 5분마다 특정 데이터 업데이트
- 매주 월요일 오전 9시에 시스템 점검
🔹 CronJob YAML 예제 (5분마다 실행)
apiVersion: batch/v1 # CronJob 리소스의 API 버전
kind: CronJob # CronJob 리소스를 생성
metadata:
name: example-cronjob # CronJob의 이름
spec:
schedule: "*/5 * * * *" # 매 5분마다 실행
jobTemplate: # 실행될 Job의 정의
spec:
template:
metadata:
labels:
app: example-cronjob
spec:
restartPolicy: Never # 실패 시 자동 재시작 안 함
containers:
- name: cronjob-container
image: busybox # BusyBox 컨테이너 사용
command: ["sh", "-c", "echo Running CronJob! && date"] # 현재 시간 출력
📌 주요 필드 설명
필드 설명
schedule | 실행 주기를 설정 (cron 형식) |
jobTemplate | 실행할 Job의 템플릿 |
restartPolicy: Never | 실패해도 자동 재시작하지 않음 |
🔹 Cron 표현식 정리
표현식 실행 주기
"*/5 * * * *" | 매 5분마다 실행 |
"0 0 * * *" | 매일 자정 (00:00) 실행 |
"0 9 * * 1" | 매주 월요일 오전 9시 실행 |
"0 12 1 * *" | 매월 1일 정오 실행 |
💡 Cron 표현식 테스트 사이트를 활용하면 쉽게 확인할 수 있습니다.
🔹 CronJob 배포 및 실행 확인
kubectl apply -f cronjob.yaml
kubectl get cronjob
kubectl get jobs
kubectl get pods
💡 5분마다 새로운 Job이 자동으로 생성됩니다.
📌 실행 로그 확인
kubectl logs <pod-name>
출력 예시:
Running CronJob!
Tue Mar 4 12:00:00 UTC 2025
🔹 CronJob 삭제 및 Job 정리
kubectl delete cronjob example-cronjob
kubectl get jobs # 기존에 실행된 Job은 남아 있음
kubectl delete jobs --all # 실행된 모든 Job 삭제
💡 CronJob을 삭제해도 실행된 Job은 남아 있으므로, 필요하면 수동으로 삭제해야 합니다.
🚀 마무리
Job과 CronJob은 Kubernetes에서 일회성 및 반복 작업을 수행하는 핵심 리소스입니다.
✔️ Job은 한 번 실행 후 종료
✔️ CronJob은 스케줄에 따라 반복 실행
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
Kubernetes 리소스 시리즈 #7: NetworkPolicy (서비스 및 네트워크 리소스) (0) | 2025.03.05 |
---|---|
Kubernetes 리소스 시리즈 #6: Service & Ingress (서비스 및 네트워크 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #4: DaemonSet (워크로드 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #3: StatefulSet (워크로드 리소스) (0) | 2025.03.04 |
Kubernetes 리소스 시리즈 #2: ReplicaSet & Deployment (워크로드 리소스) (0) | 2025.03.04 |