Resource Optimization
Junseok Oh
Sr. Solutions Architect
Amazon Web Services
VPA와 Auto Mode의 시너지 효과
Pod의 CPU/Memory requests를 사용량에 맞게 조정
줄어든 requests로 빈 노드를 정리 (EKS 1.37 신규 풀은 Balanced 기본)
같은 CPU/Memory 메트릭으로 HPA와 함께 쓰지 않기
updateMode별 동작 방식과 권장 사용 사례
추천값만 제공하고, Pod를 변경하지 않습니다. 가장 안전한 분석 모드입니다.
Pod 재시작 없음, 안전하게 분석 가능, 프로덕션에서 먼저 테스트
자동 적용되지 않음, 수동 업데이트 필요
신규 워크로드 분석, 프로덕션 사전 검증, 리소스 패턴 파악
Pod 생성 시에만 추천값을 적용하고, 실행 중인 Pod는 변경하지 않습니다.
실행 중 Pod 안정성 보장, 롤링 업데이트 시 자연스럽게 적용
즉시 적용되지 않음, 새 Pod 생성까지 대기 필요
Stateful 워크로드, 긴 실행 배치 작업, 재시작에 민감한 서비스
추천값과 차이가 크면 Updater가 Pod를 evict하고, Admission Controller가 새 Pod에 추천값을 넣습니다. VPA 1.5부터 기본 모드입니다.
모든 Kubernetes 버전에서 동작, 동작이 예측 가능
Pod 재시작 발생, PDB와 레플리카 2개 이상 필요
Stateless 워크로드, 개발/스테이징 환경, 다중 레플리카 서비스
Pod를 재시작하지 않고 resize subresource로 requests를 바꿉니다. 노드에 자리가 없는 등 in-place가 불가능하면 evict로 전환합니다.
재시작 없이 조정, Kubernetes 1.35부터 in-place resize GA
QoS class는 바꿀 수 없음, 노드 여유가 없으면 결국 evict
재시작 비용이 큰 서비스, EKS 1.35 이상 클러스터. evict 없는 InPlace 모드는 VPA 1.8에서도 alpha
VPA 1.5부터 deprecated이며 현재 Recreate와 같게 동작합니다. 향후 API 버전에서 제거될 예정이므로 Recreate 또는 InPlaceOrRecreate를 명시합니다.
기존 매니페스트와 호환
Deprecated, 의미가 바뀔 수 있음, Pod 재시작 발생
신규 설정에는 사용하지 않음. 기존 Auto 설정은 명시적 모드로 전환
리소스 사용량 기반 VPA 추천값 시각화
리소스 최적화에서 노드 비용 절감까지의 자동화 흐름
CPU 24h 반감기 histogram, Memory 일별 피크 8일
target = P90 × 1.15: CPU 300m, Memory 512Mi
InPlaceOrRecreate: 먼저 in-place, 불가하면 evict
노드는 그대로이고 requests 합계만 줄어듦
빈 노드 삭제 또는 더 저렴한 노드로 교체
노드 수, Pod 재시작, 비용을 함께 측정
→ requests 기준 CPU 40%, Memory 50% 감소 (예시)
→ 실제 절감률은 워크로드와 NodePool 조건에 따라 다릅니다
QoS Class와 Request/Limit 설정 가이드
request == limit
request < limit
no request/limit
가정: us-east-1 On-Demand, 730시간/월, 사용량 불변, Spot 미반영. 실제 고객 결과가 아닙니다
CPU, Memory, Custom Metrics 기반 수평 확장
HPA를 넘어서: 이벤트 기반 스케일링과 Scale-to-Zero
| 항목 | HPA (기본) | KEDA |
|---|---|---|
| 메트릭 소스 | CPU / Memory만 | 70+ 스케일러 (SQS, Kafka, Prometheus 등) |
| 최소 레플리카 | min: 1 (기본) | min: 0 (Scale-to-Zero → 비용 절감) |
| 설정 방식 | HPA 리소스 직접 관리 | ScaledObject → HPA 자동 생성/관리 |
| Prometheus 연동 | Prometheus Adapter 필요 | 네이티브 PromQL 지원 |
| AWS 통합 | CloudWatch Adapter 별도 설치 | SQS, Kafka(MSK IAM 포함), CloudWatch 스케일러 내장 |
트래픽 없을 때 0으로 축소, 비용 절감
AWS, GCP, Azure, Kafka, Redis 등
기존 Prometheus 인프라 재활용
GitOps 친화적 선언형 관리
KEDA v2.21 (2026-09-23)의 테스트 범위는 Kubernetes 1.34 ~ 1.36입니다. EKS 1.37 클러스터는 공식 테스트 범위 밖이므로 스테이징에서 먼저 검증합니다. KEDA는 EKS add-on이 아니며 Helm으로 설치합니다.
📖 더 알아보기: KEDA 실전 가이드SQS Queue Depth / MSK Consumer Lag / ALB Request Count
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: sqs-consumer-scaler spec: scaleTargetRef: name: sqs-consumer minReplicaCount: 0 # Scale-to-Zero! maxReplicaCount: 20 triggers: - type: aws-sqs-queue authenticationRef: name: keda-aws-credentials metadata: queueURL: https://sqs.ap-northeast-2... queueLength: "5" # 메시지 5개당 1 Pod awsRegion: ap-northeast-2
aws-sqs-queue: Prometheus 불필요queueLength: "5": 메시지 5개당 Pod 1개TriggerAuthentication, podIdentity.provider: aws)podIdentity.provider: aws로 SQS 조회 권한 부여. aws-eks는 deprecated
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: msk-consumer-scaler spec: scaleTargetRef: name: kafka-consumer minReplicaCount: 1 maxReplicaCount: 30 triggers: - type: prometheus metadata: serverAddress: http://prometheus:9090 query: | sum(kafka_consumergroup_lag{ group="my-consumer", topic="orders" }) threshold: "1000" # Lag 1000당 1 Pod
prometheus 스케일러로 Consumer Lag 모니터링kafka_consumergroup_lag 메트릭 활용threshold: "1000": Lag 1000당 Pod 1개kafka 스케일러 + sasl: aws_msk_iam (KEDA에 aws-msk 타입은 없음)apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: alb-scaler spec: scaleTargetRef: name: web-app minReplicaCount: 2 maxReplicaCount: 50 triggers: - type: aws-cloudwatch authenticationRef: name: keda-aws-credentials metadata: namespace: AWS/ApplicationELB dimensionName: TargetGroup dimensionValue: targetgroup/my-tg/... metricName: RequestCountPerTarget targetMetricValue: "100" # Pod당 100 req metricStatPeriod: "60"
aws-cloudwatch 스케일러: Prometheus 불필요RequestCountPerTarget 메트릭cloudwatch:GetMetricData)PromQL + KEDA로 Istio 메트릭 기반 자동 스케일링
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: istio-rps-scaler spec: scaleTargetRef: name: my-app minReplicaCount: 0 maxReplicaCount: 10 cooldownPeriod: 120 triggers: - type: prometheus metadata: serverAddress: http://prometheus:9090 query: | sum(rate(istio_requests_total{ destination_service=~"my-app.*" }[1m])) threshold: "50" # Pod당 50 RPS
5xx > 5% → 즉시 스케일아웃
P99 > 500ms → Pod 추가
outlierDetection 연동
피크타임 사전 확보
리소스 최적화를 위한 운영 가이드
podIdentity.provider: aws 구성심화 학습 참고 자료, 2026-10-15 버전 검토와 공식 출처
한국어로 작성된 EKS Auto Mode 및 Kubernetes 학습 자료. 실습 예제 포함.
atomoh.gitbook.io →EKS Auto Mode의 공식 문서. 설정 방법 및 모범 사례 안내.
docs.aws.amazon.com →직접 설치한 Karpenter의 설정, 호환성 (Kubernetes 1.37은 1.15.x 필요). Auto Mode NodeClass와 구분.
karpenter.sh →Logs, Metrics, Traces 연동을 위한 Grafana 데이터소스 설정 가이드.
grafana.com →분산 추적 및 관측성 표준. SDK, Collector, 계측 가이드.
opentelemetry.io →Vertical Pod Autoscaler 공식 리포지토리. 설치, 구성, FAQ.
github.com →Event-driven Autoscaling. 70+ 스케일러, ScaledObject와 ScaledJob 구성 가이드.
keda.sh →SQS, MSK, Istio RPS 기반 스케일링 예제. 한국어 실습 자료.
atomoh.gitbook.io →Key Takeaways
Auto Mode는 AWS가 관리하는 Karpenter 기반 노드 관리. NodePool과 NodeClass로 제어하고, 직접 설치한 Karpenter(v1.15.0)와 API와 운영 책임이 다릅니다.
Pod, 노드, 이벤트 순서로 진단. Spot 회수 대응, expireAfter와 Disruption Budget으로 Day-2 운영 안정화.
Exemplars, Derived Fields, tracesToLogsV2로 Logs, Metrics, Traces 상관분석. 근본 원인 분석 가속화.
VPA(InPlaceOrRecreate)로 requests 조정, KEDA로 이벤트 기반 스케일링, Auto Mode Consolidation으로 빈 노드 정리.
질문과 답변
오늘 교육이 도움이 되셨나요?
피드백은 더 나은 콘텐츠를 만드는 데 큰 힘이 됩니다.
Session: EKS Auto Mode & Karpenter 운영 (2 Hours)