Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #23] StatefulSet에서 Zero Downtime Migration(무중단 마이그레이션) 전략

ygtoken 2025. 3. 15. 11:18
728x90

 

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을 인식할 수 있도록 해야 함

728x90