잡
잡 (Job)
Job은 한 번 실행되고 완료되면 멈추는 일회성 작업을 나타내요. 실행을 마치는 데까지 걸리는 배치성 작업(batch task)이 딱 여기 해당하죠. Job은 파드가 성공적으로 종료될 때까지 해당 개수의 파드를 실행하고, 작업이 완료되면 자동으로 정리됩니다.
예제 Job 실행해 보기 (Running an example Job)
아래는 π 값을 2000자리까지 계산해서 출력하는 Job 설정이에요. 완료하는 데 약 10초 정도 걸립니다.
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
실행할 파드의 정보를 보면 batch.kubernetes.io/controller-uid나 batch.kubernetes.io/job-name 같은 라벨이 자동으로 붙어 있는 걸 볼 수 있어요.
Job 스펙 작성하기 (Writing a Job spec)
다른 쿠버네티스 설정과 마찬가지로 Job도 apiVersion, kind, metadata 필드가 필요합니다. Job이 만드는 파드의 수는 .spec.parallelism(동시에 실행할 파드 수)과 .spec.completions(완료해야 할 총 파드 수)로 조절해요. completionMode: Indexed를 쓰면 각 파드에 인덱스가 부여되어 분산 작업을 하기 편리해집니다.
Job 라벨 (Job Labels)
Job 라벨은 job-name과 controller-uid에 batch.kubernetes.io/ 접두사가 붙어요.
워크로드 API와의 통합 (Integrate with Workload APIs)
FEATURE STATE:
Kubernetes v1.36 [alpha](기본 비활성)
Job은 조건에 맞으면 Workload와 PodGroup 객체를 만들어 갱 스케줄링(gang scheduling)을 지원할 수 있어요. 이 기준에 맞지 않는 Job은 계속 파드를 개별적으로 스케줄링하며 Workload나 PodGroup을 만들지 않습니다.
예를 들어 분산 학습을 위한 Job은 parallelism만큼의 GPU가 한 번에 확보되어야 제대로 동작해요:
apiVersion: batch/v1
kind: Job
metadata:
name: distributed-training
namespace: training
spec:
parallelism: 8
completions: 8
completionMode: Indexed
template:
spec:
restartPolicy: Never
containers:
- name: trainer
image: training-image:latest
resources:
limits:
nvidia.com/gpu: 1
이때 Job은 같은 네임스페이스에 Workload 객체를 만들고, 그 안의 podGroupTemplate에 minCount가 Job의 parallelism과 같은 갱 스케줄링 정책을 담아 PodGroup을 만듭니다. 이 객체들은 ownerReferences로 Job이 소유하며, Job이 삭제되면 자동으로 가비지 컬렉션됩니다.
파드 및 컨테이너 실패 처리 (Handling Pod and container failures)
파드 실패 정책 (Pod failure policy)
FEATURE STATE:
Kubernetes v1.31 [stable](기본 활성)
.spec.podFailurePolicy 필드에서 컨테이너 종료 코드와 파드 조건을 기준으로 파드 실패를 처리하는 정책을 정의할 수 있어요. 예시:
apiVersion: batch/v1
kind: Job
metadata:
name: job-pod-failure-policy-example
spec:
completions: 12
parallelism: 3
template:
spec:
restartPolicy: Never
containers:
- name: main
image: docker.io/library/bash:5
command: ["bash"]
위 예시에서 main 컨테이너가 42 종료 코드로 실패하면 전체 Job이 실패하도록 규칙을 정할 수 있어요. 구체적으로:
- 종료 코드
0→ 컨테이너 성공 - 종료 코드
42→ 전체 Job 실패 - 그 외 종료 코드 → 컨테이너 실패, 즉 파드 전체가 실패함. 재시작 횟수가
backoffLimit보다 낮으면 파드가 다시 생성됩니다.
성공 정책 (Success policy)
successPolicy를 쓰면 완료 인덱스의 일부만 성공해도 Job을 성공으로 처리할 수 있어요. completionMode: Indexed가 필수예요:
apiVersion: batch/v1
kind: Job
metadata:
name: job-success
spec:
parallelism: 10
completions: 10
completionMode: Indexed # Required for the success policy
successPolicy:
rules:
- succeededIndexes: 0,2-3
succeededCount: 1
template:
spec:
containers:
- name: main
image: python
Job 종료 및 정리 (Job termination and cleanup)
기본적으로 Job은 파드가 실패하거나 컨테이너가 에러로 종료되기 전까지 계속 실행돼요. 실패가 발생하면 .spec.backoffLimit에 따라 재시도하고, 한도를 넘으면 Job이 실패로 처리됩니다. .spec.activeDeadlineSeconds를 설정하면 Job이 일정 시간 내에 끝나지 않을 때 강제로 종료시킬 수도 있어요.
apiVersion: batch/v1
kind: Job
metadata:
name: pi-with-timeout
spec:
backoffLimit: 5
activeDeadlineSeconds: 100
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
Job 패턴 (Job patterns)
- 만드는 파드의 수가 작업 항목 수와 같도록 하는 방식은 기존 코드/컨테이너 수정이 적어요.
- 각 파드가 여러 작업 항목을 처리하게 하는 방식은 작업 항목이 많을 때 유리합니다.