Kubernetes CronJob 강제 종료 및 graceful shutdown 처리 방법 (Spring Batch + 모니터링 연동)

Kubernetes CronJob을 활용해 Java 기반 Spring Batch 작업을 수행하는 환경에서, 작업 시간이 초과되었을 때의 강제 종료 처리가 필요할 수 있습니다. 이를 위해 activeDeadlineSeconds를 활용하면 설정된 시간 초과 시 작업을 종료할 수 있습니다.

그러나 기본적으로 Kubernetes는 종료 시 SIGTERM을 먼저 보내고, 이후 terminationGracePeriodSeconds 동안 graceful shutdown을 기다립니다. 이 시간이 지나야 SIGKILL을 보내 실제로 컨테이너가 강제 종료됩니다.

특히 Whatap과 같은 모니터링 도구를 사용하는 경우, 데이터 전송을 마무리할 시간이 필요하기 때문에 terminationGracePeriodSeconds0으로 설정하는 것은 적절하지 않을 수 있습니다. 이 경우, 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 코드를 최적화하는 것도 중요합니다.

관련 글

답글 남기기

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