본문으로 건너뛰기

PV(Persistent Volume) & PVC(Persistent Volume Claim)


PV (Persistent Volume)

개념

  • 클러스터 전체에서 사용 가능한 스토리지 풀이다.
  • Cluster-scoped 리소스이다.
  • 주된 사용 패턴은 다음과 같다.
    • 클러스터 관리자가 PV를 생성한다.
    • 사용자는 PVC(Persistent Volume Claim)을 통해 필요한 만큼 요청한다.
    • PVC 조건에 맞는 PV가 할당된다.
    • Pod의 볼륨으로 PVC를 적용한다.
  • cf) PV의 스토리지 구현으로 hostPath를 사용이 가능하긴 하지만(할당되는 Pod가 실행되는 노드의 디스크 사용), 이는 PV의 설계의도와 맞지 않는 사용 사례이며, 권장되지 않는다.

예시

apiVersion: v1
kind: PersistentVolume
metadata:
name: efs-pv
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 5Gi
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Retain

nfs:
server: <EFS-Mount-Target-IP-Address>
path: "/"
readOnly: false
  • accessModes:
    • ReadWriteOnce - 단 하나의 노드에서 읽기/쓰기로 마운트 될 수 있다.
    • ReadOnlyMany - 여러 노드에서 읽기 전용으로 마운트될 수 있다.
    • ReadWriteMany - 여러 노드에서 읽기/쓰기로 마운트 될 수 있다.
  • capacity: 저장 용량
  • persistentVolumeReclaimPolicy
    • Retain - PVC가 삭제되어도 PV를 유지, 이후 새로운 PVC에 할당될 수 없음
    • Delete - PVC가 삭제되면 PV도 삭제
    • Recycle(Deprecated) - PVC가 삭제되면 PV를 재활용 가능하게 만듬, PVC에 할당될 수 있음
  • 이외 필드는 해당 스토리지 구현체에 따라 다르므로 생략
정보

Recycle이 Deprecated 된 이유

  • rm -rf 수준의 단순 삭제
  • 보안 삭제를 보장하지 않음
  • 스냅샷, 암호화, 클라우드 메타데이터 미처리
  • CSI 및 클라우드 스토리지와 부적합

-> 이에 현재 StorageClass + 동적 프로비저닝 사용


PVC (Persistent Volume Claim)

개념

  • 사용자가 스토리를 요청하는 객체 (PV - 자원, PVC - 요청서)
  • Namespace-scoped 리소스이다.
  • PV와 PVC는 1 : 1 관계로 바인딩 된다.
  • PV에서 PVC와 바인딩 된 이후 남는 용량이 있다고 하더라도 다른 PVC가 사용할 수 없다.
    • ex: PVC에서 1기가 요청하더라도 할당된 PV가 2기가라면 PVC에는 2기가가 할당된다.

바인딩 규칙 (중요)

CKA 시험에서 자주 나오는 유형이다. 아래 바인딩 규칙을 떠올려서 PV, PVC 혹은 Pod 트러블 슈팅을 할 수 있어야한다.

우선순위

  1. StorageClass가 일치하는지?
  2. label/selector가 일치하는지?
  3. PV의 용량이 PVC 요청을 만족할만큼 큰지?
  4. AccessMode가 일치하는지?
  • 조건이 맞는 PV가 없으면 PVC는 Pending 상태가 된다.

예시

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi

Pod에 PVC 적용

apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: web
volumes:
- name: web
persistentVolumeClaim:
claimName: myclaim
  • PodPVC는 같은 네임스페이스에 존재해야 함
  • spec.volumes.persistentVolumeClaim
    • claimName - 여기에 PVC 이름 작성

레퍼런스