본문 바로가기
Infra/Kubernetes

pv / pvc

by TrendPilot 2025. 3. 10.

Kubernetes에서 PV와 PVC란?

Kubernetes(쿠버네티스)에서 애플리케이션을 배포할 때, 컨테이너 내부에서 데이터를 저장하고 유지하는 것이 중요합니다. pod 는 일반적으로 휘발성이기 때문에, 컨테이너가 재시작되거나 이동할 때 데이터가 손실할 수 있습니다. 이를 해결하기 위해 Kubernetes에서는 PV(Persistent Volume)PVC(Persistent Volume Claim) 로 데이터의 유실을 방지합니다.

1. PV(Persistent Volume)란?

PV는 클러스터에서 관리되는 독립적인 스토리지 리소스입니다. 관리자는 스토리지를 미리 프로비저닝(provisioning)하여 PV로 등록할 수 있으며, 이를 통해 여러 Pod에서 지속적인 데이터를 유지할 수 있습니다.

PV의 주요 속성

  • 스토리지 크기: 특정한 크기로 정의됨 (예: 10Gi)
  • 액세스 모드:
    • ReadWriteOnce (RWO): 하나의 노드에서 읽기/쓰기 가능
    • ReadOnlyMany (ROX): 여러 노드에서 읽기 전용 액세스 가능
    • ReadWriteMany (RWX): 여러 노드에서 읽기/쓰기 가능
  • 스토리지 클래스(Storage Class): PV가 어떤 종류의 스토리지에서 제공되는지 정의 (예: AWS EBS, NFS, Ceph 등)
  • 재생 정책(Reclaim Policy): PV가 사용 후 어떻게 처리될지 정의 (Retain, Delete, Recycle 중 선택)

PV 예제 (YAML)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
  hostPath:
    path: "/mnt/data"

2. PVC(Persistent Volume Claim)란?

PVC는 사용자가 특정한 크기와 액세스 모드를 요청하는 리소스입니다. 사용자가 PVC를 생성하면 Kubernetes는 적절한 PV를 찾아 PVC에 연결해 줍니다. 이는 클라이언트가 직접 스토리지를 할당하지 않고도 원하는 스토리지를 사용할 수 있도록 합니다.

즉, PV 란 집을 만들고 PVC 란 집 열쇠로 집과 연결시켜주는 개념으로 PVC 로 mount 하지 않으면 데이터 저장이 안됩니다.

PVC의 주요 속성

  • 요청한 스토리지 크기: 사용자가 필요한 용량을 명시
  • 액세스 모드: PV와 동일한 액세스 모드를 정의 (PV 와 동일한 액세스 모드가 아닐 시 mount 안됨)
  • 스토리지 클래스: 특정 스토리지 유형을 요청할 수 있음

PVC 예제 (YAML)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: standard

3. PVC와 PV 연결 과정

  1. 사용자가 PVC를 생성하면 Kubernetes가 해당 PVC 요구사항을 충족하는 PV를 검색함.
  2. 조건이 일치하는 PV가 있으면 PVC가 해당 PV와 바인딩됨.
  3. Pod에서 PVC를 참조하면, PVC가 연결된 PV가 마운트됨.

4. PVC를 Pod에서 사용하는 방법

PVC를 Pod에 연결하려면 volume을 정의하고 persistentVolumeClaim을 참조하면 됩니다.

Pod에서 PVC 사용 예제 (YAML)

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: app-container
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: storage
  volumes:
  - name: storage
    persistentVolumeClaim:
      claimName: example-pvc

5. 동적 프로비저닝 (Dynamic Provisioning)과 스토리지 클래스(Storage Class)

PV를 미리 생성하는 대신, Kubernetes가 필요할 때 자동으로 PV를 생성할 수도 있습니다. 이를 동적 프로비저닝(Dynamic Provisioning) 이라고 합니다. 이를 위해 PVC에서 storageClassName을 설정하면 해당 스토리지 클래스를 사용하는 PV가 자동으로 생성됩니다.

StorageClass란?

StorageClass는 Kubernetes에서 동적 스토리지 프로비저닝을 가능하게 하는 리소스입니다. 관리자는 다양한 유형의 스토리지(예: AWS EBS, GCE Persistent Disk, NFS 등)를 정의하고, 사용자(PVC)가 특정 StorageClass를 지정하면 해당 스토리지에서 자동으로 PV가 생성됩니다.

StorageClass의 주요 속성

  • provisioner: 스토리지를 동적으로 생성하는 플러그인 (예: kubernetes.io/aws-ebs, kubernetes.io/gce-pd)
  • parameters: 스토리지 종류 및 설정 (예: 볼륨 유형, IOPS 등)
  • reclaimPolicy: 스토리지가 삭제될 때 동작 (Retain, Delete, Recycle)
  • volumeBindingMode: 볼륨이 PVC와 언제 바인딩될지를 결정 (Immediate, WaitForFirstConsumer)

StorageClass 예제

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  iopsPerGB: "10"
  fsType: ext4
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

PVC에서 StorageClass 사용 예제

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dynamic-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: fast-storage

6. PV와 PVC의 상태 확인

아래 명령어를 사용하여 현재 PV 및 PVC 상태를 확인할 수 있습니다.

kubectl get pv
kubectl get pvc
kubectl get storageclass

결론

Kubernetes에서 Persistent Volume(PV)Persistent Volume Claim(PVC)는 상태 저장 데이터를 관리하는 핵심 요소입니다. PVC를 사용하면 애플리케이션이 필요한 스토리지를 동적으로 요청할 수 있으며, 관리자는 PV를 통해 다양한 스토리지 백엔드를 통합하여 유연한 스토리지 관리를 할 수 있습니다.

특히 StorageClass를 활용하면 필요할 때 자동으로 PV를 생성하고 관리할 수 있어, 클러스터 운영을 보다 효율적으로 할 수 있습니다. Kubernetes의 PV, PVC, StorageClass를 잘 이해하고 활용하면, 컨테이너 환경에서도 데이터의 영속성을 보장할 수 있습니다.

 

감사합니다.


pv 공식문서

https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/

 

퍼시스턴트 볼륨

이 페이지에서는 쿠버네티스의 퍼시스턴트 볼륨 에 대해 설명한다. 볼륨에 대해 익숙해지는 것을 추천한다. 소개 스토리지 관리는 컴퓨트 인스턴스 관리와는 별개의 문제다. 퍼시스턴트볼륨 서

kubernetes.io

 

'Infra > Kubernetes' 카테고리의 다른 글

Vanilla Kubernetes install  (0) 2025.03.20
secret  (0) 2025.03.10
CNI  (0) 2025.03.06
Helm  (1) 2025.02.27
서비스  (0) 2025.02.21