Kubernetes에서 Pod는 기본적으로 **임시 저장소(Ephemeral Storage)**를 사용하므로,
Pod가 재시작되거나 삭제되면 컨테이너 내부의 데이터도 함께 사라집니다.
이를 해결하기 위해 **PersistentVolume(PV)과 PersistentVolumeClaim(PVC)**을 사용하여 영구적인 스토리지를 제공합니다.
이번 글에서는 PersistentVolume(PV), PersistentVolumeClaim(PVC), 그리고 StorageClass의 개념과 실전 활용법을 정리하겠습니다.
🔹 PersistentVolume(PV)란?
**PersistentVolume(PV)**은 Kubernetes 클러스터에서 관리하는 영구적인 스토리지 리소스입니다.
✔️ 클러스터에서 제공하는 스토리지를 추상화하여 관리
✔️ Pod와 독립적으로 존재하며, Pod가 삭제되어도 데이터 유지 가능
✔️ 관리자가 직접 생성하거나, StorageClass를 통해 동적으로 생성 가능
💡 PV는 클러스터 내에서 공유되는 스토리지이며, Pod는 PVC를 통해 이를 요청하여 사용합니다.
🔹 PersistentVolumeClaim(PVC)란?
**PersistentVolumeClaim(PVC)**은 Pod가 PersistentVolume(PV)을 요청하는 방법입니다.
✔️ Pod는 직접 PV를 사용하지 않고, PVC를 통해 스토리지를 요청
✔️ PVC의 요청 조건(스토리지 크기, 접근 모드 등)에 맞는 PV가 자동으로 바인딩됨
💡 PVC를 사용하면 개발자는 스토리지의 물리적인 구현을 신경 쓰지 않고, 필요한 만큼 요청하여 사용할 수 있습니다.
🔹 PersistentVolume(PV) 및 PersistentVolumeClaim(PVC) 예제
아래 예제는 1Gi의 영구 볼륨을 생성하고, 이를 PVC를 통해 Pod에서 사용하는 설정입니다.
1️⃣ PersistentVolume (PV) 생성
apiVersion: v1
kind: PersistentVolume # PV 리소스 선언
metadata:
name: my-pv # PV의 이름
spec:
capacity:
storage: 1Gi # PV의 총 저장 용량
accessModes:
- ReadWriteOnce # 하나의 노드에서 읽기/쓰기 가능
persistentVolumeReclaimPolicy: Retain # PV 삭제 시 데이터 유지
hostPath:
path: "/mnt/data" # 물리적인 스토리지 경로 (로컬 볼륨)
2️⃣ PersistentVolumeClaim (PVC) 생성
apiVersion: v1
kind: PersistentVolumeClaim # PVC 리소스 선언
metadata:
name: my-pvc # PVC의 이름
spec:
accessModes:
- ReadWriteOnce # 요청하는 접근 모드
resources:
requests:
storage: 1Gi # 요청하는 스토리지 크기
3️⃣ Pod에서 PVC 사용
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
volumes:
- name: my-storage
persistentVolumeClaim:
claimName: my-pvc # PVC를 통해 볼륨을 요청
containers:
- name: my-container
image: busybox
command: ["sh", "-c", "echo Hello Kubernetes > /data/hello.txt && sleep 3600"]
volumeMounts:
- mountPath: "/data" # 컨테이너 내부 마운트 경로
name: my-storage
💡 이 설정을 적용하면 /mnt/data에 저장된 파일이 Pod가 재시작되더라도 유지됩니다.
🔹 StorageClass란?
StorageClass는 Kubernetes에서 스토리지를 동적으로(provisioning) 생성하는 방법을 정의하는 리소스입니다.
✔️ PVC가 요청될 때 자동으로 PV를 생성
✔️ 스토리지의 종류(SSD, HDD 등) 및 동작 방식을 지정 가능
✔️ AWS EBS, GCP Persistent Disk, Azure Disk 등과 연동 가능
💡 StorageClass를 사용하면 관리자가 PV를 직접 생성하지 않아도, PVC 요청 시 자동으로 스토리지가 할당됩니다.
🔹 StorageClass를 이용한 동적 볼륨 할당 예제
아래 예제는 StorageClass를 사용하여 PVC 요청 시 자동으로 PV를 생성하는 방법을 보여줍니다.
1️⃣ StorageClass 생성
apiVersion: storage.k8s.io/v1
kind: StorageClass # StorageClass 리소스 선언
metadata:
name: my-storageclass # StorageClass의 이름
provisioner: kubernetes.io/aws-ebs # AWS EBS를 사용하여 동적 볼륨 생성
parameters:
type: gp2 # EBS 볼륨 유형 (gp2 = SSD)
fsType: ext4 # 파일 시스템 유형
2️⃣ PVC 생성 (StorageClass 사용)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-dynamic-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi # 5Gi 크기의 볼륨 요청
storageClassName: my-storageclass # StorageClass 지정
💡 이 PVC가 생성되면 my-storageclass를 사용하여 자동으로 PV가 할당됩니다.
🔹 PersistentVolume Reclaim Policy (볼륨 삭제 정책)
정책 설명
Retain (기본값) | PVC가 삭제되어도 데이터 유지 (관리자가 수동으로 정리 필요) |
Recycle | PVC 삭제 시 볼륨을 초기화 (deprecated) |
Delete | PVC 삭제 시 볼륨도 자동 삭제 (StorageClass에서만 사용 가능) |
💡 기본적으로 Retain이 설정되어 있으며, Delete를 사용하면 자동으로 정리됩니다.
🔹 PersistentVolume 및 PVC 상태 확인
kubectl get pv
kubectl get pvc
💡 PVC가 PV에 정상적으로 바인딩되었는지 확인할 수 있습니다.
🚀 마무리
✔️ PersistentVolume(PV)은 클러스터에서 관리하는 영구 저장소
✔️ PersistentVolumeClaim(PVC)은 Pod가 스토리지를 요청하는 방법
✔️ StorageClass를 사용하면 PVC 요청 시 자동으로 PV를 할당할 수 있음
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
Kubernetes 리소스 시리즈 #11: ResourceQuota & LimitRange (클러스터 리소스) (0) | 2025.03.05 |
---|---|
Kubernetes 리소스 시리즈 #10: Node & Namespace (클러스터 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #8: ConfigMap & Secret (구성 및 스토리지 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #7: NetworkPolicy (서비스 및 네트워크 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #6: Service & Ingress (서비스 및 네트워크 리소스) (0) | 2025.03.05 |