1️⃣ 개요
쿠버네티스 환경에서 트래픽이 증가하면 Pod 개수를 동적으로 조정하여 서비스 성능을 최적화하는 것이 중요합니다.
ReplicaSet은 Pod의 개수를 유지하는 역할을 하지만, 트래픽 변화에 따라 자동으로 Pod 개수를 조절할 수는 없습니다.
이를 해결하기 위해 HorizontalPodAutoscaler(HPA) 를 활용하면 CPU 또는 메모리 사용량을 기준으로 **자동 확장(Auto Scaling)**을 수행할 수 있습니다.
이번 글에서는 ReplicaSet과 HPA를 활용하여 Pod 개수를 자동으로 조절하는 방법을 설명하겠습니다.
2️⃣ ReplicaSet과 HPA의 차이
ReplicaSet과 HPA는 Pod의 개수를 관리하는 역할을 하지만, 동작 방식에 차이가 있습니다.
📌 ReplicaSet vs HPA 비교
기능 | ReplicaSet | HPA (HorizontalPodAutoscaler) |
Pod 개수 유지 | 설정된 개수만큼 Pod를 유지 | CPU, 메모리 사용량을 기반으로 자동 조정 |
트래픽 증가 대응 | ❌ 직접 대응 불가 | ✅ 트래픽 증가 시 자동 확장 |
Pod 감소 지원 | ❌ 설정된 replicas보다 줄어들지 않음 | ✅ 필요 시 Pod 자동 축소 |
적용 대상 | Pod, Deployment, StatefulSet | ReplicaSet, Deployment |
✅ 운영 환경에서는 ReplicaSet만 사용하는 것이 아니라 HPA와 함께 활용하여 자동 확장을 적용하는 것이 일반적입니다.
3️⃣ HorizontalPodAutoscaler(HPA) 개념
✅ HPA의 주요 기능
• CPU 또는 메모리 사용량이 설정된 임계치를 초과하면 자동으로 Pod 개수를 증가
• 트래픽이 감소하면 불필요한 Pod를 자동으로 제거
• ReplicaSet, Deployment, StatefulSet에 적용 가능
📌 HPA의 동작 방식
1️⃣ CPU 사용량이 설정된 기준을 초과하면 Pod 개수를 자동으로 증가
2️⃣ 트래픽이 줄어들어 CPU 사용량이 감소하면 Pod 개수를 자동으로 줄임
3️⃣ 최소/최대 Pod 개수를 설정하여 과도한 확장 또는 축소를 방지
📌 HPA 기본 설정 예제
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: ReplicaSet
name: my-replicaset # 대상 ReplicaSet
minReplicas: 2 # 최소 Pod 개수
maxReplicas: 10 # 최대 Pod 개수
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # CPU 사용률이 50%를 넘으면 확장
✅ HPA는 minReplicas와 maxReplicas 사이에서 Pod 개수를 자동으로 조절합니다.
✅ 기본적으로 CPU 사용률을 기준으로 확장하지만, 메모리 또는 사용자 정의 메트릭을 활용할 수도 있습니다.
4️⃣ HPA 적용 및 테스트 방법
HPA를 적용하려면 Metrics Server가 필요하며, 이를 먼저 설치해야 합니다.
✅ 1. Metrics Server 설치
📌 Metrics Server가 설치되지 않은 경우 추가
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
📌 Metrics Server가 정상적으로 실행 중인지 확인
kubectl get deployment metrics-server -n kube-system
✅ 2. ReplicaSet 배포 및 HPA 적용
📌 ReplicaSet 배포
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
resources:
requests:
cpu: "100m"
limits:
cpu: "500m"
📌 HPA 배포
kubectl apply -f hpa.yaml
📌 HPA 적용 확인
kubectl get hpa
✅ HPA가 정상적으로 동작하는지 확인하고, 트래픽 부하 테스트를 진행해야 합니다.
5️⃣ HPA 테스트 (트래픽 부하 발생 시 Pod 증가 확인)
📌 CPU 부하를 인위적으로 증가시키기 (stress 명령어 사용)
kubectl run -it --rm load-generator --image=busybox -- /bin/sh -c "while true; do wget -q -O- http://my-service; done"
📌 HPA의 자동 확장 여부 확인
kubectl get hpa -w
📌 Pod 개수 확인 (확장이 진행되는지 확인)
kubectl get pods
✅ 트래픽이 증가하면 HPA가 자동으로 새로운 Pod를 생성하는지 확인할 수 있습니다.
6️⃣ HPA 활용 시 주의해야 할 점
✅ 1. 최소/최대 Pod 개수를 적절히 설정
• 트래픽이 급격히 증가할 경우, maxReplicas 값이 너무 낮으면 서비스 장애가 발생할 수 있음
• 반대로, minReplicas가 너무 높으면 불필요한 리소스를 소비할 수 있음
• 📌 적절한 값 설정 예제:
minReplicas: 3
maxReplicas: 20
✅ 2. HPA는 requests.cpu 값이 설정된 컨테이너에서만 동작
• HPA는 CPU 사용률을 기준으로 동작하므로, requests.cpu가 설정되지 않은 컨테이너는 확장 대상에서 제외됨
• 📌 올바른 설정 예제:
resources:
requests:
cpu: "100m"
limits:
cpu: "500m"
✅ 3. 메모리 기반 확장은 type: Memory를 추가해야 함
• 기본적으로 HPA는 CPU 사용률을 기준으로 확장하지만, 메모리 사용량을 기준으로 확장하려면 type: Memory를 추가해야 합니다.
• 📌 메모리 기반 HPA 설정 예제:
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70 # 메모리 사용률이 70% 이상이면 확장
✅ 운영 환경에서는 CPU와 메모리 사용량을 함께 고려하여 HPA를 설정하는 것이 중요합니다.
🔥 7️⃣ 결론
✔ ReplicaSet은 설정된 개수만큼 Pod를 유지하지만, 트래픽 변화에 따라 자동으로 조절하지는 못합니다.
✔ HPA를 활용하면 CPU 또는 메모리 사용량을 기준으로 Pod 개수를 자동으로 조정할 수 있습니다.
✔ HPA를 적용하려면 metrics-server가 필요하며, requests.cpu 값이 설정된 컨테이너에서만 동작합니다.
✔ 운영 환경에서는 최소/최대 Pod 개수를 적절히 설정하고, CPU 및 메모리 기반 확장을 병행하는 것이 중요합니다.
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [ReplicaSet 심화편 #5] ReplicaSet과 RollingUpdate 전략을 활용한 배포 관리 (0) | 2025.03.12 |
---|---|
📌 [ReplicaSet 심화편 #4] ReplicaSet과 PodDisruptionBudget(PDB)을 활용한 안정적인 운영 (0) | 2025.03.12 |
📌 [ReplicaSet 심화편 #2] ReplicaSet의 동작 원리와 트러블슈팅 (0) | 2025.03.12 |
📌 [ReplicaSet 심화편 #1] ReplicaSet의 역할과 활용 방법 (0) | 2025.03.12 |
📌 [Pod 심화편 #6] Pod 트러블슈팅: 자주 발생하는 문제들 (0) | 2025.03.12 |