Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #9: PersistentVolume & StorageClass (구성 및 스토리지 리소스)

ygtoken 2025. 3. 5. 00:23
728x90

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를 할당할 수 있음

 

728x90