Kubernetes CronJob 실행 실패: [BackoffLimitExceeded] 원인과 해결
💡 문제 현상
Rancher UI 또는 kubectl describe job 명령어를 통해 아래와 같은 메시지가 확인됨:
[BackoffLimitExceeded] Job has reached the specified backoff limit
status: Failed- 로그 없음
- 관련 CronJob은 EKS 환경에서 실행됨
backoffLimit: 0설정으로 인해 재시도 없이 즉시 실패 처리됨
🔍 원인 분석
- Pod은 생성되었지만 즉시 종료되며 로그도 남기지 않음
kubectl describe job에는 “Created pod: …” 메시지가 있지만kubectl describe pod <pod-name>하면 “NotFound”- 이는 Pod이 너무 빨리 종료되어 kubelet에 의해 Garbage Collection됨
🧪 디버깅 접근
kubectl get pods -l job-name=<sample-job-name>로 Pod 상태 확인kubectl describe pod <sample-pod-name>로 종료 이유 파악 (단, GC되었을 경우 불가)- CronJob 내 복잡한 명령어 또는 환경변수 누락 여부 확인
- 명령어를 쉘 스크립트로 분리해 유지 보수성과 실행 안정성 향상
- 테스트용 Pod 생성 후 직접 실행해보기:
kubectl run debug-batch --rm -it --image=123456789012.dkr.ecr.region.amazonaws.com/sample-image:tag -- bash
✅ 해결 방법
1. Pod 삭제 지연 설정
CronJob에 ttlSecondsAfterFinished 추가:
spec:
jobTemplate:
spec:
ttlSecondsAfterFinished: 600 # 종료 후 10분간 Pod 보존
2. 환경 변수 확인 및 명령어 안정화
SPRING_PROFILES_ACTIVE,GC_NAME,JAR_NAME,WORK_DIR등 필수 env 값 누락 시 실행 즉시 실패 가능- 다중 명령어는
/app/start.sh로 분리 추천
🧩 결론
Kubernetes에서 backoffLimit: 0 설정된 CronJob이 [BackoffLimitExceeded]로 실패하고 로그도 남지 않는 경우는 대부분 Pod이 너무 빠르게 종료되며 GC 대상이 되었기 때문입니다. 이를 방지하려면 ttlSecondsAfterFinished 설정을 통해 디버깅 시간을 확보하고, 실행 커맨드의 안정성을 확보해야 합니다.
Job 재시도 한도에 대한 기본 설명은 EKS CronJob에서 BackoffLimitExceeded 오류가 발생하는 원인과 해결 방법에서 이어집니다.