
핵심요약
프로모션 배치 서버를 물리 서버 환경에서 Kubernetes로 성공적으로 전환했으며, Quartz 스케줄러와 Spring Batch를 활용하여 안정적인 운영 환경을 구축했습니다. 전환 과정에서 발생한 이슈와 해결 방안, 그리고 효율적인 배치 관리 도구 구성 경험을 공유합니다.
프로모션 배치 Kubernetes 이관 및 운영
Kubernetes 환경으로의 전환 배경
- 기존 물리 서버와 Jenkins 기반의 배치 스케줄링 환경을 MSA webapp 서비스와 유사하게 Kubernetes에서 운영하고자 하는 아이디어에서 출발했습니다.
- Spring Boot 기반의 배치 및 스케줄러 애플리케이션을 Kubernetes에 배포하여 상시 운영되는 형태로 전환을 목표로 했습니다.
- Pod의 스케일링 특성과 배치 작업의 동시성 제어를 고려하여 효율적인 스케줄링 방식이 필요했습니다.
Quartz 스케줄러 선정 및 클러스터링
- 애플리케이션 내부에 내장되어 상시 운영 가능하며, 클러스터링 기능을 통해 Kubernetes 스케일링에 안정적으로 대응할 수 있는 Quartz를 스케줄러로 채택했습니다.
- 데이터베이스 기반의 Quartz 클러스터링은 SELECT FOR UPDATE와 같은 분산 락을 활용하여 Job의 중복 실행 방지 및 고가용성을 확보합니다.
- Quartz 메타데이터는 PostgreSQL에, 배치 비즈니스 로직은 기존 Oracle DB를 통해 처리하도록 구성했습니다.
배치 Job 이관 및 관리 도구 구성
- Quartz JobDetail과 JobTrigger를 통해 스케줄을 정의하고, Quartz Job 내부에서 Spring Batch의 JobLauncher를 호출하여 배치 Job이 실행되도록 연동했습니다.
- 리소스 사용량이 적은 Job은 tasklet 방식으로, 데이터 처리량이 많은 Job은 chunk 방식으로 구조를 개선하여 효율성을 높였습니다.
- Jenkins 없이도 배치 관리가 가능하도록 백오피스에 실행 이력 관리 페이지와 스케줄링 API를 구현하고, Datadog으로 스케줄링 정보 및 Pod 리소스 모니터링, Loki와 Grafana로 로그를 수집 및 모니터링했습니다.
Kubernetes 환경 운영 회고 및 개선
- rolling update 방식의 무중단 배포 시, 실행 시간이 긴 배치 작업은 Pod 교체 시 중단될 수 있는 문제가 발생했습니다.
- 단시간 내 고리소스를 소모하는 배치 작업 특성상 OOM(Out Of Memory) 발생으로 Pod가 비정상 종료되는 경우가 있었습니다.
- terminationGracePeriodSeconds 설정과 스프링 생명주기를 활용하여 Pod 종료 지연을 통해 작업 완료 시간을 확보하고, 쿼리 최적화 및 chunk 방식 구조 개선으로 OOM 발생을 억제했습니다.
SSG TECH