EKS에서 CronJob 실행 시 다음과 같은 오류 메시지를 본 적 있으신가요?
[BackoffLimitExceeded] Job has reached the specified backoff limit
이 오류는 Kubernetes Batch Job이 실패했고, 설정된 최대 재시도 횟수를 초과했을 때 발생합니다. 이 글에서는 해당 에러가 발생하는 이유와, 실전에서 이를 어떻게 해결할 수 있는지 자세히 살펴봅니다.
오류 원인: backoffLimit 초과
BackoffLimitExceeded
는 CronJob이 생성한 Job이 실패했으며, backoffLimit
설정에 도달했음을 의미합니다.
예를 들어 아래와 같은 CronJob YAML 설정이 있었다고 가정해봅니다:
spec:
backoffLimit: 0
이 설정은 Job이 단 한 번이라도 실패하면 바로 중단되도록 합니다. 따라서 컨테이너가 실행 직후 오류를 내고 종료되면, Kubernetes는 더 이상 재시도하지 않고 바로 BackoffLimitExceeded
상태로 종료시킵니다.
CronJob 예시와 주의할 점
containers:
- command:
- /bin/sh
- -c
- java -jar -Dspring.profiles.active=dev ...
env:
- name: SPRING_PROFILES_ACTIVE
value: sample
image: 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/sample-batch:latest
이처럼 복잡한 명령어와 많은 환경 변수에 의존하는 경우, 다음과 같은 문제가 발생할 수 있습니다:
- 환경 변수 누락
- 잘못된 이미지 태그
- Volume 마운트 오류
- Java 실행 시 예외 발생
해결 방법
1. backoffLimit 설정 수정
테스트 또는 운영 안정성을 위해, 다음과 같이 backoffLimit
값을 늘릴 수 있습니다:
spec:
backoffLimit: 2
이 설정은 Job이 최대 2번까지 재시도되도록 합니다.
2. Job 로그 확인
실제 실패 원인을 파악하려면 로그 확인이 필수입니다.
kubectl logs job/<job-name> -n <namespace>
로그에서 Java 예외, 환경 변수 미설정, volume 마운트 실패 등의 원인을 찾을 수 있습니다.
3. 환경 변수 및 자원 확인
$SPRING_PROFILES_ACTIVE
,$JAR_NAME
등 모든 환경 변수가 정상 주입되었는지 확인- Volume 마운트 경로 존재 여부 확인
- 컨테이너 리소스 제한에 의해 OOMKilled 되는지 확인
추가 팁
- 테스트용 CronJob의
schedule
을"*/5 * * * *"
등으로 짧게 설정하여 반복 확인 ttlSecondsAfterFinished
값을 설정하면 실패 Job이 자동으로 정리되어 클러스터 자원 관리에 도움됨concurrencyPolicy: Forbid
설정은 중복 실행 방지에 유용
결론
EKS 환경에서 CronJob 실행 시 BackoffLimitExceeded
오류가 발생했다면, 단순히 재시도 횟수 초과 문제가 아니라, 실제 Job 실패 원인을 파악하는 것이 우선입니다. 로그 확인과 환경 변수 검토, 그리고 적절한 backoffLimit
설정을 통해 안정적인 운영이 가능합니다.
보안 주의사항
본 문서에 사용된 이미지 URL, 환경 변수, Volume 이름, Endpoint 주소 등은 모두 샘플 데이터이며, 실제 시스템 정보는 포함되어 있지 않습니다.