쿠버네티스 PV와 PVC

파드 안에만 저장한 파일은 파드가 교체될 때 사라질 수 있습니다. 쿠버네티스는 저장소 공급자인 PersistentVolume(PV) 과 사용자의 요청인 PersistentVolumeClaim(PVC) 을 분리해 애플리케이션과 실제 스토리지의 결합을 줄입니다.

PV와 PVC의 연결 구조

PV·PVC·StorageClass 관계

  • PV: 관리자가 준비했거나 프로비저너가 만든 클러스터 저장소
  • PVC: 용량과 접근 모드를 지정한 사용자의 저장소 요청
  • StorageClass: 어떤 프로비저너와 정책으로 PV를 만들지 정의

PVC의 storageClassName, 접근 모드, 요청 용량에 맞는 PV가 있으면 Bound 상태로 연결됩니다.

단일 노드 테스트

hostPath는 특정 노드의 디렉터리를 사용하므로 개발·학습용 단일 노드에서만 사용합니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: demo-pv
spec:
  storageClassName: manual
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/demo-data
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: demo-pvc
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
kubectl apply -f storage.yaml
kubectl get pv,pvc

파드에 마운트

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
    - name: nginx
      image: nginx:stable
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: demo-pvc
kubectl apply -f pod.yaml
kubectl exec volume-test -- sh -c 'echo persistent > /usr/share/nginx/html/index.html'
kubectl delete pod volume-test
kubectl apply -f pod.yaml
kubectl exec volume-test -- cat /usr/share/nginx/html/index.html

파드를 다시 만들어도 persistent가 출력되면 PVC 데이터가 유지된 것입니다.

운영에서 주의할 점

hostPath는 파드가 다른 노드로 이동하면 같은 데이터를 볼 수 없고 호스트 파일시스템 노출 위험도 있습니다. 운영에서는 NFS, CSI 기반 클라우드 디스크나 분산 스토리지를 사용하세요. 온프레미스 NFS 예시는 쿠버네티스 NFS 프로비저닝에서 이어집니다.

삭제 정책도 확인해야 합니다. Retain은 PVC를 지운 뒤에도 데이터를 남기며, Delete는 프로비저너가 실제 볼륨까지 삭제할 수 있습니다. 삭제 테스트는 빈 데이터로 먼저 검증하는 게 안전합니다.

참고: PersistentVolume 공식 튜토리얼