Skip to content

Commit 35bbf4e

Browse files
Copilothellices
andcommitted
Add AKS HPA configuration guide and best practices (aks/hpa.md)
Agent-Logs-Url: https://github.com/hellices/devguidesample/sessions/2a91cdb7-e2ef-48af-87e4-4de623883ab3 Co-authored-by: hellices <5661904+hellices@users.noreply.github.com>
1 parent e206f6b commit 35bbf4e

1 file changed

Lines changed: 353 additions & 0 deletions

File tree

‎aks/hpa.md‎

Lines changed: 353 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,353 @@
1+
# ✅ AKS HPA(Horizontal Pod Autoscaler) 설정 가이드 및 Best Practice
2+
3+
**CPU/메모리 기반 자동 스케일링부터 커스텀 메트릭(KEDA)까지 실무 예시**
4+
5+
***
6+
7+
## 📌 HPA란?
8+
9+
HPA(Horizontal Pod Autoscaler)는 Kubernetes에서 Pod의 부하(CPU, 메모리, 커스텀 메트릭 등)에 따라 **Deployment/ReplicaSet의 Pod 수를 자동으로 조절**하는 리소스입니다.
10+
11+
> **권장 API 버전**: `autoscaling/v2` (Kubernetes 1.23+, AKS 기본 지원)
12+
> `autoscaling/v1`은 CPU 단일 메트릭만 지원하므로 `v2` 사용 권장
13+
14+
***
15+
16+
## ✅ 1. 기본 HPA — CPU 기반 스케일링
17+
18+
### 전제 조건
19+
20+
- Pod에 **CPU `requests`** 설정 필수 (없으면 HPA 동작 불가)
21+
- `metrics-server` 활성화 (AKS에서는 기본 포함)
22+
23+
### Deployment 예시
24+
25+
```yaml
26+
apiVersion: apps/v1
27+
kind: Deployment
28+
metadata:
29+
name: my-app
30+
namespace: default
31+
spec:
32+
replicas: 2
33+
selector:
34+
matchLabels:
35+
app: my-app
36+
template:
37+
metadata:
38+
labels:
39+
app: my-app
40+
spec:
41+
containers:
42+
- name: my-app
43+
image: myregistry.azurecr.io/my-app:latest
44+
resources:
45+
requests:
46+
cpu: "250m"
47+
memory: "256Mi"
48+
limits:
49+
cpu: "500m"
50+
memory: "512Mi"
51+
```
52+
53+
### HPA YAML (CPU 기반)
54+
55+
```yaml
56+
apiVersion: autoscaling/v2
57+
kind: HorizontalPodAutoscaler
58+
metadata:
59+
name: my-app-hpa
60+
namespace: default
61+
spec:
62+
scaleTargetRef:
63+
apiVersion: apps/v1
64+
kind: Deployment
65+
name: my-app
66+
minReplicas: 2
67+
maxReplicas: 10
68+
metrics:
69+
- type: Resource
70+
resource:
71+
name: cpu
72+
target:
73+
type: Utilization
74+
averageUtilization: 60 # 요청 대비 60% 초과 시 스케일 아웃
75+
behavior:
76+
scaleUp:
77+
stabilizationWindowSeconds: 60 # 스케일 아웃 전 안정화 대기(초)
78+
policies:
79+
- type: Pods
80+
value: 2
81+
periodSeconds: 60 # 60초마다 최대 2개씩 증가
82+
scaleDown:
83+
stabilizationWindowSeconds: 300 # 스케일 인 전 5분 대기 (플래핑 방지)
84+
policies:
85+
- type: Percent
86+
value: 10
87+
periodSeconds: 60 # 60초마다 최대 10%씩 감소
88+
```
89+
90+
***
91+
92+
## ✅ 2. 메모리 기반 HPA
93+
94+
```yaml
95+
apiVersion: autoscaling/v2
96+
kind: HorizontalPodAutoscaler
97+
metadata:
98+
name: my-app-hpa-mem
99+
namespace: default
100+
spec:
101+
scaleTargetRef:
102+
apiVersion: apps/v1
103+
kind: Deployment
104+
name: my-app
105+
minReplicas: 2
106+
maxReplicas: 10
107+
metrics:
108+
- type: Resource
109+
resource:
110+
name: memory
111+
target:
112+
type: Utilization
113+
averageUtilization: 70 # 요청 대비 70% 초과 시 스케일 아웃
114+
```
115+
116+
> ⚠️ 메모리 기반 HPA는 스케일 인 시 메모리가 즉각 해제되지 않을 수 있어, `scaleDown.stabilizationWindowSeconds`를 넉넉히 설정하는 것이 중요합니다.
117+
118+
***
119+
120+
## ✅ 3. CPU + 메모리 복합 메트릭 HPA
121+
122+
```yaml
123+
apiVersion: autoscaling/v2
124+
kind: HorizontalPodAutoscaler
125+
metadata:
126+
name: my-app-hpa-combined
127+
namespace: default
128+
spec:
129+
scaleTargetRef:
130+
apiVersion: apps/v1
131+
kind: Deployment
132+
name: my-app
133+
minReplicas: 2
134+
maxReplicas: 20
135+
metrics:
136+
- type: Resource
137+
resource:
138+
name: cpu
139+
target:
140+
type: Utilization
141+
averageUtilization: 60
142+
- type: Resource
143+
resource:
144+
name: memory
145+
target:
146+
type: Utilization
147+
averageUtilization: 70
148+
behavior:
149+
scaleUp:
150+
stabilizationWindowSeconds: 60
151+
scaleDown:
152+
stabilizationWindowSeconds: 300
153+
```
154+
155+
> 📝 복합 메트릭 사용 시, HPA는 **각 메트릭에서 계산된 목표 replica 수 중 가장 큰 값**을 선택합니다.
156+
157+
***
158+
159+
## ✅ 4. KEDA를 이용한 커스텀 메트릭 기반 HPA
160+
161+
[KEDA(Kubernetes Event-driven Autoscaling)](https://keda.sh/)는 Azure Service Bus, Event Hub, HTTP 요청 수 등 다양한 이벤트 소스를 기반으로 스케일링할 수 있게 해주는 AKS 애드온입니다.
162+
163+
### KEDA 애드온 활성화 (AKS)
164+
165+
```bash
166+
az aks update \
167+
--resource-group myRG \
168+
--name myAKS \
169+
--enable-keda
170+
```
171+
172+
### Azure Service Bus 큐 기반 ScaledObject 예시
173+
174+
```yaml
175+
apiVersion: keda.sh/v1alpha1
176+
kind: ScaledObject
177+
metadata:
178+
name: my-app-scaledobject
179+
namespace: default
180+
spec:
181+
scaleTargetRef:
182+
name: my-app
183+
minReplicaCount: 1
184+
maxReplicaCount: 20
185+
cooldownPeriod: 300 # 스케일 인 전 대기 시간(초)
186+
pollingInterval: 30 # 메트릭 폴링 주기(초)
187+
triggers:
188+
- type: azure-servicebus
189+
metadata:
190+
queueName: my-queue
191+
namespace: my-servicebus-namespace
192+
messageCount: "10" # 큐 메시지 10개당 Pod 1개
193+
authenticationRef:
194+
name: my-trigger-auth
195+
```
196+
197+
### Azure Event Hub 기반 ScaledObject 예시
198+
199+
```yaml
200+
apiVersion: keda.sh/v1alpha1
201+
kind: ScaledObject
202+
metadata:
203+
name: eventhub-scaledobject
204+
namespace: default
205+
spec:
206+
scaleTargetRef:
207+
name: my-app
208+
minReplicaCount: 0 # 이벤트 없을 때 0으로 스케일 인 가능
209+
maxReplicaCount: 30
210+
triggers:
211+
- type: azure-event-hub
212+
metadata:
213+
consumerGroup: $Default
214+
unprocessedEventThreshold: "100" # 처리 안 된 이벤트 100개당 Pod 1개
215+
activationUnprocessedEventThreshold: "10"
216+
storageConnectionFromEnv: STORAGE_CONNECTION_STRING
217+
eventHubConnectionFromEnv: EVENTHUB_CONNECTION_STRING
218+
```
219+
220+
### HTTP 요청 기반 ScaledObject 예시 (http-add-on)
221+
222+
```yaml
223+
apiVersion: http.keda.sh/v1alpha1
224+
kind: HTTPScaledObject
225+
metadata:
226+
name: my-app-http-scaledobject
227+
namespace: default
228+
spec:
229+
hosts:
230+
- my-app.example.com
231+
targetPendingRequests: 100 # 대기 요청 100개당 Pod 1개
232+
scaleTargetRef:
233+
name: my-app
234+
port: 8080
235+
replicas:
236+
min: 1
237+
max: 10
238+
```
239+
240+
***
241+
242+
## ✅ 5. HPA + Cluster Autoscaler 조합
243+
244+
HPA는 Pod 수를 늘리지만, **노드가 부족한 경우 Cluster Autoscaler(CA)와 함께 사용**해야 합니다.
245+
246+
```bash
247+
# Cluster Autoscaler 활성화 (노드 풀 생성 시)
248+
az aks nodepool add \
249+
--resource-group myRG \
250+
--cluster-name myAKS \
251+
--name workload \
252+
--enable-cluster-autoscaler \
253+
--min-count 2 \
254+
--max-count 10 \
255+
--node-count 2
256+
```
257+
258+
```bash
259+
# 기존 노드 풀에 Cluster Autoscaler 활성화
260+
az aks nodepool update \
261+
--resource-group myRG \
262+
--cluster-name myAKS \
263+
--name workload \
264+
--enable-cluster-autoscaler \
265+
--min-count 2 \
266+
--max-count 10
267+
```
268+
269+
### HPA + CA 동작 흐름
270+
271+
```
272+
부하 증가
273+
└─▶ HPA: Pod 수 증가 요청
274+
└─▶ 노드 여유 있음 → 즉시 Pod 스케줄링
275+
└─▶ 노드 부족 (Pending Pod 발생)
276+
└─▶ Cluster Autoscaler: 노드 추가
277+
└─▶ Pod 스케줄링 완료
278+
```
279+
280+
> 💡 **VMSS Node Pool** 사용 시 CA 동작이 더 빠르고 안정적입니다.
281+
282+
***
283+
284+
## 🔍 Best Practice 정리
285+
286+
| 항목 | 권장 사항 |
287+
|------|----------|
288+
| **API 버전** | `autoscaling/v2` 사용 (다중 메트릭, behavior 지원) |
289+
| **requests 설정** | 모든 컨테이너에 CPU/메모리 `requests` 반드시 설정 |
290+
| **minReplicas** | 고가용성을 위해 최소 2 이상 권장 |
291+
| **스케일 아웃 임계값** | CPU 기준 60~70% 권장 (너무 높으면 대응 지연) |
292+
| **scaleDown 안정화** | `stabilizationWindowSeconds: 300` (5분) 이상 권장, 플래핑 방지 |
293+
| **scaleUp 속도** | 급격한 트래픽 증가에 대비해 `scaleUp.policies` 로 증가 속도 제어 |
294+
| **Cluster Autoscaler** | HPA와 반드시 함께 사용, 노드 자동 증설 필수 |
295+
| **VPA와 혼용** | 동일 Deployment에 HPA(CPU/메모리)와 VPA를 함께 쓰지 않음 (충돌 위험) |
296+
| **커스텀 메트릭** | 비즈니스 특성에 맞는 메트릭(큐 길이, HTTP RPS 등)에는 KEDA 사용 |
297+
| **PDB 설정** | 스케일 인 시 서비스 중단 방지를 위해 PodDisruptionBudget 함께 설정 |
298+
299+
### PodDisruptionBudget 예시
300+
301+
```yaml
302+
apiVersion: policy/v1
303+
kind: PodDisruptionBudget
304+
metadata:
305+
name: my-app-pdb
306+
namespace: default
307+
spec:
308+
minAvailable: 2 # 스케일 인/노드 드레인 중에도 최소 2개 Pod 유지
309+
selector:
310+
matchLabels:
311+
app: my-app
312+
```
313+
314+
***
315+
316+
## 🔍 HPA 상태 확인 명령어
317+
318+
```bash
319+
# HPA 상태 조회
320+
kubectl get hpa -n default
321+
322+
# HPA 상세 정보 (이벤트, 현재 메트릭 포함)
323+
kubectl describe hpa my-app-hpa -n default
324+
325+
# 실시간 Pod 수 변화 모니터링
326+
kubectl get hpa my-app-hpa -n default -w
327+
328+
# KEDA ScaledObject 상태 확인
329+
kubectl get scaledobject -n default
330+
kubectl describe scaledobject my-app-scaledobject -n default
331+
```
332+
333+
***
334+
335+
## 📚 참고 링크
336+
337+
- **Kubernetes 공식 문서**
338+
- [Horizontal Pod Autoscaling](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/)
339+
- [HPA Walkthrough](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/)
340+
- [autoscaling/v2 API Reference](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/horizontal-pod-autoscaler-v2/)
341+
342+
- **Microsoft Learn**
343+
- [AKS에서 애플리케이션 자동 스케일링](https://learn.microsoft.com/ko-kr/azure/aks/concepts-scale)
344+
- [AKS KEDA 애드온](https://learn.microsoft.com/ko-kr/azure/aks/keda-about)
345+
- [AKS Cluster Autoscaler](https://learn.microsoft.com/ko-kr/azure/aks/cluster-autoscaler)
346+
- [AKS Best Practices — 스케줄러](https://learn.microsoft.com/ko-kr/azure/aks/operator-best-practices-advanced-scheduler)
347+
348+
- **KEDA**
349+
- [KEDA 공식 문서](https://keda.sh/docs/)
350+
- [KEDA Azure Service Bus 트리거](https://keda.sh/docs/scalers/azure-service-bus/)
351+
- [KEDA Azure Event Hub 트리거](https://keda.sh/docs/scalers/azure-event-hub/)
352+
353+
***

0 commit comments

Comments
 (0)