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로 수동으로 연결 가능