26Z26c

QK·2026년 8월 26일

네, 맞습니다. 원본 NFS 디렉터리를 그대로 유지하면서 Terminating에 걸린 리소스를 깔끔하게 재정비하는 가장 확실한 방법입니다.

기존 PV/PVC를 YAML로 추출한 뒤 불필요한 K8s 관리 필드(status, uid, claimRef, finalizers 등)를 제거하고 재적용하는 전체 절차입니다.


1단계: NFS 서버에서 안전하게 백업

NFS 서버에 접속하여 원본 디렉터리를 백업용 경로로 복제해 둡니다.

cd /nfs/export/path/

# 원본 디렉터리를 백업본으로 복사 (-a: 권한, 타임스탬프, 소유권 유지)
cp -a <원본_디렉터리명> <원본_디렉터리명>_backup

2단계: 기존 PV / PVC YAML 백업 및 정제

클러스터에서 기존 YAML을 추출한 뒤 재사용할 템플릿을 만듭니다.

1. 기존 매니페스트 추출

kubectl get pv <PV_NAME> -o yaml > pv-origin.yaml
kubectl get pvc <PVC_NAME> -n <NAMESPACE> -o yaml > pvc-origin.yaml

2. 불필요한 메타데이터가 제거된 깨끗한 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


3단계: 기존 Terminating PVC 및 PV 강제 삭제

기존 리소스의 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}}'

4단계: PV -> PVC 순서로 생성

  1. PV 생성 및 확인:
kubectl apply -f clean-pv.yaml
kubectl get pv <PV_NAME>
# STATUS가 'Available'인지 확인
  1. PVC 생성 및 바인딩 확인:
kubectl apply -f clean-pvc.yaml
kubectl get pvc <PVC_NAME> -n <NAMESPACE>
# STATUS가 'Bound'인지 확인
  1. 연결 상태 확인:
    kubectl get pv <PV_NAME>를 다시 확인했을 때 STATUSBound로 바뀌어 있다면 원본 NFS 경로의 데이터 그대로 복구가 완료된 것입니다.

5단계: 백업본 정리 (선택)

애플리케이션 Pod를 다시 띄워 정상 구동 및 파일 접근을 확인한 후, 1단계에서 만들어둔 NFS의 _backup 디렉터리를 보관하거나 삭제하시면 됩니다.

profile
engineer

0개의 댓글