Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #21] StatefulSet과 Horizontal Pod Autoscaler(HPA) 적용 방법

ygtoken 2025. 3. 15. 14:01
728x90

 

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와 함께 운영해야 함

728x90