1. 개요

PersistentVolume(PV)은 클러스터 안의 실제 저장 공간이고, PersistentVolumeClaim(PVC)은 그 공간을 달라는 요청서다.

공식 문서는 이 관계를 노드와 Pod 에 빗댄다.

이미 쓰고 있는 구조가 저장소에도 똑같이 있다실체클러스터가 가진 것요청내가 쓰는 것계산 자원 — 익숙한 쪽NodeCPU · 메모리를 가진 실체Pod"CPU 500m 주세요"소비저장 자원 — 같은 구조PersistentVolume100Gi 디스크라는 실체PersistentVolumeClaim"10Gi 주세요"소비대응대응Pod 가 노드를 소비하듯, PVC 가 PV 를 소비한다

나누는 이유는 역할 분리다. 앱을 만드는 사람은 “10Gi 필요하다"만 적고, 그게 AWS EBS 인지 NFS 인지는 몰라도 된다.

2. 생명주기

PV저장소 실체PVC요청서① 준비② 바인딩③ 사용④ 회수PV 생성AvailableBoundBoundRetain — 데이터 남음Delete — 디스크까지 삭제PVC 생성PendingBoundPod 가 마운트PVC 를 볼륨으로PVC 삭제1 : 1배타적정책 적용맞는 PV 없으면Pending 에 머문다 → Pod 도 못 뜬다PV 와 PVC 는 따로 만들어져 짝을 찾는다 — 맺어지면 다른 짝은 못 낀다

바인딩은 일대일이다. 한 PVC 가 한 PV 를 잡으면 다른 PVC 는 그 PV 를 쓸 수 없다. 컨트롤 플레인의 루프가 새 PVC 를 지켜보다가 조건에 맞는 PV 를 찾아 묶는다.

맞는 PV 가 없으면 PVC 는 Pending 에 머문다. 그 Pod 도 뜨지 못한다.

3. 정적 준비와 동적 준비

정적동적
누가관리자가 미리 PV 를 만들어 둠StorageClass 가 PVC 요청을 받고 즉석에서 생성
맞는 게 없으면Pending새로 만든다
언제온프레미스, 기존 NFS 활용클라우드 대부분

동적 준비는 StorageClass 가 담당한다. “빠른 SSD”, “저렴한 HDD” 같은 등급을 만들어두면 PVC 가 그 이름을 지목한다.

kind: PersistentVolumeClaim
spec:
  storageClassName: fast-ssd      # 이 등급으로 만들어 달라
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 10Gi

storageClassName: "" 은 동적 준비를 끄겠다는 뜻이다. 기존 PV 하고만 묶으라는 의미다.

4. 접근 모드

여기가 가장 자주 오해되는 부분이다.

가운데 원기둥이 볼륨 하나 — 여기에 누가 붙을 수 있는가ReadWriteOnce (RWO)Node APod ✓Pod ✓Node B붙을 수 없다 ✕볼륨노드1개가 읽고 쓴다그 노드 안 Pod 는 여러 개 가능ReadOnlyMany (ROX)Node A ✓Node B ✓볼륨노드여러 개— 단 읽기만ReadWriteMany (RWX)Node A ✓Node B ✓볼륨노드여러 개가 읽고 쓴다NFS 같은 공유 파일시스템ReadWriteOncePod (RWOP)Pod ✓Pod ✕Node B ✕볼륨클러스터 전체에서Pod 1개
모드약어의미
ReadWriteOnceRWO노드 하나가 읽고 쓴다. 같은 노드의 여러 Pod 는 가능
ReadOnlyManyROX여러 노드가 읽기만
ReadWriteManyRWX여러 노드가 읽고 쓴다
ReadWriteOncePodRWOPPod 하나만. 클러스터 전체에서 하나 (1.22+, CSI 전용)

공식 문서가 명시한다 — “ReadWriteOnce 는 같은 노드에서 실행되는 여러 Pod 가 볼륨에 접근하는 것을 여전히 허용한다.”

그리고 한 번에 하나의 모드로만 마운트된다. NFS 처럼 여러 모드를 지원하는 볼륨이라도, 한 노드에서 RWO 로 쓰거나 여러 노드에서 ROX 로 쓸 뿐 동시에는 안 된다.

5. 회수 정책

PVC 를 지웠을 때 데이터를 어떻게 할지 정한다.

정책동작기본값
RetainPV 와 데이터를 그대로 둔다. 관리자가 손으로 처리수동 생성 PV
DeletePV 객체와 실제 저장소(EBS 등)까지 삭제동적 생성 PV
Recycle볼륨을 비우고 재사용 (rm -rf /thevolume/*)사용 중단됨

기본값이 갈리는 지점이 함정이다.

관리자가 만든 PV   → Retain  → PVC 지워도 데이터 남음
동적으로 생긴 PV   → Delete  → PVC 지우면 디스크까지 사라짐

클라우드에서 PVC 를 무심코 지웠다가 DB 데이터가 함께 사라지는 사고가 여기서 나온다. 중요한 데이터라면 StorageClass 의 reclaimPolicy 를 Retain 으로 바꿔둔다.

Recycle 은 공식 문서가 사용 중단(deprecated) 을 명시하며 동적 준비를 권한다.

6. 관련 문서

  • Service — Headless Service 와 StatefulSet 조합
  • StatefulSet — Pod 마다 고유 PVC 를 갖는 워크로드 (예정)
  • CSI — 저장소 플러그인 규격 (예정)

7. 출처

정의, 생명주기, 접근 모드, 회수 정책 기본값은 공식 문서 “Persistent Volumes” 에 근거한다.

“A PersistentVolume (PV) is a piece of storage in the cluster that has been provisioned by an administrator or dynamically provisioned using Storage Classes. It is a resource in the cluster just like a node is a cluster resource.”

“A PersistentVolumeClaim (PVC) is a request for storage by a user. It is similar to a Pod. Pods consume node resources and PVCs consume PV resources.”

“ReadWriteOnce – the volume can be mounted as read-write by a single node. ReadWriteOnce access mode still can allow multiple pods to access the volume when the pods are running on the same node.”

“The default reclaim policy for manually created PersistentVolumes is Retain. The default reclaim policy for dynamically provisioned PersistentVolumes is Delete.”

“A volume can only be mounted using one access mode at a time, even if it supports many.”