쿠버네티스의 HorizontalPodAutoscaler(HPA)는 CPU뿐만 아니라 메모리 및 사용자 정의 메트릭을 기반으로도 확장할 수 있습니다.
이번 글에서는 메모리 사용량을 기반으로 HPA를 설정하는 방법과 사용자 정의 메트릭(Custom Metrics)으로 확장하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ 메모리 사용량을 기반으로 자동 확장
2️⃣ 사용자 정의 메트릭(Custom Metrics) 기반 확장
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ 메모리 사용량을 기반으로 자동 확장
❓ 문제 상황
운영팀에서 CPU 사용량이 아니라 메모리 사용량을 기준으로 HPA를 설정해야 하는 요구사항이 생겼습니다.
애플리케이션이 메모리를 많이 사용하는 경우, Pod의 개수가 자동으로 확장되어야 합니다.
• Deployment의 이름은 hpa-memory-app이어야 합니다.
• 초기 Pod 개수는 1개이며, 최대 5개까지 확장 가능해야 합니다.
• 메모리 사용량이 200Mi를 초과하면 자동으로 확장되어야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. HPA의 metrics 항목을 수정하여 메모리(memory) 사용량을 기준으로 확장하도록 설정해야 합니다.
• averageValue: 200Mi → 메모리 사용량이 200MiB를 초과하면 확장
2. Pod에 메모리 부하를 발생시키고 HPA가 정상적으로 확장되는지 확인해야 합니다.
✅ 정답 Manifest (메모리 기반 HPA 설정)
apiVersion: apps/v1
kind: Deployment
metadata:
name: hpa-memory-app # Deployment 이름
spec:
replicas: 1 # 초기 Pod 개수
selector:
matchLabels:
app: hpa-memory-app # 레이블 선택
template:
metadata:
labels:
app: hpa-memory-app # Pod 레이블
spec:
containers:
- name: memory-stress
image: polinux/stress # 메모리 부하 테스트용 이미지
resources:
requests:
memory: "100Mi"
limits:
memory: "500Mi"
args:
- "--vm"
- "1"
- "--vm-bytes"
- "250M"
- "--vm-hang"
- "0"
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-memory-app # HPA 이름
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpa-memory-app # HPA가 적용될 Deployment
minReplicas: 1 # 최소 Pod 개수
maxReplicas: 5 # 최대 Pod 개수
metrics:
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 200Mi # 메모리 사용량이 200MiB를 초과하면 확장
📌 적용 후 예상 결과 값
1. Deployment 및 HPA 생성 확인
kubectl get deployment hpa-memory-app
kubectl get hpa
💡 예상 출력 값
NAME READY UP-TO-DATE AVAILABLE AGE
hpa-memory-app 1/1 1 1 5s
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-memory-app Deployment/hpa-memory-app 0/200Mi 1 5 1 5s
2. 메모리 부하 발생 후 Pod 개수 증가 확인
kubectl run --rm -it load-generator --image=polinux/stress -- --vm 1 --vm-bytes 300M --vm-hang 0
💡 예상 출력 값
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-memory-app Deployment/hpa-memory-app 250Mi/200Mi 1 5 3 1m
3. Pod 개수가 증가했는지 확인
kubectl get pods -l app=hpa-memory-app
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
hpa-memory-app-xyz1 1/1 Running 0 1m
hpa-memory-app-abc2 1/1 Running 0 30s
hpa-memory-app-def3 1/1 Running 0 20s
2️⃣ 사용자 정의 메트릭(Custom Metrics) 기반 확장
❓ 문제 상황
운영팀에서 CPU나 메모리가 아닌, 사용자 정의 메트릭(Custom Metrics)을 기반으로 HPA를 설정해야 하는 요구사항이 생겼습니다.
예를 들어 애플리케이션의 요청 수(Request Count)가 일정 수준을 초과하면 자동으로 확장되도록 설정해야 합니다.
• Deployment의 이름은 hpa-custom-metrics-app이어야 합니다.
• prometheus-adapter를 사용하여 사용자 정의 메트릭을 적용해야 합니다.
• 초당 요청 수가 100을 초과하면 자동 확장되도록 설정해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Prometheus Adapter를 사용하여 사용자 정의 메트릭을 HPA에 적용해야 합니다.
• prometheus-adapter를 설치하여 사용자 정의 메트릭을 수집
2. HPA를 설정하여 특정 요청 수 이상이면 Pod이 확장되도록 설정해야 합니다.
✅ 정답 Manifest (사용자 정의 메트릭 기반 HPA 설정)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-custom-metrics-app # HPA 이름
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpa-custom-metrics-app # HPA가 적용될 Deployment
minReplicas: 1 # 최소 Pod 개수
maxReplicas: 5 # 최대 Pod 개수
metrics:
- type: External
external:
metric:
name: http_requests_per_second # 사용자 정의 메트릭 이름
target:
type: AverageValue
averageValue: "100" # 초당 요청 수가 100을 초과하면 확장