[K8s] HPA / VPA / KEDA: 자동 확장
HPA, Horizontal Pod Autoscaler, VPA, Vertical Pod Autoscaler, KEDA, Cluster Autoscaler, Karpenter
3가지 스케일링
flowchart TB
Q[스케일링 종류]
Q --> HPA[HPA<br/>Pod 수 ↑↓]
Q --> VPA[VPA<br/>Pod resource ↑↓]
Q --> CA[Cluster Autoscaler<br/>Karpenter<br/>Node 수 ↑↓]
HPA (Horizontal Pod Autoscaler)
CPU / Memory / custom metric 기반 pod 수 조정.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata: { name: web }
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 3
maxReplicas: 50
metrics:
- type: Resource
resource:
name: cpu
target: { type: Utilization, averageUtilization: 70 }
- type: Pods
pods:
metric: { name: http_requests_per_second }
target: { type: AverageValue, averageValue: "1000" }
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
HPA 알고리즘
desired = ceil(currentReplicas × (currentMetric / targetMetric))
예: 현재 4 pod, CPU 80%, 목표 50%:
- desired = ceil(4 × (80/50)) = 7 pod
VPA (Vertical Pod Autoscaler)
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata: { name: web }
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: web
updatePolicy:
updateMode: "Auto" # Off (recommendation only) / Initial / Recreate / Auto
resourcePolicy:
containerPolicies:
- containerName: '*'
minAllowed: { cpu: 50m, memory: 64Mi }
maxAllowed: { cpu: 2, memory: 2Gi }
CAUTION
VPA + HPA on CPU 동시 사용 금지. 둘이 같은 메트릭으로 다툼. HPA 는 custom metric, VPA 는 resource → 분리 가능.
KEDA (Kubernetes Event-Driven Autoscaling)
flowchart LR
Trigger[외부 트리거<br/>Kafka lag, SQS depth, ...] --> KEDA
KEDA --> HPA[표준 HPA 생성]
HPA --> Deploy[Deployment scale]
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata: { name: kafka-consumer }
spec:
scaleTargetRef:
name: consumer
minReplicaCount: 0
maxReplicaCount: 30
triggers:
- type: kafka
metadata:
bootstrapServers: kafka:9092
topic: events
consumerGroup: my-group
lagThreshold: '1000'
IMPORTANT
KEDA 가 2026 시점 표준. 50+ scaler (Kafka, SQS, Prometheus, Redis, DB query, …) 지원. scale-to-zero 가능.
Cluster Autoscaler / Karpenter
flowchart LR
HPA --> NeedMore[새 pod 들이 Pending]
NeedMore --> CA[Cluster Autoscaler]
CA -->|EC2 / GCE| AddNode[새 node 추가]
AddNode --> Schedule[pending pod 스케줄]
| Cluster Autoscaler | Karpenter | |
|---|---|---|
| 종류 | 표준 K8s 도구 | AWS 발 (이제 CNCF) |
| Node 선택 | 미리 정의된 node group | 동적 instance type 선택 |
| 속도 | 분 단위 | 수십 초 |
| 비용 최적화 | 제한적 | 우수 (spot, right-sizing) |
| 클라우드 | 다양 | AWS, Azure |
흔한 함정
WARNING
- stabilization window 너무 짧음 = 빈번한 scale up/down → 비용 + 안정성 문제.
- HPA + VPA 동시 (같은 메트릭) = 충돌. 분리 또는 VPA off mode + 수동.
metrics-server미설치 = HPA 작동 안 함. cluster 부팅 시 자동 설치 확인.- resource request 없음 = HPA CPU 기준 무의미. requests 필수.
관련 위키
- k8s-deployment
- k8s-pod
- prometheus (custom metric)
- kafka-consumer-group (lag-based scaling)
이 글의 용어 (4개)
- [Distributed] Kafka Consumer Group: rebalancing, offset, lagdistributed-systems
- 정의 Consumer Group = 같은 를 가진 consumer 들이 함께 한 topic 을 분담 소비. partition 단위로 분배. Partition 할당 규칙: - pa…
- [K8s] Deployment: ReplicaSet, rolling update, rollbackkubernetes
- 정의 Deployment = stateless 워크로드를 위한 컨트롤러. 내부적으로 ReplicaSet 관리 + rolling update / rollback. 계층 | 객체 |…
- [K8s] Pod: 컨테이너의 최소 단위, sidecar, lifecyclekubernetes
- 정의 Pod = K8s 의 가장 작은 배포 단위. 1개 이상의 컨테이너 + 공유 네트워크 + 공유 스토리지. [!IMPORTANT] Pod 는 컨테이너의 wrapping 이 아니…
- [Observability] Prometheus: pull 기반 메트릭, PromQLdevops
- 정의 Prometheus = pull 기반 시계열 metric 시스템. PromQL 로 쿼리. CNCF graduated. 2026 클라우드 네이티브 메트릭 표준. 아키텍처 Pu…
💬 댓글