Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #11] StatefulSet에서 PVC 이동 및 재마운트 방법

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

 

1️⃣ 개요

 

StatefulSet은 각 Pod가 고유한 Persistent Volume Claim(PVC)을 유지하며, 삭제 후에도 기존 데이터를 유지하는 특징이 있습니다.

하지만 PVC가 특정 Pod에 바인딩되었을 경우, 다른 Pod에서 기존 PVC를 재사용하는 것이 쉽지 않습니다.

 

이번 글에서는 StatefulSet에서 PVC를 이동하여 다른 Pod에서 재마운트하는 방법과 고려해야 할 사항을 정리하겠습니다. 🚀

 


2️⃣ StatefulSet의 PVC 관리 원리

 

✅ 1. StatefulSet의 PVC 동작 방식

 

StatefulSet은 Pod마다 개별적인 PVC를 생성하며, 삭제 후에도 기존 PVC를 유지합니다.

즉, Pod가 재시작되더라도 동일한 PVC를 사용하도록 보장됩니다.

 

📌 StatefulSet PVC 생성 방식

volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi

 

📌 PVC 자동 생성 예시 (StatefulSet 이름이 mysql인 경우)

kubectl get pvc
NAME                  STATUS    VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS
mysql-data-mysql-0    Bound     pv-abc123   10Gi       RWO            standard
mysql-data-mysql-1    Bound     pv-def456   10Gi       RWO            standard

각 Pod는 고유한 PVC를 가지며, 동일한 PVC를 계속 사용합니다.

 


3️⃣ PVC를 다른 StatefulSet Pod에서 재사용하는 방법

 

PVC를 다른 Pod에서 사용하려면 PVC를 기존 StatefulSet에서 분리한 후, 새로운 Pod에서 마운트할 수 있도록 변경해야 합니다.

 


✅ 1. 기존 StatefulSet에서 PVC 바인딩 해제하기

 

PVC는 특정 StatefulSet Pod에 바인딩되어 있기 때문에, 이를 기존 StatefulSet과 분리해야 합니다.

 

📌 PVC 바인딩 해제 (Owner References 제거)

kubectl patch pvc mysql-data-mysql-0 -p '{"metadata":{"ownerReferences":null}}'

 

📌 PVC가 특정 StatefulSet에 종속되지 않았는지 확인

kubectl get pvc

이제 PVC가 StatefulSet과의 연결에서 해제되었습니다.

 


✅ 2. PVC를 새로운 Pod에서 재마운트하기

 

PVC를 새로운 Pod에서 사용하려면, 기존 StatefulSet이 아닌 새로운 StatefulSet 또는 독립적인 Pod에서 PVC를 마운트해야 합니다.

 

📌 PVC를 사용하는 새로운 Pod 배포

apiVersion: v1
kind: Pod
metadata:
  name: mysql-recovery
spec:
  containers:
    - name: mysql
      image: mysql:8
      volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
  volumes:
    - name: mysql-data
      persistentVolumeClaim:
        claimName: mysql-data-mysql-0  # 기존 PVC 연결

 

📌 새로운 Pod 배포 후 데이터 확인

kubectl exec -it mysql-recovery -- mysql -u root -p -e "SHOW DATABASES;"

이제 기존 StatefulSet에서 사용하던 PVC를 새로운 Pod에서 사용할 수 있습니다.

 


✅ 3. PVC를 원래 StatefulSet에 다시 연결하는 방법

 

만약 PVC를 다시 StatefulSet에 연결하고 싶다면, StatefulSet을 재배포하면 기존 PVC를 다시 사용할 수 있습니다.

 

📌 StatefulSet을 다시 배포하여 기존 PVC 사용

kubectl delete pod mysql-0
kubectl rollout restart statefulset mysql

 

📌 PVC가 기존 StatefulSet과 다시 연결되었는지 확인

kubectl get pvc

이제 StatefulSet이 기존 PVC를 다시 사용할 수 있습니다.

 


4️⃣ PVC 이동 및 재마운트 시 주의할 점

 

✅ 1. PVC가 특정 노드에 종속되지 않았는지 확인

 

PVC가 특정 노드에 종속되어 있으면, 다른 노드에서 Pod를 실행할 때 PVC를 사용할 수 없습니다.

 

📌 PVC의 바운드 상태 확인

kubectl get pvc -o wide

PVC가 특정 노드에 바인딩되어 있다면, ReadWriteMany(RWX) 스토리지를 고려해야 합니다.

 


✅ 2. PVC의 Reclaim Policy 설정

 

PVC가 자동으로 삭제되지 않도록 Retain 정책을 설정해야 합니다.

 

📌 PersistentVolume의 Reclaim Policy 확인

kubectl get pv

 

📌 PVC가 자동 삭제되지 않도록 설정

kubectl patch pv pv-abc123 -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

이렇게 설정하면 PVC가 삭제되지 않고 계속 유지됩니다.

 


✅ 3. PVC가 바인딩되지 않는 경우 해결 방법

 

PVC를 새로운 Pod에서 사용하려고 할 때 PVC가 새로운 Pod에 자동으로 연결되지 않는 경우가 발생할 수 있습니다.

이때는 PVC의 status를 확인하고, 수동으로 바인딩할 수 있습니다.

 

📌 PVC 바인딩 상태 확인

kubectl describe pvc mysql-data-mysql-0

 

📌 PVC를 특정 Pod에 다시 연결

kubectl patch pvc mysql-data-mysql-0 -p '{"metadata":{"ownerReferences":null}}'

이제 새로운 Pod에서 PVC를 정상적으로 사용할 수 있습니다.

 


🔥 5️⃣ 결론

 

StatefulSet의 PVC는 특정 Pod와 연결되지만, 바인딩을 해제하면 다른 Pod에서 재사용 가능

PVC를 다른 Pod에서 사용하려면 StatefulSet과의 ownerReferences를 먼저 해제해야 함

PVC를 새로운 StatefulSet 또는 개별 Pod에서 재마운트할 수 있음

PVC가 특정 노드에 바인딩되지 않도록 ReadWriteMany(RWX) 스토리지를 고려해야 함

Reclaim Policy를 Retain으로 설정하면 PVC가 자동 삭제되지 않음

PVC가 새로운 Pod에 자동 연결되지 않으면, kubectl patch pvc로 수동으로 연결 가능

728x90