K8s

1 posts in this category

pv pvc storageclass 에 관해서

Kubernetes 스토리지 가이드: PV / PVC / StorageClass 완전 정복

버전 무관 개념 중심 정리 (CSI 기반 일반 원칙). 집/온프레미스 K8s에도 바로 적용 가능.

목차

  1. 빠른 요약 (TL;DR)
  2. 핵심 개념
  3. 각 오브젝트 심화
  4. 프로비저닝 방식
  5. 접근 모드 / 볼륨 모드
  6. 예제로 배우는 구성 패턴
  7. 리사이즈/스냅샷/백업
  8. 보안/권한/퍼미션
  9. 성능/운영 팁
  10. 트러블슈팅 체크리스트
  11. 자주 하는 실수
  12. 명령어 치트시트
  13. 부록: 템플릿 모음

빠른 요약 (TL;DR)

  • PV: 클러스터에 실제 존재하는 저장소 리소스 (디스크 자체).
  • PVC: 개발자/워크로드가 요구하는 스토리지 요청서 (용량/접근모드/클래스).
  • StorageClass: PVC를 만들면 PV를 자동으로 생성하는 규칙서(드라이버 설정).
  • 관계: Pod → PVC → PV → (Storage Backend)
  • 온프레미스/홈랩: NFS 또는 Local Path Provisioner, 규모가 커지면 Longhorn/Rook-Ceph 등 고려.
[Storage Backend] ←(CSI/프로비저너)— [StorageClass 규칙]
         ↑                                ↑
         └────────────── 바인딩 ───────────┘
                      [PVC 요청서]  ← Pod가 참조
                           │
                           ▼
                        [PV 실물]

핵심 개념

  • Static Provisioning: 관리자가 먼저 PV를 생성 → 사용자는 PVC로 그 PV를 바인딩.
  • Dynamic Provisioning: 사용자가 PVC만 만들면, StorageClass 규칙에 따라 PV가 자동 생성되어 바인딩.
  • 접근 모드(accessModes): ReadWriteOnce(RWO), ReadOnlyMany(ROX), ReadWriteMany(RWX) 등.
    • 다중 노드에서 동시에 쓰기하려면 보통 RWX가 필요(NFS/분산 스토리지).
  • 볼륨 모드(volumeMode): Filesystem(기본) / Block(원시 블록 디바이스).
  • 보존 정책(reclaimPolicy): Delete / Retain / (드라이버에 따라 Recycle은 보통 미사용).
    • 중요 데이터는 Retain으로 두고 수동 정리 권장.
  • 바인딩 시점(volumeBindingMode): Immediate vs WaitForFirstConsumer.
    • 후자는 Pod 스케줄링 시점에 노드/가용영역을 고려해 바인딩(클라우드/토폴로지에 유리).
  • 확장(allowVolumeExpansion): PVC 사이즈 증가 허용 여부.

각 오브젝트 심화

PV (PersistentVolume)

  • 무엇: “실제 디스크”를 나타내는 K8s 오브젝트.
  • 주요 필드
    • spec.capacity.storage: 용량(예: 10Gi)
    • spec.accessModes: RWO/ROX/RWX
    • spec.volumeMode: Filesystem/Block
    • spec.persistentVolumeReclaimPolicy: Delete/Retain
    • 백엔드 설정: nfs, hostPath, iscsi, csi:
    • nodeAffinity: 특정 노드에만 붙도록 제한 가능(로컬 디스크 시 유용).
  • 수명: Pod와 독립. Pod가 죽어도 데이터 유지.

PVC (PersistentVolumeClaim)

  • 무엇: “스토리지 요청서”(용량/접근 모드/클래스).
  • 주요 필드
    • spec.resources.requests.storage
    • spec.accessModes
    • spec.storageClassName
    • spec.volumeMode
    • (정적 바인딩 시) spec.selector.matchLabels로 특정 PV만 선택 가능.
  • 상태: Pending → Bound 로 바인딩되면 사용 가능.

StorageClass

  • 무엇: “PV를 생성하는 규칙/드라이버 설정”
  • 주요 필드
    • provisioner: 예) kubernetes.io/no-provisioner(정적), rancher.io/local-path, nfs.csi.k8s.io, ebs.csi.aws.com
    • parameters: 드라이버별 설정 (디스크 타입, fsType 등)
    • reclaimPolicy: Delete/Retain
    • allowVolumeExpansion: true/false
    • volumeBindingMode: Immediate / WaitForFirstConsumer
    • mountOptions: noatime 등 마운트 옵션
    • allowedTopologies: 영역/존 한정

프로비저닝 방식

1) Static Provisioning

  1. 관리자가 PV를 미리 정의(NFS 경로/로컬 디스크 등).
  2. 사용자가 PVC를 만들면 조건 일치하는 PV와 바인딩.
  3. 주로 온프레미스에서 기존 NAS/NFS 공유를 잡아줄 때 단순/명확.

2) Dynamic Provisioning

  1. 관리자가 StorageClass와 **프로비저너(또는 CSI 드라이버)**를 배포.
  2. 사용자가 PVC 생성 시 storageClassName을 명시.
  3. 컨트롤러가 조건에 맞는 PV를 자동 생성하고 바인딩.
  4. 클라우드/CSI 환경, 또는 nfs-subdir-external-provisioner, local-path-provisioner 등에서 편리.

접근 모드 / 볼륨 모드

  • accessModes
    • RWO: 한 노드의 한 Pod(여러 Pod 가능하나 같은 노드 내)에서 읽기/쓰기.
    • ROX: 여러 노드에서 읽기 전용 공유.
    • RWX: 여러 노드/Pod에서 읽기/쓰기 공유(NFS/분산스토리지 필요).
    • (클러스터/드라이버에 따라) ReadWriteOncePod 모드가 제공되기도 함.
  • volumeMode
    • Filesystem: 일반 마운트(디렉토리로 사용). 대부분의 워크로드 기본.
    • Block: 파일시스템 없이 블록 디바이스로 노출(DB 특수 케이스).

예제로 배우는 구성 패턴

아래 예제의 네임스페이스는 기본(default) 가정. 필요 시 metadata.namespace 추가.