1️⃣ 개요
StatefulSet은 각 Pod가 고유한 ID와 Persistent Volume을 유지하는 특성 때문에 Deployment보다 스케일링이 더 까다롭습니다.
특히, StatefulSet의 크기를 조정(스케일링)할 때 발생할 수 있는 데이터 불균형 문제를 해결해야 합니다.
이번 글에서는 StatefulSet의 수직/수평 스케일링 방법과, 데이터 리밸런싱 전략을 포함한 안정적인 운영 방법을 설명하겠습니다. 🚀
2️⃣ StatefulSet 스케일링 방식
StatefulSet을 스케일링하는 방식은 일반적인 Deployment와 다릅니다.
• ✅ Pod는 순서대로 추가 및 삭제됨 (pod-0 → pod-1 → pod-2)
• ✅ 각 Pod는 고유한 Persistent Volume을 유지함
• ✅ 스케일 다운할 경우, 마지막 Pod부터 순차적으로 제거됨 (pod-2 → pod-1 → pod-0)
✅ 즉, StatefulSet의 스케일링은 순서대로 실행되며, 특정 Pod를 건너뛸 수 없습니다.
3️⃣ StatefulSet 스케일 아웃(확장) 방법
StatefulSet의 스케일 아웃(Scale-Out)은 새로운 Pod가 추가되며, 자동으로 새로운 PVC가 생성되는 방식입니다.
이는 StatefulSet이 실행 중인 데이터베이스, 메시지 브로커 등에 새로운 노드를 추가하는 것과 동일한 개념입니다.
📌 StatefulSet 스케일 아웃 명령어
kubectl scale statefulset mysql --replicas=5
📌 확장된 StatefulSet 확인
kubectl get pods -l app=mysql
📌 새로 생성된 PVC 확인 (Pod 수에 맞춰 자동 생성됨)
kubectl get pvc
✅ StatefulSet을 확장하면 새로운 Pod가 자동으로 추가되고, Persistent Volume도 함께 생성됩니다.
✅ 1. 스케일 아웃 시 고려해야 할 점
1️⃣ 새로운 Pod가 기존 데이터와 동기화되는 과정이 필요함
2️⃣ 마스터-슬레이브 구조에서는 새로운 슬레이브 노드가 정상적으로 연결되었는지 확인해야 함
3️⃣ 데이터베이스의 경우, 새로운 노드가 데이터 리밸런싱을 수행하는지 모니터링 필요
📌 새로운 MySQL Pod가 정상적으로 동기화되었는지 확인
kubectl exec -it mysql-4 -- mysql -u root -p -e "SHOW SLAVE STATUS\G"
✅ 새로운 노드가 클러스터와 정상적으로 동기화되었는지 반드시 확인해야 합니다.
4️⃣ StatefulSet 스케일 인(축소) 방법과 데이터 정합성 문제
✅ 1. StatefulSet 스케일 인(Scale-In) 명령어
kubectl scale statefulset mysql --replicas=3
✅ 이렇게 하면 mysql-4, mysql-3 순서대로 삭제됩니다.
📌 삭제된 PVC 확인
kubectl get pvc
✅ 2. StatefulSet 스케일 인 시 발생할 수 있는 문제점
StatefulSet을 축소할 때, 단순히 Pod를 삭제하는 것이 아니라 데이터도 함께 고려해야 합니다.
특히, 데이터베이스, 메시지 큐 등의 애플리케이션에서 노드를 제거할 경우 데이터 리밸런싱이 필요합니다.
🔹 (1) StatefulSet 축소 시 PVC 자동 삭제 문제
기본적으로 StatefulSet을 축소하면 PVC는 자동으로 삭제되지 않습니다.
따라서 필요하지 않은 PVC를 직접 삭제해야 합니다.
📌 삭제된 Pod의 PVC 정리하기
kubectl delete pvc mysql-data-mysql-4
kubectl delete pvc mysql-data-mysql-3
✅ StatefulSet 축소 후 불필요한 PVC를 정리해야 합니다.
🔹 (2) 데이터베이스 클러스터에서 스케일 인 시 데이터 리밸런싱 필요
• MySQL, PostgreSQL 같은 데이터베이스에서는 슬레이브 노드가 삭제될 경우, 남아 있는 노드가 데이터 리밸런싱을 수행해야 합니다.
• Kafka, Elasticsearch 같은 분산 스토리지 시스템에서는 삭제된 노드에 저장된 데이터를 다른 노드로 이동하는 과정이 필요합니다.
📌 Kafka에서 특정 노드 삭제 후 리밸런싱 실행 예제
kubectl exec -it kafka-0 -- kafka-reassign-partitions --zookeeper zookeeper:2181 --reassignment-json-file rebalance.json
✅ 스케일 인할 때는 반드시 데이터 리밸런싱 작업이 필요합니다.
5️⃣ StatefulSet 리밸런싱 문제 해결 방법
StatefulSet을 스케일 조정하면, 데이터 불균형이 발생할 가능성이 높습니다.
이를 해결하려면 수동 또는 자동 리밸런싱 전략을 적용해야 합니다.
✅ 1. 데이터베이스 클러스터에서 리더 재조정 수행
• MySQL Galera, PostgreSQL, MongoDB 등은 노드 수가 변경되면 리더 선출이 필요
• 리더 노드를 삭제하면 팔로워가 자동으로 새로운 리더를 선출하는지 확인해야 함
📌 MySQL에서 현재 리더 노드 확인
kubectl exec -it mysql-0 -- mysql -u root -p -e "SHOW STATUS LIKE 'wsrep%';"
📌 MongoDB에서 리더 확인 및 강제 재선출
kubectl exec -it mongo-0 -- mongo --eval "rs.status()"
kubectl exec -it mongo-0 -- mongo --eval "rs.stepDown()"
✅ 리더 노드를 삭제하면 자동으로 새로운 리더가 지정되는지 확인해야 합니다.
✅ 2. Kafka, Elasticsearch 등 분산 저장소의 자동 리밸런싱 설정
• Kafka, Elasticsearch 등의 분산 시스템에서는 노드 추가/삭제 시 자동으로 데이터를 분산하도록 설정할 수 있습니다.
📌 Elasticsearch에서 데이터 자동 리밸런싱 활성화
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d '{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}'
✅ 리밸런싱이 자동으로 수행되는지 확인하고, 필요한 경우 수동으로 트리거할 수 있습니다.
🔥 6️⃣ 결론
✔ StatefulSet의 스케일 아웃 시 새로운 PVC가 생성되며, 데이터 동기화가 필요함
✔ 스케일 인 시 PVC는 자동 삭제되지 않으므로 불필요한 PVC를 정리해야 함
✔ 데이터베이스 클러스터에서 노드를 제거할 경우, 리더 재조정 및 데이터 리밸런싱이 필요함
✔ Kafka, Elasticsearch 같은 분산 스토리지 시스템에서는 자동 리밸런싱을 활성화해야 함
✔ StatefulSet 스케일 조정 후 정상적으로 데이터가 유지되는지 반드시 검증해야 함
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [StatefulSet 심화편 #7] StatefulSet에서 특정 Pod 재시작 및 복구 전략 (0) | 2025.03.14 |
---|---|
📌 [StatefulSet 심화편 #6] StatefulSet의 장애 복구와 데이터 정합성 유지 전략 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #4] StatefulSet의 롤링 업데이트와 데이터 정합성 유지 전략 (0) | 2025.03.13 |
📌 [StatefulSet 심화편 #3] StatefulSet의 데이터 영속성과 Persistent Volume 관리 (0) | 2025.03.13 |
📌 [StatefulSet 심화편 #2] StatefulSet의 Pod 네트워크와 DNS 관리 (0) | 2025.03.13 |