1️⃣ 개요
StatefulSet을 운영하다 보면 기존 StatefulSet을 새로운 클러스터로 이동하거나, 스토리지 백엔드를 변경하는 등의 마이그레이션이 필요할 수 있습니다.
그러나 Stateful 애플리케이션은 데이터 일관성을 유지해야 하며, 중단 없이 안전하게 마이그레이션하는 것이 매우 중요합니다.
이번 글에서는 StatefulSet을 무중단으로 마이그레이션하는 다양한 전략과 실전 적용 방법을 정리하겠습니다. 🚀
2️⃣ StatefulSet 마이그레이션이 필요한 주요 시나리오
📌 StatefulSet을 마이그레이션해야 하는 주요 이유
상황 | 설명 |
클러스터 업그레이드 | 새로운 Kubernetes 버전의 클러스터로 이동해야 하는 경우 |
스토리지 백엔드 변경 | 기존 스토리지를 NFS, Ceph, Portworx 등으로 변경해야 하는 경우 |
기존 리소스 정리 및 최적화 | 다른 네임스페이스나 노드 그룹으로 StatefulSet을 이동하는 경우 |
✅ StatefulSet 마이그레이션은 단순히 Pod를 재배포하는 것이 아니라, 데이터 무결성을 유지하면서 안정적으로 진행해야 합니다.
3️⃣ StatefulSet 무중단 마이그레이션 방법
✅ 1. 동일 클러스터 내에서 StatefulSet을 다른 네임스페이스로 이동하는 방법
📌 (1) 기존 StatefulSet 및 PVC 백업
kubectl get statefulset -n old-namespace -o yaml > statefulset-backup.yaml
kubectl get pvc -n old-namespace -o yaml > pvc-backup.yaml
📌 (2) 새로운 네임스페이스 생성
kubectl create namespace new-namespace
📌 (3) 기존 PVC를 새로운 네임스페이스로 이동
• PVC는 특정 네임스페이스에 종속되므로, 직접 이동할 수 없음
• 기존 PV를 유지하면서 새로운 PVC를 연결해야 함
kubectl patch pv <PV_NAME> -p '{"spec":{"claimRef":{"namespace":"new-namespace"}}}'
📌 (4) StatefulSet을 새로운 네임스페이스에 배포
kubectl apply -f statefulset-backup.yaml -n new-namespace
✅ 이제 StatefulSet이 새로운 네임스페이스에서 기존 PVC를 그대로 유지한 채 실행됩니다.
✅ 2. 다른 클러스터로 StatefulSet을 마이그레이션하는 방법
📌 (1) 기존 StatefulSet 및 PVC 백업
kubectl get statefulset -n default -o yaml > statefulset-backup.yaml
kubectl get pvc -n default -o yaml > pvc-backup.yaml
📌 (2) PV 데이터를 새로운 클러스터로 복제 (예: rsync, Velero 활용)
• NFS, CephFS 같은 네트워크 스토리지를 사용하면 PVC를 동일한 볼륨으로 마운트 가능
• 그렇지 않은 경우 데이터 복제 툴 활용
📌 rsync를 활용한 데이터 복제 예제
rsync -avz /mnt/data/ mysql-user@new-cluster:/mnt/data/
📌 (3) 새로운 클러스터에서 StatefulSet 배포
kubectl apply -f statefulset-backup.yaml
✅ 이제 StatefulSet이 새로운 클러스터에서도 동일한 데이터를 유지하면서 실행됩니다.
✅ 3. StatefulSet 스토리지 백엔드 변경 (예: 기존 PVC를 NFS로 마이그레이션)
📌 (1) 기존 PVC와 PV 백업
kubectl get pvc -n default -o yaml > pvc-backup.yaml
kubectl get pv -n default -o yaml > pv-backup.yaml
📌 (2) 새로운 스토리지(PV) 생성 (NFS 예제)
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany
nfs:
path: /mnt/nfs/data
server: 192.168.1.100
📌 (3) 새로운 PVC를 생성하여 StatefulSet에 연결
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
volumeName: nfs-pv
📌 (4) 기존 StatefulSet을 새로운 PVC로 연결 후 재배포
kubectl delete statefulset mysql --cascade=orphan
kubectl apply -f statefulset-backup.yaml
✅ 이제 StatefulSet이 새로운 NFS 기반 스토리지에서 실행됩니다.
4️⃣ StatefulSet 무중단 마이그레이션 시 고려해야 할 사항
✅ 1. PVC 데이터 정합성 유지
• 스토리지를 변경할 경우 데이터 동기화가 100% 완료된 후에 StatefulSet을 재배포해야 함
• rsync, Velero 같은 백업 및 복구 툴을 활용하여 데이터 손실 없이 이전
📌 데이터 복제 상태 확인
kubectl get pvc -n new-namespace
✅ PVC가 올바르게 마운트되었는지 확인 후 StatefulSet을 실행해야 합니다.
✅ 2. StatefulSet 재배포 시 Pod 순서 유지
• StatefulSet은 각 Pod가 특정 순서로 실행되므로, 마이그레이션 후에도 동일한 순서를 유지해야 함
• 특히, Kafka, Zookeeper, Elasticsearch 같은 분산 시스템에서는 Pod 순서를 변경하면 데이터 정합성이 깨질 수 있음
📌 기존 Pod 순서를 유지한 상태에서 StatefulSet 재배포
kubectl scale statefulset kafka --replicas=0
kubectl apply -f statefulset-backup.yaml
kubectl scale statefulset kafka --replicas=3
✅ Pod 순서를 유지하면서 새로운 클러스터에서 StatefulSet이 정상적으로 동작하도록 해야 합니다.
✅ 3. DNS 및 네트워크 라우팅 유지
• StatefulSet Pod는 일반적으로 Headless Service를 사용하므로, 마이그레이션 후에도 DNS 주소가 유지되어야 함
• 클러스터 네트워크 환경이 변경될 경우 ExternalDNS, Istio 등을 활용하여 기존 DNS 주소를 유지
📌 기존 DNS를 유지하면서 새로운 클러스터로 트래픽 우회 (Istio 활용)
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: mysql
spec:
hosts:
- mysql.example.com
http:
- route:
- destination:
host: mysql-old-cluster
weight: 50
- destination:
host: mysql-new-cluster
weight: 50
✅ 점진적으로 트래픽을 새로운 StatefulSet으로 이동하면서 무중단 마이그레이션을 수행할 수 있습니다.
🔥 5️⃣ 결론
✔ StatefulSet을 네임스페이스 간 이동할 경우, 기존 PVC를 유지하면서 이동해야 함
✔ 다른 클러스터로 이동할 경우, 데이터 동기화를 수행한 후 StatefulSet을 배포해야 함
✔ 스토리지 변경 시 기존 PV/PVC를 백업한 후 새로운 볼륨을 생성하여 마이그레이션해야 함
✔ Pod 실행 순서를 유지하여 데이터 정합성을 보장해야 함
✔ DNS 및 네트워크 라우팅을 유지하여 클라이언트가 새로운 StatefulSet을 인식할 수 있도록 해야 함