1. 개요
PersistentVolume(PV)은 클러스터 안의 실제 저장 공간이고, PersistentVolumeClaim(PVC)은 그 공간을 달라는 요청서다.
공식 문서는 이 관계를 노드와 Pod 에 빗댄다.
나누는 이유는 역할 분리다. 앱을 만드는 사람은 “10Gi 필요하다"만 적고, 그게 AWS EBS 인지 NFS 인지는 몰라도 된다.
2. 생명주기
바인딩은 일대일이다. 한 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 | 노드 하나가 읽고 쓴다. 같은 노드의 여러 Pod 는 가능 |
ReadOnlyMany | ROX | 여러 노드가 읽기만 |
ReadWriteMany | RWX | 여러 노드가 읽고 쓴다 |
ReadWriteOncePod | RWOP | Pod 하나만. 클러스터 전체에서 하나 (1.22+, CSI 전용) |
공식 문서가 명시한다 — “ReadWriteOnce 는 같은 노드에서 실행되는 여러 Pod 가 볼륨에 접근하는 것을 여전히 허용한다.”
그리고 한 번에 하나의 모드로만 마운트된다. NFS 처럼 여러 모드를 지원하는 볼륨이라도, 한 노드에서 RWO 로 쓰거나 여러 노드에서 ROX 로 쓸 뿐 동시에는 안 된다.
5. 회수 정책
PVC 를 지웠을 때 데이터를 어떻게 할지 정한다.
| 정책 | 동작 | 기본값 |
|---|---|---|
Retain | PV 와 데이터를 그대로 둔다. 관리자가 손으로 처리 | 수동 생성 PV |
Delete | PV 객체와 실제 저장소(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.”