1️⃣ 개요
StatefulSet은 일반적으로 데이터를 저장하고 상태를 유지하는 애플리케이션(예: 데이터베이스, 메시지 브로커 등)에 사용됩니다.
그러나, 트래픽 증가 시 Pod 개수를 자동으로 조정해야 하는 경우에도 StatefulSet을 활용할 수 있습니다.
이번 글에서는 StatefulSet에 Horizontal Pod Autoscaler(HPA)를 적용하는 방법과, 고려해야 할 주요 사항을 설명하겠습니다. 🚀
2️⃣ StatefulSet에서 HPA가 필요한 이유
📌 StatefulSet에서 HPA가 필요한 주요 이유
상황 | 설명 |
트래픽 급증 | API 서버, 캐시 서버(예: Redis) 등에서 갑작스러운 트래픽 증가 대응 |
CPU/메모리 부하 증가 | 일정 수준 이상의 리소스 사용량을 초과하면 자동으로 Pod 개수 조정 |
서비스 안정성 유지 | 부하가 높은 시간대에 자동으로 확장하고, 부하가 낮아지면 Pod 개수 축소 |
✅ HPA를 활용하면 StatefulSet도 필요에 따라 자동으로 확장 및 축소할 수 있습니다.
3️⃣ StatefulSet에서 HPA 적용 방법
✅ 1. HPA를 적용하기 위한 전제 조건
HPA를 적용하려면 Metrics Server가 클러스터에 설치되어 있어야 합니다.
📌 Metrics Server 설치 확인
kubectl get deployment -n kube-system | grep metrics-server
📌 설치되지 않았다면 Metrics Server 배포
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
✅ Metrics Server는 HPA가 리소스 사용량을 측정하는 데 필수적입니다.
✅ 2. StatefulSet에 HPA 적용하기 (CPU 기반 AutoScaling)
📌 StatefulSet 정의 (Redis 예제)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis
replicas: 2
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:latest
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"
📌 HPA 적용 (CPU 사용률 기준 자동 확장)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: redis-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: StatefulSet
name: redis
minReplicas: 2
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # CPU 사용률이 70% 이상이면 확장
📌 HPA 적용 후 확인
kubectl apply -f redis-hpa.yaml
kubectl get hpa
✅ 이제 CPU 사용률이 70%를 초과하면 Redis StatefulSet의 Pod 개수가 증가합니다.
4️⃣ StatefulSet에서 HPA 적용 시 고려해야 할 사항
✅ 1. StatefulSet의 Pod는 순차적으로 확장됨
• Deployment와 달리 StatefulSet은 새로운 Pod가 생성될 때 기존 Pod의 준비 상태를 확인하면서 순차적으로 확장됩니다.
• 따라서 HPA가 빠르게 확장되기 어렵고, 초기 확장 속도가 느릴 수 있음
✅ 즉각적인 확장이 필요한 경우 ReplicaSet이나 Deployment를 고려해야 합니다.
✅ 2. HPA 적용 시 PVC(스토리지) 문제 고려
StatefulSet은 각 Pod마다 고유한 Persistent Volume Claim(PVC)을 유지합니다.
📌 PVC 자동 확장 여부 확인
kubectl get pvc
• Pod가 확장될 때, 새로운 PVC가 자동으로 생성되므로 PVC가 올바르게 마운트되는지 확인해야 합니다.
• 일부 클라우드 환경(AWS EBS, Azure Disk)에서는 PVC를 특정 노드에 고정할 수 있기 때문에, StatefulSet 확장 시 PVC가 다른 노드에서 재사용되지 않을 수 있음
✅ PVC 마운트 제한이 없는 분산 스토리지(NFS, CephFS) 사용을 고려해야 합니다.
✅ 3. HPA와 PodDisruptionBudget(PDB) 충돌 방지
📌 StatefulSet에서 HPA와 PDB가 충돌하는 경우
• PDB(Pod Disruption Budget)가 설정되어 있으면, HPA가 Pod를 축소하려고 할 때 제한될 수 있음
• 예를 들어, 최소 2개 이상의 Pod가 항상 유지되도록 PDB를 설정하면, HPA가 Pod를 줄일 수 없음
📌 PodDisruptionBudget 설정 예제
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: redis-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: redis
✅ HPA가 정상적으로 작동하려면 PDB 설정을 확인해야 합니다.
✅ 4. 클러스터 오토스케일링과의 조합 고려
HPA는 Pod 개수를 조정하지만, 클러스터 노드 수를 조정하지 않습니다.
즉, 모든 노드가 꽉 차면 HPA가 확장을 수행할 수 없으므로 Cluster Autoscaler와 함께 운영해야 합니다.
📌 Cluster Autoscaler 상태 확인
kubectl get nodes
✅ 클러스터 리소스가 충분한지 지속적으로 모니터링해야 합니다.
🔥 5️⃣ 결론
✔ StatefulSet에도 HPA를 적용하여 자동 확장이 가능하지만, 확장 속도가 느릴 수 있음
✔ PVC가 Pod마다 다르게 생성되므로, 스토리지 마운트 제한이 없는 스토리지를 사용하는 것이 중요
✔ HPA와 PDB가 충돌할 수 있으므로, 최소 Pod 개수(minAvailable)를 설정할 때 주의해야 함
✔ HPA가 클러스터 리소스를 직접 관리하지 않으므로, Cluster Autoscaler와 함께 운영해야 함
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [DaemonSet 심화편 #2] DaemonSet 업데이트 전략과 무중단 롤링 배포 적용 (0) | 2025.03.21 |
---|---|
📌 [DaemonSet 심화편 #1] DaemonSet의 개념과 일반적인 활용 사례 (0) | 2025.03.21 |
📌 [StatefulSet 심화편 #30] StatefulSet을 활용한 고성능 데이터 저장소 운영 전략 (0) | 2025.03.15 |
📌 [StatefulSet 심화편 #29] StatefulSet에서 Persistent Volume Reclaim 정책 이해 및 활용 (0) | 2025.03.15 |
📌 [StatefulSet 심화편 #28] StatefulSet과 Service Mesh(Istio, Linkerd) 연동 전략 (0) | 2025.03.15 |