쿠버네티스에서 Job은 일회성 작업을 실행하는 데 사용되지만, 여러 개의 작업을 병렬로 실행하거나 실패한 작업을 자동으로 재시도해야 하는 경우가 많습니다.
이번 글에서는 여러 개의 작업을 병렬로 실행하는 방법과 Job 실패 시 재시도(backoffLimit)를 설정하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ 여러 개의 작업을 병렬로 실행하는 Job 설정
2️⃣ Job 실패 시 재시도(backoffLimit) 및 완료 보장 설정
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ 여러 개의 작업을 병렬로 실행하는 Job 설정
❓ 문제 상황
운영팀에서 여러 개의 작업을 동시에 실행해야 하는 요구사항이 생겼습니다.
각 작업은 서로 독립적으로 실행되어야 하며, 병렬로 여러 개의 Pod을 생성하여 빠르게 처리해야 합니다.
• Job의 이름은 parallel-job이어야 합니다.
• 한 번에 최대 3개의 작업을 병렬로 실행해야 합니다.
• 총 6개의 작업을 실행해야 하며, 모든 작업이 완료될 때까지 기다려야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Job의 parallelism 속성을 사용하여 병렬로 실행되는 작업 개수를 설정해야 합니다.
• parallelism: 3을 설정하여 최대 3개의 작업이 동시에 실행되도록 설정
2. completions 속성을 사용하여 실행해야 할 작업 개수를 설정해야 합니다.
• completions: 6을 설정하여 총 6개의 작업이 실행되도록 설정
✅ 정답 Manifest (병렬 실행 Job 설정)
apiVersion: batch/v1
kind: Job
metadata:
name: parallel-job # Job 이름
spec:
completions: 6 # 총 6개의 작업 실행
parallelism: 3 # 동시에 최대 3개의 작업을 실행
template:
spec:
containers:
- name: worker
image: busybox # 간단한 작업 수행
command: ["sh", "-c", "echo Processing task; sleep 5"]
restartPolicy: Never # 작업 완료 후 재시작하지 않음
📌 적용 후 예상 결과 값
1. Job 생성 확인
kubectl get jobs
💡 예상 출력 값
NAME COMPLETIONS DURATION AGE
parallel-job 6/6 30s 5s
2. Pod이 병렬로 실행되는지 확인
kubectl get pods --selector=job-name=parallel-job
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
parallel-job-abc123 1/1 Running 0 5s
parallel-job-def456 1/1 Running 0 5s
parallel-job-ghi789 1/1 Running 0 5s
2️⃣ Job 실패 시 재시도(backoffLimit) 및 완료 보장 설정
❓ 문제 상황
운영팀에서 실패할 가능성이 있는 Job을 실행하면서, 일정 횟수만큼 재시도하도록 설정해야 하는 요구사항이 생겼습니다.
특정한 오류로 인해 Job이 실패할 경우 자동으로 재시도(backoffLimit)되도록 설정해야 합니다.
• Job의 이름은 retry-job이어야 합니다.
• Job이 실패하면 최대 3번까지 재시도해야 합니다.
• 3번 재시도 후에도 실패하면 Job이 종료되어야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Job의 backoffLimit 속성을 설정하여 실패한 경우 재시도 횟수를 제한해야 합니다.
• backoffLimit: 3을 설정하여 최대 3번 재시도
2. 실패하는 Job을 시뮬레이션하기 위해 강제로 오류를 발생시키도록 설정할 수 있습니다.
✅ 정답 Manifest (재시도 설정이 적용된 Job)
apiVersion: batch/v1
kind: Job
metadata:
name: retry-job # Job 이름
spec:
completions: 1 # 단일 작업 실행
backoffLimit: 3 # 최대 3번 재시도
template:
spec:
containers:
- name: failing-task
image: busybox # 간단한 작업 수행
command: ["sh", "-c", "echo Simulating failure; exit 1"]
restartPolicy: Never # 실패해도 자동 재시작하지 않음
📌 적용 후 예상 결과 값
1. Job 생성 확인
kubectl get jobs
💡 예상 출력 값
NAME COMPLETIONS DURATION AGE
retry-job 0/1 5s 5s
2. Job 실행 로그 확인 (실패 여부 확인)
kubectl logs job/retry-job
💡 예상 출력 값
Simulating failure
3. Job이 재시도되는지 확인
kubectl describe job retry-job
💡 예상 출력 값
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Started 5s job-controller Started pod: retry-job-abc123
Warning Failed 6s job-controller Pod failed, restarting...
Warning BackOff 12s job-controller BackoffLimitExceeded: Job has reached the specified backoff limit
4. Job이 실패 후 종료되었는지 확인
kubectl get jobs
💡 예상 출력 값
NAME COMPLETIONS DURATION AGE
retry-job 0/1 15s 5s # 재시도 후에도 실패하여 종료됨