1️⃣ 개요
Kubernetes에서 Job 리소스는 작업이 완료되면 Completed, 실패하면 Failed 상태로 전환됩니다.
그러나 다음과 같은 경우에는 Job이 계속 남아있는 상태로 클러스터 자원을 차지할 수 있습니다:
• 실패했지만 backoffLimit을 넘기지 않음
• 완료되었으나 TTL이 설정되지 않음
• 외부 시스템과 연동이 되지 않아 상태 처리가 누락됨
이 글에서는 Job 컨트롤러가 Job을 어떻게 관리하고,
불완전한 Job 리소스를 안전하게 정리하는 방법을 소개합니다.
2️⃣ Job의 상태 흐름 요약
[Job 생성]
↓
[Pod 실행]
↓
[성공] → Job 상태: Completed
[실패] → 재시도 → backoffLimit 초과 → Job 상태: Failed
상태 | 의미 |
Active | 현재 실행 중인 Pod이 존재 |
Succeeded | 성공적으로 완료된 Pod 수 |
Failed | 실패한 Pod 수 (재시도 포함) |
Conditions | 완료 여부 (Complete, Failed 등) 이벤트 발생 여부 |
3️⃣ 상태 확인 명령어
kubectl get jobs
kubectl describe job <job-name>
출력 예시:
Name Active Succeeded Failed Completions Duration Age
batch-test 0 1 0 1 25s 3m
✅ Active = 0 + Succeeded = 1 → Job 완료됨
✅ Failed > 0 + backoffLimit 초과 → Job 실패 상태
4️⃣ Job이 계속 남아있는 경우
원인 | 해결 방법 |
TTL 설정 없음 | ttlSecondsAfterFinished 값 설정 |
Job 상태가 Active로 유지됨 | Pod이 비정상 종료되었거나 컨트롤러 미갱신 |
외부 시스템 연동 실패 | 상태 보고 누락 → 수동 정리 필요 |
5️⃣ Job 완료 후 자동 정리 설정 (TTL 컨트롤러)
apiVersion: batch/v1
kind: Job
metadata:
name: ephemeral-job
spec:
ttlSecondsAfterFinished: 300 # 완료 후 300초(5분) 뒤 자동 삭제
template:
spec:
restartPolicy: Never
containers:
- name: short-task
image: busybox
command:
- sh
- -c
- echo "🧼 종료 후 자동 정리"
📌 설명
• 작업이 완료되면 TTL 컨트롤러가 지정한 시간 이후에 Job 리소스를 삭제합니다.
• 클러스터 내 오래된 Job이 쌓이는 것을 방지합니다.
6️⃣ Job 정리 정책 전략
목적 | 설정 방법 |
일정 시간 후 자동 삭제 | ttlSecondsAfterFinished 설정 |
강제로 삭제 | kubectl delete job <name> 사용 |
Pod만 먼저 삭제 | --cascade=orphan 옵션 사용 가능 |
로그 수집 후 삭제 | 로그 수집기와 연계하여 완료 후 삭제 트리거 설정 |
7️⃣ 수동으로 오래된 Job 확인 스크립트 예시
kubectl get jobs -o json | jq '.items[] | select(.status.completionTime != null) | {name: .metadata.name, completed: .status.completionTime}'
📌 이 스크립트를 통해 완료된 Job 목록과 완료 시간을 추출하여, 정리 여부를 결정할 수 있습니다.
🔥 8️⃣ 결론
✔ Job은 완료되거나 실패해도 리소스로 계속 남을 수 있기 때문에, 명시적인 정리 설정이 필요합니다.
✔ ttlSecondsAfterFinished를 설정하면 일정 시간 후 Job을 자동으로 정리할 수 있습니다.
✔ Job의 상태 흐름을 이해하고, 불완전하거나 오래된 Job을 수동/자동으로 관리하는 전략이 중요합니다.
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [Job 심화편 #8] Job 리소스와 ConfigMap/Secret 연동 전략: 실행 환경 외부화 구성 (0) | 2025.03.25 |
---|---|
📌 [Job 심화편 #7] Job의 CronJob 전환 전략: 반복성 여부에 따른 리소스 선택 기준 (0) | 2025.03.25 |
📌 [Job 심화편 #5] Job 로그 수집 전략: 실행 완료 후 로그 유실 방지하기 (0) | 2025.03.25 |
📌 [Job 심화편 #4] Job의 completions, parallelism 조합을 통한 병렬 처리 패턴 구성 (0) | 2025.03.25 |
📌 [Job 심화편 #3] Job 실행 중 Node 장애 시 복구 시나리오 분석 (0) | 2025.03.25 |