5편 · 약 8분
스토리지와 PV/PVC
컨테이너 저장소는 사라진다
컨테이너의 파일시스템은 컨테이너가 재시작되면 초기화된다. DB 데이터처럼 살아남아야 하는 것은 볼륨(Volume) 으로 분리해야 한다. 볼륨에도 두 종류가 있다.
- 임시(ephemeral): Pod 수명과 함께 사라짐. 예:
emptyDir(같은 Pod 안 컨테이너 간 공유 스크래치). - 영구(persistent): Pod가 죽어도 데이터가 남음. 외부 스토리지(클라우드 디스크, NFS 등)에 저장.
PV / PVC: 공급과 요청의 분리
쿠버네티스는 "스토리지를 제공하는 쪽"과 "스토리지를 쓰는 쪽"을 분리한다.
- PersistentVolume (PV): 실제 스토리지 조각. 관리자가 만들거나 동적으로 생성됨.
- PersistentVolumeClaim (PVC): 앱이 "이만큼, 이 접근모드로 주세요" 하고 내는 요청서.
- StorageClass: 요청이 오면 PV를 자동으로 만들어주는 템플릿(동적 프로비저닝). 클라우드에서는 보통 이걸로 디스크가 즉석 생성된다.
앱Pod
→
요청서PVC (10Gi, RWO)
→
동적 생성StorageClassPV (바인딩)
→
실제 저장소클라우드 디스크 / NFS
Pod는 PV의 정체(어떤 클라우드 디스크인지)를 몰라도 된다. PVC라는 추상화만 보면 된다 — 이게 쿠버네티스 스토리지의 핵심이다.
접근 모드(Access Modes)
- RWO (ReadWriteOnce): 한 노드에서만 읽기/쓰기. 대부분의 블록 디스크.
- ROX (ReadOnlyMany): 여러 노드에서 읽기 전용.
- RWX (ReadWriteMany): 여러 노드에서 동시 읽기/쓰기. NFS 같은 공유 파일시스템에서만 가능.
DB를 여러 노드에 띄우려고 RWO 디스크를 공유하려다 막히는 일이 흔하다. 접근 모드를 먼저 확인하자.
StatefulSet 한마디
상태가 있는 앱(DB 등)은 보통 Deployment가 아니라 StatefulSet으로 띄운다. 각 복제본에 안정적인 이름(db-0, db-1)과 전용 PVC를 붙여, 재시작돼도 같은 디스크를 다시 무는 것을 보장한다.
References
- https://kubernetes.io/docs/concepts/storage/persistent-volumes/
- https://kubernetes.io/docs/concepts/storage/storage-classes/
- https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/