Kubernetes CronJob 실패 원인 분석 및 해결: [BackoffLimitExceeded] 에러 대응법

Kubernetes CronJob 실행 실패: [BackoffLimitExceeded] 원인과 해결

💡 문제 현상

Rancher UI 또는 kubectl describe job 명령어를 통해 아래와 같은 메시지가 확인됨:

[BackoffLimitExceeded] Job has reached the specified backoff limit
  • status: Failed
  • 로그 없음
  • 관련 CronJob은 EKS 환경에서 실행됨
  • backoffLimit: 0 설정으로 인해 재시도 없이 즉시 실패 처리됨

🔍 원인 분석

  1. Pod은 생성되었지만 즉시 종료되며 로그도 남기지 않음
  2. kubectl describe job에는 “Created pod: …” 메시지가 있지만
  3. kubectl describe pod <pod-name> 하면 “NotFound”
  4. 이는 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 설정을 통해 디버깅 시간을 확보하고, 실행 커맨드의 안정성을 확보해야 합니다.

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다