관리 메뉴

근묵자흑

PV, PVC, StorageClass 본문

k8s

PV, PVC, StorageClass

Luuuuu 2025. 5. 4. 16:38

1. Persistent Volume (PV) - 스토리지라는 창고

PV가 뭘까요?

PV는 Kubernetes 클러스터에서 제공하는 '스토리지 창고'라고 생각하면 됩니다.

일상생활에 비유하면:

  • 아파트 단지의 공용 보관함
  • 대여할 수 있는 창고
  • 빌릴 수 있는 저장 공간

주요 특징:

  • 클러스터 리소스: 노드처럼 클러스터의 일부로 존재
  • 파드와 독립적: 컨테이너가 삭제되어도 데이터가 유지
  • 접근 모드: 누가 어떻게 접근할 수 있는지 정의
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-storage
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce  # 한 번에 한 노드만 읽기/쓰기 가능
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/data

접근 모드 (Access Modes)

스토리지를 어떻게 사용할 수 있는지 정의합니다:

  1. ReadWriteOnce (RWO): 한 명만 들어갈 수 있는 개인 서재
    • 하나의 노드만 읽기/쓰기 가능
    • 대부분의 블록 스토리지 타입이 지원
  2. ReadOnlyMany (ROX): 많은 사람이 볼 수 있는 도서관
    • 여러 노드가 읽기만 가능
    • 공유 파일 시스템에서 주로 사용
  3. ReadWriteMany (RWX): 여러 사람이 편집할 수 있는 공유 문서
    • 여러 노드가 동시에 읽기/쓰기 가능
    • NFS 같은 네트워크 파일 시스템에서 주로 지원

2. Persistent Volume Claim (PVC) - 스토리지 신청서

PVC가 뭘까요?

PVC는 사용자가 스토리지를 신청하는 '요청서'입니다.

일상생활에 비유하면:

  • 창고 대여 신청서
  • "5평짜리 창고가 필요해요" 같은 요청
  • 필요한 조건을 적는 주문서
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: fast-storage

PVC가 필요한 이유

개발자와 관리자의 역할을 분리하여 더 효율적으로 작업할 수 있습니다:

개발자 (PVC 사용자):

  • "3GB 크기의 저장공간이 필요해요"
  • 스토리지 세부사항을 몰라도 됨
  • 필요한 조건만 명시

관리자 (PV 제공자):

  • 다양한 스토리지 옵션을 미리 준비
  • 클러스터의 인프라 관리
  • 보안 설정과 정책 관리

3. PV와 PVC의 생명주기


1. 프로비저닝 (Provisioning)

  • 정적 프로비저닝: 관리자가 미리 PV를 만들어 둠
  • 동적 프로비저닝: 요청 시 자동으로 PV 생성

2. 바인딩 (Binding)

  • PVC가 적합한 PV를 찾아서 결합
  • 마치 열쇠와 자물쇠가 맞아떨어지는 것처럼!

3. 사용 (Using)

  • Pod가 바인딩된 PVC를 통해 스토리지 사용
  • 애플리케이션이 데이터를 읽고 쓰기

4. 해제 (Releasing)

  • PVC 삭제 시 PV가 해제됨
  • 데이터 처리는 Reclaim Policy에 따라 결정

5. 회수 (Reclaiming)

  • Retain: 데이터 보존
  • Delete: 데이터 완전 삭제
  • Recycle: 데이터 삭제 후 재사용

4. StorageClass - 스토리지 프로필

StorageClass란?

StorageClass는 다양한 종류의 스토리지를 정의하는 템플릿입니다.

일상생활에 비유하면:

  • 서로 다른 등급의 호텔방
  • 이코노미, 비즈니스, 퍼스트 클래스 좌석
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2  # SSD 타입
  fsType: ext4
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

주요 구성요소:

  1. Provisioner: 스토리지를 만들어주는 "공장"
  2. Parameters: 스토리지의 세부 옵션
  3. ReclaimPolicy: 사용 후 데이터 처리 방식
  4. VolumeBindingMode: 언제 바인딩할지 결정

5. Container Storage Interface (CSI)

CSI가 뭘까요?

CSI는 모든 스토리지 시스템이 Kubernetes와 쉽게 통합될 수 있도록 만든 표준 인터페이스입니다.

일상생활에 비유하면:

  • 모든 자동차가 사용하는 표준 연료 주입구
  • 모든 콘센트에 맞는 플러그 표준
  • 공통 인터페이스를 통한 호환성

CSI가 지원하는 볼륨 타입:

  1. 블록 스토리지:
    • 데이터베이스처럼 성능이 중요한 애플리케이션용
    • 하드디스크처럼 블록 단위로 데이터 저장
  2. 파일 스토리지:
    • 파일 공유가 필요한 애플리케이션용
    • 네트워크 드라이브처럼 작동
  3. 오브젝트 스토리지:
    • 이미지, 비디오 같은 비정형 데이터용
    • 클라우드 저장소처럼 작동

6. 로컬 볼륨 타입들

hostPath - 호스트의 로컬 폴더 사용

volumes:
- name: test-vol
  hostPath:
    path: /data
    type: Directory

특징:

  • 특정 노드의 파일시스템 사용
  • 테스트나 개발 환경에 적합
  • 프로덕션에서는 주의해서 사용

emptyDir - 임시 저장공간

volumes:
- name: cache-volume
  emptyDir: {}

특징:

  • Pod가 삭제되면 데이터도 삭제
  • 캐시나 임시 파일에 적합
  • 컨테이너 간 데이터 공유 가능

7. 시나리오: 웹 애플리케이션 데이터 저장

  1. 개발자가 PVC 생성:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: webapp-data
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: fast-storage
  1. StorageClass가 자동으로 PV 생성:
  • CSI 드라이버가 AWS EBS 볼륨 생성
  • 자동으로 PV 리소스 생성
  1. Pod에서 PVC 사용:
apiVersion: v1
kind: Pod
metadata:
  name: webapp
spec:
  containers:
  - name: app
    image: webapp:1.0
    volumeMounts:
    - name: data
      mountPath: /app/data
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: webapp-data