🤔 Job이란?
Job은 하나 이상의 Pod를 실행하여 주어진 작업이 성공적으로 완료될 때까지 실행하고, 작업이 모두 끝나면 더 이상 새로운 Pod를 생성하지 않는 컨트롤러입니다.
✅ 핵심 개념: “단 한 번 실행되어 성공하면 끝나는 작업”을 보장
Deployment가 24시간 상주하는 매장 직원이라면, Job은 특정 임무를 완수하고 퇴근하는 프로젝트 계약직과 같습니다. 임무가 성공적으로 끝나면 그걸로 끝입니다.
🔁 Job의 특징
Job은 단순히 Pod를 한번 실행하고 마는 것 이상의 안정성을 제공합니다.
- 성공 보장 및 재시도: 만약 실행된 Pod가 노드 문제나 일시적인 오류로 실패하더라도, Job은 작업이 성공할 때까지 자동으로 Pod를 다시 생성하여 재시도합니다. (재시도 횟수는 설정 가능)
- 병렬 처리: 여러 개의 작업을 동시에, 혹은 순차적으로 실행할 수 있습니다. 예를 들어 100개의 파일을 변환하는 작업을 10개씩 동시에 처리하도록 설정할 수 있습니다.
🧪 Job YAML 예시
“Hello from Job”이라는 메시지를 한 번 출력하고 종료되는 가장 간단한 Job의 YAML 예시입니다.
apiVersion: batch/v1
kind: Job
metadata:
name: hello-job
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["echo", "Hello from Job"]
restartPolicy: OnFailure # 또는 Never
📌 위 Job YAML의 포인트:
apiVersion: batch/v1
: Job은 앱이 아닌 배치 작업이므로apps/v1
이 아닌batch/v1
을 사용합니다.command
: 컨테이너가 실행할 명확한 명령어를 지정합니다. 이 명령이 성공적으로 끝나면(exit code 0) Job도 성공으로 간주됩니다.restartPolicy
:OnFailure
또는Never
로 설정하는 것이 일반적입니다. Job 컨트롤러 자체가 실패 시 새로운 Pod를 생성하여 재시도하므로, 컨테이너 자체의 재시작 정책(restartPolicy: Always
)은 Job의 로직과 충돌할 수 있습니다.
⚙️ 주요 설정 옵션
Job의 동작을 더 정교하게 제어할 수 있는 핵심 옵션들입니다.
completions
: 성공적으로 완료되어야 하는 총 작업의 수입니다. 이 수에 도달하면 Job은 종료됩니다.parallelism
: 동시에 실행할 수 있는 최대 Pod의 수입니다.backoffLimit
: 작업이 실패했을 때 재시도할 최대 횟수입니다. 이 횟수를 초과하면 Job은 최종 실패 처리됩니다.
예시: 5개의 작업을 최대 2개씩 병렬로 실행 (실패 시 3번까지 재시도)
spec:
completions: 5
parallelism: 2
backoffLimit: 3
이 설정은 “총 5개의 성공이 필요해. 동시에 2개까지 실행하고, 만약 하나가 실패하면 3번까지 봐줄게”라는 의미입니다.
✅ 개발자 관점 요약
• Job은 데이터 마이그레이션이나 배치 처리 같은 단발성 작업을 안전하게 실행할 수 있도록 도와주는 컨트롤러입니다.
• 지정한 작업이 성공할 때까지 재시도하며, 모든 작업이 완료된 후에는 더 이상 리소스를 사용하지 않고 정지됩니다.
• CI/CD 파이프라인의 일부로 테스트나 빌드 스크립트를 실행하는 데 매우 유용합니다.
• 만약 이 작업을 주기적으로, 반복적으로 실행해야 한다면? 그때는 CronJob을 사용해야 합니다.