☁️ 클라우드

PersistentVolume

클러스터 수준의 스토리지 리소스

📖 상세 설명

PersistentVolume(PV)은 Kubernetes에서 클러스터 수준의 스토리지 리소스를 추상화한 개념입니다. Pod가 삭제되어도 데이터가 유지되어야 하는 경우(데이터베이스, 파일 저장 등)에 사용합니다. 관리자가 프로비저닝하거나 StorageClass를 통해 동적으로 생성됩니다.

PV와 함께 PersistentVolumeClaim(PVC)이라는 개념이 있습니다. PV는 실제 스토리지(NFS, AWS EBS, GCE PD 등)이고, PVC는 사용자가 스토리지를 요청하는 방법입니다. PVC가 생성되면 조건에 맞는 PV에 바인딩되거나, StorageClass가 새 PV를 동적으로 생성합니다.

PV의 accessModes에는 ReadWriteOnce(단일 노드에서 읽기/쓰기), ReadOnlyMany(다중 노드에서 읽기), ReadWriteMany(다중 노드에서 읽기/쓰기)가 있습니다. AWS EBS는 RWO만 지원하고, NFS나 EFS는 RWX를 지원합니다.

reclaimPolicy는 PVC 삭제 시 PV 처리 방법을 정의합니다. Retain(수동 삭제 필요), Delete(자동 삭제), Recycle(데이터 삭제 후 재사용, deprecated)이 있습니다. 프로덕션에서는 중요 데이터 유실 방지를 위해 Retain을 권장합니다.

💻 코드 예제

# PersistentVolume 정의 (관리자가 생성)
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-database
  labels:
    type: ssd
spec:
  capacity:
    storage: 100Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: fast-ssd
  # AWS EBS 사용 예시
  awsElasticBlockStore:
    volumeID: vol-0abc123def456
    fsType: ext4

---
# PersistentVolumeClaim (개발자가 요청)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: database-pvc
  namespace: production
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: fast-ssd
  resources:
    requests:
      storage: 50Gi  # PV 용량 이하로 요청
  selector:
    matchLabels:
      type: ssd

---
# Pod에서 PVC 사용
apiVersion: v1
kind: Pod
metadata:
  name: postgres
spec:
  containers:
    - name: postgres
      image: postgres:15
      volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: database-pvc

🗣️ 실무에서 이렇게 말하세요

💬 Kubernetes 설계 회의에서
"PostgreSQL은 StatefulSet으로 배포하고 volumeClaimTemplates로 각 Pod에 별도 PVC를 붙입니다. StorageClass는 gp3 SSD로 설정하고, reclaimPolicy는 Retain으로 해서 실수로 데이터 날리지 않도록 하죠."
💬 면접에서
"PV와 PVC의 관계는 클라우드 리소스와 사용자 요청을 분리하는 추상화입니다. 관리자는 스토리지를 프로비저닝하고, 개발자는 필요한 용량과 성능만 요청하면 됩니다. StorageClass를 사용하면 동적 프로비저닝으로 이 과정이 자동화됩니다."
💬 장애 대응에서
"PVC가 Pending 상태네요. kubectl describe pvc로 확인해보니 StorageClass에서 프로비저닝 실패입니다. EBS CSI 드라이버 Pod가 정상인지, IAM 권한이 있는지 확인해봐야 해요. volumeBindingMode가 WaitForFirstConsumer면 Pod가 스케줄링되어야 바인딩됩니다."

⚠️ 흔한 실수 & 주의사항

AccessMode 불일치

AWS EBS는 ReadWriteOnce만 지원합니다. 여러 Pod에서 동시에 마운트하려면 EFS(RWX 지원)를 사용하세요. GCE PD도 마찬가지로 Filestore가 필요합니다.

AZ 불일치로 Pod 스케줄링 실패

EBS는 특정 AZ에 종속됩니다. Pod가 다른 AZ의 노드에 스케줄링되면 볼륨 마운트가 불가능합니다. volumeBindingMode를 WaitForFirstConsumer로 설정해서 Pod 스케줄링 후 볼륨을 생성하세요.

프로덕션 권장 설정

중요 데이터는 reclaimPolicy: Retain 설정, volumeSnapshot으로 정기 백업, allowVolumeExpansion: true로 확장 가능하게 구성하세요. CSI 드라이버 버전과 Kubernetes 버전 호환성도 확인해야 합니다.

🔗 관련 용어

📚 더 배우기