네, 맞습니다. 원본 NFS 디렉터리를 그대로 유지하면서 Terminating에 걸린 리소스를 깔끔하게 재정비하는 가장 확실한 방법입니다.
기존 PV/PVC를 YAML로 추출한 뒤 불필요한 K8s 관리 필드(status, uid, claimRef, finalizers 등)를 제거하고 재적용하는 전체 절차입니다.
NFS 서버에 접속하여 원본 디렉터리를 백업용 경로로 복제해 둡니다.
cd /nfs/export/path/
# 원본 디렉터리를 백업본으로 복사 (-a: 권한, 타임스탬프, 소유권 유지)
cp -a <원본_디렉터리명> <원본_디렉터리명>_backup
클러스터에서 기존 YAML을 추출한 뒤 재사용할 템플릿을 만듭니다.
kubectl get pv <PV_NAME> -o yaml > pv-origin.yaml
kubectl get pvc <PVC_NAME> -n <NAMESPACE> -o yaml > pvc-origin.yaml
clean-pv.yaml (PV 매니페스트)
apiVersion: v1
kind: PersistentVolume
metadata:
name: <PV_NAME> # 기존 PV 이름
spec:
capacity:
storage: 10Gi # 기존 용량
accessModes:
- ReadWriteMany # 기존 모드
persistentVolumeReclaimPolicy: Retain # Retain 권장
storageClassName: "" # 기존에 비어있었다면 "" 명시
nfs:
path: /nfs/export/path/<원본_디렉터리명> # 기존 원본 경로 그대로 지정
server: <NFS_SERVER_IP>
제거된 항목:
metadata.uid,metadata.resourceVersion,metadata.creationTimestamp,metadata.finalizers,spec.claimRef,status
clean-pvc.yaml (PVC 매니페스트)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: <PVC_NAME> # 기존 PVC 이름
namespace: <NAMESPACE> # 기존 네임스페이스
spec:
accessModes:
- ReadWriteMany # PV와 일치
resources:
requests:
storage: 10Gi # PV 용량과 일치
volumeName: <PV_NAME> # 1:1 직접 바인딩을 위해 PV 이름 명시
storageClassName: "" # StorageClass가 없었다면 "" 명시
제거된 항목:
metadata.uid,metadata.resourceVersion,metadata.deletionTimestamp,metadata.finalizers,status
기존 리소스의 finalizer를 제거하여 K8s에서 완전히 정리합니다.
# 1. PVC Finalizer 제거하여 삭제 완료
kubectl patch pvc <PVC_NAME> -n <NAMESPACE> -p '{"metadata":{"finalizers":null}}'
# 2. PV 삭제 (필요한 경우 PV Finalizer도 제거)
kubectl delete pv <PV_NAME> --wait=false
kubectl patch pv <PV_NAME> -p '{"metadata":{"finalizers":null}}'
kubectl apply -f clean-pv.yaml
kubectl get pv <PV_NAME>
# STATUS가 'Available'인지 확인
kubectl apply -f clean-pvc.yaml
kubectl get pvc <PVC_NAME> -n <NAMESPACE>
# STATUS가 'Bound'인지 확인
kubectl get pv <PV_NAME>를 다시 확인했을 때 STATUS가 Bound로 바뀌어 있다면 원본 NFS 경로의 데이터 그대로 복구가 완료된 것입니다.애플리케이션 Pod를 다시 띄워 정상 구동 및 파일 접근을 확인한 후, 1단계에서 만들어둔 NFS의 _backup 디렉터리를 보관하거나 삭제하시면 됩니다.