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 연결 과정
- 사용자가 PVC를 생성하면 Kubernetes가 해당 PVC 요구사항을 충족하는 PV를 검색함.
- 조건이 일치하는 PV가 있으면 PVC가 해당 PV와 바인딩됨.
- 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 |