Kubernetes CronJob을 활용해 Java 기반 Spring Batch 작업을 수행하는 환경에서, 작업 시간이 초과되었을 때의 강제 종료 처리가 필요할 수 있습니다. 이를 위해 activeDeadlineSeconds
를 활용하면 설정된 시간 초과 시 작업을 종료할 수 있습니다.
그러나 기본적으로 Kubernetes는 종료 시 SIGTERM
을 먼저 보내고, 이후 terminationGracePeriodSeconds
동안 graceful shutdown을 기다립니다. 이 시간이 지나야 SIGKILL
을 보내 실제로 컨테이너가 강제 종료됩니다.
특히 Whatap과 같은 모니터링 도구를 사용하는 경우, 데이터 전송을 마무리할 시간이 필요하기 때문에 terminationGracePeriodSeconds
를 0
으로 설정하는 것은 적절하지 않을 수 있습니다. 이 경우, 10초 정도의 시간으로 설정하여 shutdown hook이 정상적으로 동작하고 모니터링 데이터가 유실되지 않도록 구성할 수 있습니다.
핵심 설정 예시:
spec:
activeDeadlineSeconds: 180
template:
spec:
terminationGracePeriodSeconds: 10
위 설정은 다음과 같이 동작합니다:
- 작업 시작 후 180초가 지나면 Kubernetes가
SIGTERM
을 전송 - 이후 10초간 graceful shutdown 기회 부여
- 그 시간이 지나면
SIGKILL (kill -9)
을 통해 강제 종료
이 설정은 Spring Batch에서 shutdown hook을 통해 DB connection 정리, 모니터링 flush, 로그 마무리 등을 할 수 있도록 도와줍니다.
또한 이 과정에서 예상과 다르게 6~9분간 종료되지 않는 현상이 있다면 다음을 점검해야 합니다:
- shutdown hook 내부에서 블로킹 또는 무한 루프
- 리소스 부족 또는 container runtime hang
- 애플리케이션에서 SIGTERM을 무시하거나 처리 실패
이를 방지하기 위해 종료 처리를 10초 이내로 끝낼 수 있도록 shutdown 코드를 최적화하는 것도 중요합니다.