Job 매니페스트에는 아래 세가지 주요 필드를 설정할 수 있다.
| 필드명 | 의미 | 비고 |
| completions | 성공 횟수 | 실행 중 변경 불가능 |
| parallelism | 병렬성 | 동시에 실행하고자 하는 잡 갯수. 실행 중 변경 가능 |
| backoffLimit | 실패 허용 횟수 | 0 지정시 실패를 허용하지 않음. 실행 중 변경 가능 |
이를 기반으로 전형적인 네 가지 워크로드를 Job 으로 실행해보자
1. 1회만 실행하는 태스크
| completions | 1 |
| parallelism | 1 |
| backoffLimit | 0 |
성공 유무와 관계없이(backoffLimit: 0) 1회만 실행된다.
2. N 개를 병렬로 M 번 성공시까지 실행하는 태스크
| completions | M |
| parallelism | N |
| backoffLimit | P |
실패는 P번 까지 허용하며, 동시에 N개의 파드를 기동하여 잡을 실행하며, 성공 횟수가 M 번이 될 때 까지 실행한다. 주의할 점은, 남은 성공횟수가 N 이하인 경우 남은 성공횟수 만큼만의 파드만 기동한다는 점이다.
예를들어, completions: 5, parallelism: 3 을 지정하면 아래와 같은 순서로 진행된다.
- 3개의 파드가 동시 실행된다.(병렬성 3)
- 3개의 파드가 성공적으로 실행 완료된다.(목표 성공횟수 성공횟수 2/5)
- 남은 성공 횟수가 2 이므로, 3개가 아닌 2개의 파드가 동시 실행된다.(즉, 동시 실행되는 파드의 수는 남은 성공횟수보다 클 수 없다.)
또한, parallelism 을 completions 이상으로 설정하더라도 마찬가지로 남은 성공횟수가 completions 가 되어버리기 때문에 결국에는 completions 갯수만큼의 파드가 기동된다.
3. N 개를 병렬로 실행하는 작업큐
위에서 말한 Task 잡은 일정 성공 횟수에 도달할 때 까지 파드 종료 -> 시작을 반복하며 진행한다. 하지만 성공 횟수가 정해지지 않고 메시지 큐에 쌓인 모든 Topic 을 처리할 때 까지 N 개의 병렬성을 가지고 N 개의 파드를 계속 유지하면서 작업을 처리해야 하는 경우가 있다. 이때는 아래처럼 설정한다.
| completions | 지정하지 않음 |
| parallelism | N |
| backoffLimit | P |
이렇게 Job 을 실행하면 N 개의 파드가 병렬로 실행된다. 그 중 하나라도 정상 종료되면 전체 Job 이 종료되게 되며 더이상의 추가 파드 실행은 없다. 당연히 이미 실행중인 파드는 자체적으로 작업이 종료될 때 까지 유지된다.

작업큐의 잡을 이용하려면 대상 작업을 쌓기 위한 메시지 큐를 따로 두어야 한다. Job 이 관리하는 파드 내의 애플리케이션에서는 현재 진행중인 작업이 종료되기 전에 그 메시지 큐로부터 반복하여 Topic 을 가져오는 처리를 구현해두어야 한다. Topic 이 존재하면 현재 작업이 종료되어도 파드를 성공 종료처리하지 않고, 바로 이어서 해당 작업을 진행한다. 이를 반복하다가 메시지 큐가 빈 것을 확인하면 그때서야 파드를 정상 종료 처리하도록 구현하여야 전체 병렬 작업들을 마무리할 수 있게 된다.
이렇게 메시지 큐가 빈 이후에 다시 새로운 Topic 이 등록되는 경우를 위해서는 나중에 따로 설명할 Cron Job 을 이용하여 Job 을 정기적으로 실행하여 병렬 작업큐가 다시 기동될 수 있도록 구현해둔다.
메시지 큐에 쌓인 메시지 양에 따라 Job 의 parallelism 을 동적으로 변경할 수 있도록 작성하여 오토 스케일링하는 것도 가능하다.
작업큐는 completions 를 지정하지 않는다고 하였는데, 이렇게 작성하면 COMPLETIONS 가 태스크와 다르게 표시된다.
# COMPLETIONS 표시 형식 확인
$ kubectl get jobs multi-workqueue-job
NAME STATUS COMPLETIONS DURATION AGE
multi-workqueue-job Running 0/1 of 3 6s 6s
# 실행중인 파드 확인
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
multi-workqueue-job-6hdcg 1/1 Running 0 11s
multi-workqueue-job-jgxbt 1/1 Running 0 11s
multi-workqueue-job-tl4s2 1/1 Running 0 11s
# 파드 실행 완료 확인
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
multi-workqueue-job-6hdcg 0/1 Completed 0 21m
multi-workqueue-job-jgxbt 0/1 Completed 0 21m
multi-workqueue-job-tl4s2 0/1 Completed 0 21m
# COMPLETIONS 표시 형식 확인
$ kubectl get jobs multi-workqueue-job
NAME STATUS COMPLETIONS DURATION AGE
multi-workqueue-job Complete 3/1 of 3 33s 21m
4. 1개씩 실행하는 작업큐
병렬 작업큐에서 parallelism 만 1로 변경한 것으로, 병렬성이 없는 작업큐라고 보면 된다.
| completions | 지정하지 않음 |
| parallelism | N |
| backoffLimit | P |
parallelism 은 Job 실행중에 변경할 수 있으므로, N개의 병렬 작업큐로 전환할 수 있다. kubectl patch 를 사용하거나, 매니페스트 수정 후 apply 를 진행하면 된다.(이력관리를 위해서 apply 권장)
# 확인을 위해 parallelism: 1 로 변경
$ kubectl patch job multi-workqueue-job -p '{"spec": {"parallelism": 1}}'
job.batch/multi-workqueue-job patched
$ kubectl get jobs
NAME STATUS COMPLETIONS DURATION AGE
multi-workqueue-job Complete 3/1 33s 79m
$ kubectl patch job multi-workqueue-job -p '{"spec": {"parallelism": 2}}'
job.batch/multi-workqueue-job patched
$ kubectl get jobs
NAME STATUS COMPLETIONS DURATION AGE
multi-workqueue-job Complete 3/1 of 2 33s 80m
'Kubernetes' 카테고리의 다른 글
| [Kubernetes] 크론잡 (1) | 2025.10.07 |
|---|---|
| [Kubernetes] 완료된 잡 정리(ttlSecondsAfterFinished) (0) | 2025.10.06 |
| [Kubernetes] 잡 (0) | 2025.10.04 |
| [Kubernetes] 스테이트풀셋 삭제와 영구 볼륨 정리 (0) | 2025.09.07 |
| [Kubernetes] 스테이트풀셋 업데이트 전략 (0) | 2025.09.07 |
