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
설정을 통해 디버깅 시간을 확보하고, 실행 커맨드의 안정성을 확보해야 합니다.