pile·
인프라 / DevOps·스캐터랩스캐터랩 (이루다)·

Karpenter와 Spot으로 저렴하고 유연하게 노드 프로비저닝하기

AWS EKS에서 GPU 서버 비용을 줄이기 위해 EC2 Spot과 Karpenter를 프로덕션에 적용한 구성과 안전장치를 설명한다. Cluster Autoscaler보다 빠르고 다양한 인스턴스 타입을 유연하게 고르는 Karpenter로 전환하고, Spot 회수 전후 처리는 Node Termination Handler로 보완했다. 마지막에는 AWS Fault Injection Simulator로 2분 회수 이벤트를 실제처럼 발생시켜 노드 교체 경로를 검증한다.

핵심 포인트
  • Spot은 On-Demand보다 최대 90% 저렴하지만 용량 부족 시 2분 안에 회수될 수 있고 SLA도 적용되지 않는다.
  • Cluster Autoscaler는 Auto Scaling Group 크기를 조정해 노드를 만들기 때문에 느리고 GPU별 Node Group 추가도 번거로웠다.
  • Karpenter는 EC2를 직접 생성하고 CRD로 노드 요구사항을 관리해 빠른 프로비저닝과 다양한 타입 선택을 지원한다.
  • 여러 AZ와 인스턴스 타입을 열어 Spot capacity를 넓히고 priceCapacityOptimized 전략으로 가격과 가용성을 함께 고려했다.
  • Node Termination Handler가 Rebalance Recommendation에 선제 대응하고 FIS가 실제 중단 시나리오를 검증했다.
상세 정리
  • 운영 배경: AI 모델별로 최적 GPU가 달라 여러 고가 인스턴스 타입을 EKS에서 사용했다. 비용 절감을 위해 Inferentia와 custom metric scaling에 이어 Spot을 검토했다.
  • Spot 특성: AWS의 남는 EC2 용량을 할인받는 대신 회수 가능성을 감수한다. Fault Tolerant한 워크로드에서만 비용 장점이 의미 있다.
  • 중단 신호: Spot Interrupt는 회수 2분 전에 온다. Rebalance Recommendation은 최대 15분 전에 올 수 있지만 best-effort라 항상 발생하는 신호는 아니다.
  • 기존 병목: Cluster Autoscaler는 unscheduled Pod가 생기면 ASG desired size를 바꾼다. Spot 중단 뒤 새 노드가 빨리 필요할 때 반응이 늦었다.
  • 타입 확장 문제: 새로운 GPU나 CPU 타입을 추가할 때 eksctl과 CloudFormation으로 Node Group을 만들어야 해 변경 속도가 느렸다.
  • Karpenter 선택: Karpenter는 EC2 인스턴스를 직접 만들고 Kubernetes CRD로 사양을 선언한다. Helm과 ArgoCD에 익숙한 개발자가 Git으로 노드 타입을 관리할 수 있다.
  • 설치 격리: Karpenter 자체는 EKS Managed Node Group에 배치하고 taint와 toleration으로 다른 워크로드와 분리했다.
  • AWSNodeTemplate: Subnet, Security Group, userdata, EBS를 정의했다. 예시 디스크는 gp3 100Gi, 3,000 IOPS, 125 throughput으로 구성했다.
  • AZ 확보: Spot capacity가 AZ마다 달라 리전의 모든 AZ Subnet을 선택지에 넣어 회수와 할당 실패 위험을 낮췄다.
  • Provisioner: 인스턴스 타입, CPU 아키텍처, Spot·On-Demand 허용 여부, consolidation을 Kubernetes 요구사항으로 선언했다.
  • 할당 전략: Karpenter는 Spot Fleet의 priceCapacityOptimized 전략을 사용한다. 다양한 인스턴스 타입을 허용할수록 capacity 부족과 비용을 줄일 수 있다.
  • 타입 제한: 팀의 서버는 하드웨어 민감도가 높아 CPU·메모리 속성만으로 자동 선택하지 않고 검증된 인스턴스 타입을 직접 지정했다.
  • 중단 처리: Karpenter도 Spot Interrupt를 처리하지만 Rebalance Recommendation은 다루지 않았다. NTH를 함께 배포해 신호 발생 시 노드를 cordon하고 Pod를 drain했다.
  • 선제 이동: NTH가 회수 전에 Pod를 On-Demand 또는 다른 Spot 노드로 옮기게 했다. 팀은 최소 On-Demand 수량과 별도 Rebalance 처리도 추가했다.
  • 장애 주입과 결과: FIS의 aws:ec2:send-spot-instance-interruptions 액션으로 대상 Spot에 PT2M 중단을 발생시켜 Karpenter와 NTH 동작을 테스트했다. 초기 시행착오 뒤 중단 대응 안정성을 확보하면서 프로덕션 서버를 더 낮은 비용으로 운영했다.
왜 읽나EKS의 비용을 Spot으로 줄이면서 노드 생성 속도, capacity 분산, 회수 처리, 장애 주입까지 운영 안전성을 설계하려는 인프라 엔지니어에게 실전적이다.
스캐터랩
스캐터랩 (이루다) 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 인프라 / DevOps·cloudflare-blogCloudflare Blog·

    대규모 도그푸딩: cdnjs를 Cloudflare 개발자 플랫폼으로 이전하다

    cdnjs는 하루 90억 요청을 처리하는 오픈소스 JS/CSS CDN으로, 전 세계 웹사이트의 12%가 의존한다. 2026년 6월, Cloudflare는 6년간 GCP에서 운영하던 발행 파이프라인을 Workers, Workflows, R2, KV, Queues, Containers, Durable Objects로 완전 전환했다. 성능 문제가 아닌 관측성·유지보수성 한계가 동인이었으며, 마이그레이션 과정에서 플랫폼 한도를 직접 끌어올렸다.

    #durable-objects#workflows#cloudflare-workers+2
  2. 인프라 / DevOps·github-engGitHub Engineering·

    Dependabot 길들이기: 업데이트 묶고, 주기 늦추고, 보안은 빠르게

    GitHub의 Dependabot은 의존성 업데이트를 자동화하지만, 기본 설정에서는 10개 업데이트 = 10개 PR이 쏟아져 메인테이너가 알림을 무시하게 된다. Microsoft의 GCToolkit 사례(578개 커밋 중 92개가 Dependabot 버전 범프)를 바탕으로, 그룹핑·주기 조절·보안 업데이트 분리 3가지 설정으로 노이즈를 줄이면서 보안 속도는 유지하는 방법을 다룬다.

    #github-actions#devops#supply-chain-security+2
  3. 인프라 / DevOps·cloudflare-blogCloudflare Blog·

    Cloudflare, 프라이버시 프로토콜 디버깅 CLI pvcli 오픈소스 공개

    Cloudflare가 OHTTP(Oblivious HTTP) 등 프라이버시 보존 프로토콜 디버깅을 위한 CLI 도구 pvcli를 오픈소스(Apache-2.0)로 공개했다. 기존에는 RFC를 참조하며 바이너리를 수작업으로 파싱해야 했는데, pvcli는 curl과 유사한 문법으로 이 과정을 단일 명령으로 줄인다. Apple Private Relay·Microsoft Edge Secure Network를 구동하는 실전 규모의 경험에서 나온 도구다.

    #rust#cli#ohttp+2