EKS, Spot, RabbitMQ 조합으로 데이터 파이프라인 비용 90% 절감!
Config는 로봇 조작 데이터를 처리하기 위해 Amazon EKS, EC2 Spot Instances, RabbitMQ, KEDA, Karpenter를 활용한 데이터 파이프라인을 구축
기존 SQS + Lambda 기반의 단일 큐(Single Queue) 방식에서 Job별 동적 큐(Dynamic Queue)를 도입하여 병렬 처리 성능을 향상시킴
EC2 Spot Instances 활용 및 아키텍처 개선을 통해 처리 비용을 70~90% 절감하고 처리 시간을 단축
Karpenter를 활용하여 워크로드 특성에 맞는 다양한 Spot Instance를 프로비저닝하고, Spot 중단에 대한 다층 보호 전략을 구현
이 아키텍처는 로봇 데이터 전처리뿐 아니라 영상 인코딩, ML 추론 파이프라인, 대규모 ETL 등 다양한 워크로드에 적용 가능
기존 아키텍처의 문제점: 단일 큐 병목
기존 SQS + Lambda 기반 아키텍처는 단일 큐(Single Queue) 구조로 인해 다수의 작업 요청 시 순차적인 대기열(Queue) 발생이 불가피했다. 특히, 대규모 배치 작업이 큐를 점유하면 다른 소규모 작업까지 지연되는 문제가 발생했다.
AWS Lambda의 기본 제약: 계정 수준의 동시 실행 할당량 및 최대 실행 시간 제한(15분) 존재
높은 비용: 온디맨드(On-Demand) 가격으로 인해 Spot Instance 대비 높은 비용 발생
제한된 운영 가시성: 개별 작업의 진행 상태를 실시간으로 파악하기 어려움
Job별 동적 큐(Dynamic Queue) 아키텍처
새로운 아키텍처는 RabbitMQ 기반의 Job별 동적 큐(Dynamic Queue) 생성 패턴을 도입하여 단일 큐 병목 문제를 해결했다. 각 배치 작업 시작 시 해당 Job 전용 큐와 워커가 동적으로 생성되고, 작업 완료 시 자동 정리된다.
독립적인 병렬 처리: 여러 사용자가 동시에 독립적인 작업을 병렬로 실행 가능
독립적인 스케일링: 각 작업별 독립적인 스케일링 및 진행률 모니터링 가능
Quorum Queue: RabbitMQ의 Quorum Queue를 사용하여 메시지 유실 방지
이러한 구조는 대규모 데이터 처리(Large-scale Data Processing) 환경에서 높은 효율성을 제공한다.
Karpenter를 활용한 유연한 노드 관리
Config는 Karpenter를 활용하여 워크로드 특성에 맞는 다양한 종류의 노드 풀(NodePool)을 구성했다. 특히, Spot 인스턴스(Spot Instance)의 가용성을 높이기 위해 인스턴스 패밀리 다양성에 주목했다.
On-Demand 노드: RabbitMQ 클러스터, KEDA 등 안정성이 중요한 인프라 컴포넌트 배치
CPU Spot 노드: 영상 전처리, 후처리 등 CPU 기반 워커 실행
GPU Spot 노드: 액션 라벨링 추론 등 GPU 워커 실행
Karpenter**는 price-capacity-optimized 할당 전략을 사용하여 가격과 중단 가능성을 함께 고려하여 최적의 인스턴스를 선택한다.
Spot Instance 중단에 대한 다층 보호 전략
Spot Instance는 최대 90%의 비용 절감 효과를 제공하지만, 언제든지 회수될 수 있다는 단점이 있다. Config는 이러한 Spot 중단 상황에서도 데이터 손실 없이 작업을 완료하기 위해 다층 보호 전략을 설계했다.
인프라 레이어(Karpenter + EventBridge): Karpenter가 Amazon EventBridge와 Amazon SQS를 통해 EC2 Spot 중단 경고를 수신
애플리케이션 레이어(SIGTERM 핸들러): 워커 Pod의 terminationGracePeriodSeconds를 충분히 길게 설정하여 SIGTERM 수신 후 현재 처리 중인 작업을 안전하게 NACK
메시지 큐 레이어(Quorum Queue): 메시지는 여러 노드에 복제되어 유실되지 않으며, 워커가 비정상 종료 시 consumer timeout(20분) 이후 자동 재분배
이러한 다층 보호를 통해 데이터 손실(Data Loss) 없이 작업 완료를 보장한다.
KEDA 기반 자동 스케일링
Config는 KEDA(Kubernetes Event-Driven Autoscaling)를 사용하여 RabbitMQ 큐의 메시지 수에 따라 워커 Pod의 replica 수를 자동으로 조절한다. 큐에 메시지가 쌓이면 Pod를 늘리고, 큐가 비면 Pod를 0개까지 줄여 컴퓨팅 비용을 절감한다.
자동 스케일링 시퀀스: KEDA가 Pod 수를 늘리면 Karpenter가 Pending 상태의 Pod를 감지하고 Spot 노드를 자동 프로비저닝
minReplicaCount: 0: 큐가 비어 있으면 워커 Pod가 0개로 스케일다운되어 컴퓨팅 비용 절감
10초 내 스케일업: 메시지가 들어오면 10초 내에 스케일업 시작
이러한 자동 스케일링은 리소스 효율성(Resource Efficiency)을 극대화한다.