1️⃣ 개요
StatefulSet에서 Persistent Volume(PV)은 데이터 저장을 위해 필수적인 요소입니다.
하지만 스토리지 장애, 클러스터 재구성, PV 손상 등의 이유로 PVC를 다시 생성해야 하는 경우가 발생할 수 있습니다.
이번 글에서는 StatefulSet에서 PV를 재생성하는 방법과, 데이터 손실 없이 복원하는 전략을 설명하겠습니다. 🚀
2️⃣ StatefulSet PVC 삭제 시 발생할 수 있는 문제
✅ 1. PVC가 삭제되면 Pod는 정상적으로 실행되지 않음
StatefulSet은 PVC와 연결된 상태로 동작하기 때문에, PVC가 손실되면 해당 Pod는 정상적으로 실행되지 않습니다.
PVC가 존재하지 않으면 Pod는 Pending 상태로 멈추며, 새로운 PV를 자동으로 생성하지 않습니다.
📌 PVC가 손실된 상태에서 StatefulSet Pod 확인
kubectl get pods -l app=mysql
출력 예시:
NAME READY STATUS NODE
mysql-0 0/1 Pending <none>
mysql-1 1/1 Running node-2
mysql-2 1/1 Running node-3
✅ PVC가 삭제되면 기존 StatefulSet Pod는 정상적으로 실행되지 않음
✅ 2. PVC가 삭제되었을 때 새로운 PV가 자동 생성되지 않는 이유
StatefulSet은 PVC 이름을 고유하게 유지하며, PVC가 존재하지 않으면 자동으로 새로운 PVC를 생성하지 않습니다.
따라서 동일한 PVC를 수동으로 복구해야 StatefulSet이 정상적으로 실행될 수 있습니다.
✅ PVC가 손실되면 StatefulSet이 자동으로 새로운 PVC를 생성하지 않기 때문에, 복구 작업이 필요합니다.
3️⃣ StatefulSet PV 재생성 및 복구 방법
✅ 1. 기존 PVC를 삭제하지 않고 유지하면서 복구하는 방법
PVC가 Terminating 상태에서 삭제되지 않고 남아 있을 경우, StatefulSet을 삭제했다가 다시 배포하면 기존 PVC를 그대로 사용할 수 있습니다.
📌 PVC를 유지하면서 StatefulSet만 삭제
kubectl delete statefulset mysql --cascade=orphan
📌 PVC가 삭제되지 않았는지 확인
kubectl get pvc
📌 StatefulSet을 다시 배포하여 기존 PVC와 연결
kubectl apply -f mysql-statefulset.yaml
✅ 이 방법을 사용하면 PVC가 유지된 상태에서 StatefulSet을 다시 실행할 수 있습니다.
✅ 2. 기존 PV가 손상된 경우 새로운 PV를 생성하여 복구하는 방법
PVC를 유지할 수 없거나, 기존 PV가 손상된 경우에는 새로운 PV를 생성하여 기존 PVC와 연결해야 합니다.
🔹 (1) 기존 PVC 및 PV 삭제하기
📌 PVC 및 PV 확인
kubectl get pvc -o wide
kubectl get pv -o wide
📌 기존 PVC 및 PV 삭제
kubectl delete pvc mysql-data-mysql-0
kubectl delete pv pv-abc123
✅ 이제 PVC와 PV가 삭제된 상태에서 새로운 볼륨을 생성해야 합니다.
🔹 (2) 새로운 PV를 생성하여 기존 PVC와 연결하기
PVC를 다시 생성할 때, 기존 StatefulSet이 새로운 PVC를 사용하도록 설정해야 합니다.
📌 새로운 PV를 생성하는 YAML 예제
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-mysql-0
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: "/mnt/data/mysql-0"
📌 새로운 PVC를 생성하는 YAML 예제
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data-mysql-0
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
volumeName: pv-mysql-0
📌 새로운 PV 및 PVC 적용
kubectl apply -f pv-mysql.yaml
kubectl apply -f pvc-mysql.yaml
✅ 이제 StatefulSet이 기존 데이터 없이 새로운 PVC를 사용할 수 있습니다.
✅ 3. 백업 데이터를 활용하여 PV 복구하기
PVC를 다시 생성한 후 이전에 백업한 데이터를 새로운 PV에 복원하는 방법도 가능합니다.
📌 PVC가 정상적으로 생성된 후, 새로운 Pod에서 데이터 복원
kubectl exec -it mysql-0 -- mysql -u root -p < backup.sql
✅ 백업 데이터를 활용하면 기존 데이터를 그대로 복원할 수 있습니다.
4️⃣ PVC 재생성 후 StatefulSet 정상 동작 확인
PVC를 재생성한 후 StatefulSet이 정상적으로 실행되는지 확인해야 합니다.
📌 (1) PVC가 정상적으로 생성되었는지 확인
kubectl get pvc
📌 (2) StatefulSet Pod가 정상적으로 실행되었는지 확인
kubectl get pods -o wide
📌 (3) 데이터가 정상적으로 유지되었는지 확인 (예: MySQL 데이터 확인)
kubectl exec -it mysql-0 -- mysql -u root -p -e "SHOW DATABASES;"
✅ PVC 재생성 후 데이터가 정상적으로 유지되었는지 반드시 확인해야 합니다.
5️⃣ StatefulSet PV 복구 시 고려해야 할 사항
✅ 1. PVC를 삭제하지 않고 유지하는 것이 가장 안전함
PVC가 손실되지 않았다면, 기존 PVC를 유지한 상태에서 StatefulSet을 다시 배포하는 것이 가장 안전한 방법입니다.
📌 PVC를 유지하면서 StatefulSet을 삭제 및 재배포
kubectl delete statefulset mysql --cascade=orphan
kubectl apply -f mysql-statefulset.yaml
✅ 이 방법을 사용하면 StatefulSet이 기존 PVC를 그대로 사용합니다.
✅ 2. PVC 및 PV를 재생성할 경우 데이터 백업 필수
PVC와 PV를 삭제하고 다시 생성하는 경우 기존 데이터가 손실될 수 있으므로, 반드시 백업을 수행해야 합니다.
📌 데이터 백업 (예: MySQL 데이터 덤프)
kubectl exec -it mysql-0 -- mysqldump -u root -p > backup.sql
📌 데이터 복원 (PVC 재생성 후 적용)
kubectl exec -it mysql-0 -- mysql -u root -p < backup.sql
✅ 백업을 수행한 후 PVC를 삭제해야 데이터 손실을 방지할 수 있습니다.
🔥 6️⃣ 결론
✔ StatefulSet PVC가 삭제되면 Pod가 정상적으로 실행되지 않으므로 복구 작업이 필요함
✔ PVC를 유지한 채 StatefulSet을 삭제 후 재배포하면 기존 PVC를 사용할 수 있음
✔ PVC 및 PV가 삭제되었을 경우, 새로운 PV를 생성한 후 PVC를 다시 연결해야 함
✔ PVC 재생성 후 StatefulSet Pod가 정상적으로 동작하는지 확인해야 함
✔ PVC 및 PV를 재생성하는 경우, 기존 데이터를 백업하고 복원하는 것이 중요함