Kubernetes PersistentVolume — 클러스터 전역의 실제 스토리지 자원
PV는 단순한 스토리지가 아니라 'Pod의 라이프사이클과 분리된 클러스터 자원'이다. AccessMode, ReclaimPolicy, Phase 같은 개념이 운영에서 어떤 의미를 가지는지 정리한다.
Kubernetes PersistentVolume — 클러스터 전역의 실제 스토리지 자원
PV가 분리된 객체로 존재하는 이유
Pod는 죽으면 사라지지만, 그 안의 데이터는 살아있어야 할 때가 있다. 그래서 스토리지를 Pod 라이프사이클에서 분리된 객체로 둔다.
- PV (PersistentVolume) — 실제 스토리지 자원. 클러스터 전역 객체.
- PVC (PersistentVolumeClaim) — Pod가 "이런 스토리지를 원해요"라고 요청하는 객체.
비유하자면 PV는 호텔 방이고, PVC는 예약 신청서다.
정적 PV YAML
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data-01
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /mnt/datahostPath는 단일 노드 테스트용. 실제로는 NFS, EBS, Ceph 같은 백엔드를 쓴다.
AccessMode 4가지
| 모드 | 의미 |
|---|---|
ReadWriteOnce (RWO) | 단일 노드에서 R/W |
ReadOnlyMany (ROX) | 여러 노드에서 RO |
ReadWriteMany (RWX) | 여러 노드에서 R/W |
ReadWriteOncePod (RWOP, 1.27+) | 단일 Pod에서만 R/W |
중요: AccessMode는 PV의 속성이 아니라 마운트 방식에 대한 약속이다. EBS는 RWO만 지원, NFS는 RWX 가능. 백엔드 능력을 넘는 모드를 선언해도 실제로는 동작하지 않는다.
ReadWriteMany가 필요한 경우(여러 Pod가 같은 디렉토리 공유): NFS, CephFS, EFS 같은 분산 파일시스템 필요.
volumeMode
spec:
volumeMode: Filesystem # 기본또는:
spec:
volumeMode: Block # 블록 디바이스로 그대로 노출, 앱이 직접 포맷DB가 raw 디바이스를 요구할 때 사용. 일반적으론 Filesystem.
Phase (PV의 상태)
| Phase | 의미 |
|---|---|
| Available | PVC와 바인딩되지 않은 자유 상태 |
| Bound | 특정 PVC와 바인딩됨 |
| Released | 바인딩됐던 PVC가 삭제됨, 아직 정리 전 |
| Failed | 자동 정리 실패 |
Released 상태의 PV는 다른 PVC에 자동 바인딩되지 않는다. 데이터가 남아있을 수 있어서다. 재사용하려면 수동 작업 필요.
ReclaimPolicy
PVC가 삭제될 때 PV의 운명을 결정.
spec:
persistentVolumeReclaimPolicy: Retain| 값 | 동작 |
|---|---|
| Delete | PV와 백엔드 스토리지 모두 삭제 (StorageClass의 기본 동작과 같음) |
| Retain | PV는 Released로 남고, 데이터 유지. 수동 정리 |
| Recycle | 기본 청소 후 재사용 (deprecated) |
동적 vs 정적 프로비저닝
동적 (대부분의 경우)
PVC ──storageClassName 지정──▶ StorageClass ──provisioner──▶ PV 자동 생성관리자는 StorageClass만 만들어두고, 사용자는 PVC만 만든다.
정적
관리자: PV 미리 생성
사용자: PVC 생성 → 매칭되는 PV가 있으면 바인딩레거시 NFS 같은 환경에서. 또는 특정 PV에만 바인딩하고 싶을 때.
PVC가 특정 PV에 바인딩되도록 강제
# PV 쪽
metadata:
name: pv-data-01
spec:
claimRef:
namespace: default
name: my-pvc
# PVC 쪽
metadata:
name: my-pvc
spec:
volumeName: pv-data-01자주 하는 실수
AccessMode 오해
ReadWriteOnce는 "Pod 1개"가 아니라 "노드 1개"다. 같은 노드의 여러 Pod가 같은 RWO PV를 마운트할 수 있다(주의: 동시 쓰기 시 corruption 가능). 진짜 단일 Pod 보장은 ReadWriteOncePod.
Released 상태 방치
Retain 정책으로 PVC를 지웠더니 PV가 Released로 영원히 남음. 정리 스크립트나 수동 검토 필요.
정리
PV는 Pod와 분리된 클러스터 자원이다. AccessMode는 백엔드의 능력에 종속되고, ReclaimPolicy는 데이터 안전과 자원 관리의 트레이드오프다. 다음 글에서는 PV를 요청하는 입장인 PVC를 다룬다.
Related Posts
같이 읽으면 좋은 글
Kubernetes PersistentVolumeClaim — Pod가 스토리지를 요구하는 방식
PVC는 Pod와 PV 사이의 추상화 레이어다. 사용자는 'NFS인지 EBS인지' 몰라도 '50Gi 필요해'라고 선언만 하면 된다. 바인딩 조건, 확장, StatefulSet 사용 패턴까지 정리한다.
Kubernetes StorageClass — PV를 자동으로 만들어주는 청사진
PVC를 만들 때마다 관리자가 PV를 수동으로 만들어줄 수는 없다. StorageClass는 'PVC 들어오면 이런 PV를 자동으로 프로비저닝해라'는 템플릿이다.
Kubernetes LimitRange — Pod/Container 단위 기본값과 상하한 강제
ResourceQuota는 총합을 제한한다. LimitRange는 개별 객체에 기본값을 채우고 상하한을 강제한다. 둘이 짝을 이뤄야 멀티테넌시가 굴러간다.