개발 창고/AI

쿠버네티스 볼륨 완벽 가이드: PV, PVC, StorageClass 개념 분석

Royzero 2025. 9. 22. 22:34
반응형

설명 (Description): 쿠버네티스(Kubernetes)에서 데이터 영속성을 보장하는 볼륨(Volume)의 핵심 개념을 알아봅니다. PV, PVC, StorageClass의 관계와 동작 방식을 명확한 YAML 예제와 함께 실무자 수준에서 상세히 설명하여 안정적인 애플리케이션 운영을 돕습니다.

TL;DR: 쿠버네티스 볼륨(Volume)은 컨테이너의 비영속적인 파일 시스템 문제를 해결하기 위해 파드(Pod)에 영구적인 저장 공간을 제공하는 핵심 기능입니다. 파드가 재시작되어도 데이터가 보존되도록 합니다. 스토리지 관리는 주로 PersistentVolume(PV), PersistentVolumeClaim(PVC), StorageClass 세 가지 오브젝트를 통해 추상화됩니다. 관리자는 PV로 실제 저장소를 정의하고, 사용자는 PVC로 필요한 저장소를 요청하며, StorageClass는 이 과정을 동적으로 자동화하여 클라우드 환경에서 효율적인 스토리지 프로비저닝을 가능하게 합니다.


1. 왜 쿠버네티스 볼륨이 필요한가?

컨테이너는 기본적으로 비영속적(ephemeral)입니다. 컨테이너 내부에 파일을 저장하더라도, 컨테이너가 어떤 이유로든 재시작되거나 삭제되면 그 안의 모든 데이터는 유실됩니다. 데이터베이스, 파일 서버 등 상태를 유지해야 하는(stateful) 애플리케이션을 쿠버네티스에서 운영하려면 이 문제를 반드시 해결해야 합니다.

쿠버네티스 볼륨은 파드의 생명주기와 스토리지의 생명주기를 분리하여 이 문제를 해결합니다. 볼륨은 파드 내의 컨테이너들이 접근할 수 있는 디렉토리이며, 파드가 사라져도 볼륨의 데이터는 보존될 수 있습니다. 이를 통해 데이터의 영속성을 보장하고, 같은 파드 내의 여러 컨테이너가 데이터를 공유하는 용도로도 사용됩니다.

Why it matters: 볼륨이 없다면 쿠버네티스는 상태 비저장(stateless) 애플리케이션만 운영할 수 있는 제한적인 플랫폼에 머물렀을 것입니다. 볼륨은 데이터 영속성을 제공함으로써 쿠버네티스를 범용적인 애플리케이션 오케스트레이션 플랫폼으로 만들어주는 핵심 요소입니다.


2. 기본 볼륨 유형: emptyDir과 hostPath

쿠버네티스는 다양한 유형의 볼륨을 지원합니다. 그중 가장 기본적인 두 가지는 emptyDir과 hostPath입니다.

  • emptyDir: 파드가 노드에 할당될 때 생성되는 임시 빈 디렉토리입니다. 파드가 존재하는 동안에는 데이터가 유지되며, 같은 파드 내의 컨테이너들이 이 디렉토리를 공유할 수 있습니다. 예를 들어, 한 컨테이너가 데이터를 처리하여 파일로 저장하면 다른 컨테이너가 그 파일을 읽어가는 시나리오에 유용합니다. 하지만 파드가 노드에서 삭제되면 emptyDir의 데이터도 함께 영구히 삭제됩니다.
  • hostPath: 워커 노드(Worker Node)의 파일 시스템에 있는 파일이나 디렉토리를 파드에 직접 마운트합니다. 이는 노드의 특정 시스템 파일에 접근해야 하는 경우 등 제한적인 상황에서 사용됩니다. 하지만 hostPath는 파드가 특정 노드에 종속되게 만들고, 노드의 파일 시스템을 직접 건드리기 때문에 보안상 위험이 커 프로덕션 환경에서는 사용을 극도로 신중하게 고려해야 합니다.

Why it matters: emptyDir과 hostPath는 쿠버네티스 볼륨의 가장 단순한 형태입니다. emptyDir은 임시 데이터 공유의 개념을, hostPath는 노드와의 직접적인 연결 가능성을 보여주지만, 둘 다 데이터 영속성을 완전하게 보장하지는 못하므로 영구 저장이 필요하다면 다른 방식을 사용해야 합니다.


3. 영구 저장소를 위한 삼총사: PV, PVC, StorageClass

복잡한 실제 운영 환경에서는 emptyDir이나 hostPath만으로는 부족합니다. 개발자가 스토리지 인프라의 구체적인 정보(NFS 서버 주소, 클라우드 스토리지 종류 등)를 알 필요 없이 필요할 때마다 스토리지를 요청하고 할당받을 수 있는 추상화된 메커니즘이 필요합니다. 이를 위해 쿠버네티스는 PersistentVolume(PV), PersistentVolumeClaim(PVC), StorageClass라는 세 가지 핵심 리소스를 제공합니다.

리소스 역할 주로 사용하는 주체 비유
PersistentVolume (PV) 실제 스토리지(NFS, iSCSI, 클라우드 디스크 등)를 클러스터 리소스로 추상화한 것. 용량, 접근 모드, 스토리지 종류 등을 정의. 클러스터 관리자 호텔의 객실
PersistentVolumeClaim (PVC) 사용자가 PV에 요청하는 명세. 필요한 스토리지 용량과 접근 모드를 정의. 개발자/사용자 객실 예약
StorageClass PV를 동적으로 생성하기 위한 템플릿. 어떤 종류의 스토리지를 어떻게 만들지 정의. 클러스터 관리자 객실 타입 (스탠다드, 디럭스)

Sheets로 내보내기

이 세 요소는 다음과 같이 상호작용합니다.

  1. 관리자는 StorageClass를 통해 "fast-ssd", "backup-hdd" 와 같이 다양한 종류의 스토리지 템플릿을 미리 정의해 둡니다.
  2. 사용자는 애플리케이션에 10GiB 크기의 "fast-ssd" 스토리지가 필요하다고 명시한 PVC를 생성합니다.
  3. 쿠버네티스는 이 PVC 요청을 보고, fast-ssd StorageClass의 정의에 따라 클라우드 제공업체에 요청하여 10GiB 크기의 디스크를 실제로 생성하고, 이를 PV로 만들어 PVC와 바인딩(binding)합니다.
  4. 사용자는 자신의 파드에서 PVC의 이름을 참조하여 볼륨을 마운트하고 데이터를 저장합니다.

Why it matters: PV, PVC, StorageClass는 스토리지 인프라와 애플리케이션 개발을 완전히 분리합니다. 개발자는 복잡한 인프라를 몰라도 "10GB의 빠른 스토리지가 필요하다"는 선언만으로 스토리지를 할당받을 수 있습니다. 이는 클라우드 네이티브 환경의 핵심인 선언적 구성과 자동화를 스토리지 영역에서 구현한 것입니다.


4. PV와 PVC 사용 예제 (YAML)

아래는 StorageClass를 이용하여 동적으로 PV를 프로비저닝하고, 이를 파드에서 사용하는 전체 과정을 보여주는 YAML 예제입니다.

1. PersistentVolumeClaim (PVC) 생성 사용자는 3GiB 크기의 스토리지를 standard 스토리지 클래스 타입으로 요청합니다.

# pvc-definition.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteOnce # 하나의 노드에서만 읽기/쓰기 가능
  resources:
    requests:
      storage: 3Gi

2. Pod에서 PVC 사용 이제 위에서 생성한 my-pvc를 참조하여 파드의 볼륨으로 마운트합니다. 파드는 PVC가 바인딩된 PV가 무엇인지는 알 필요가 없습니다.

# pod-with-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: web-server
      image: nginx
      volumeMounts:
        - name: my-storage
          mountPath: /usr/share/nginx/html
  volumes:
    - name: my-storage
      persistentVolumeClaim:
        claimName: my-pvc # 위에서 생성한 PVC의 이름을 참조

위 YAML 파일들을 kubectl apply 명령으로 실행하면, 쿠버네티스는 my-pvc의 요청에 맞는 PV를 동적으로 생성하여 바인딩하고, my-pod는 이 볼륨을 /usr/share/nginx/html 경로에 마운트하여 데이터를 영구적으로 저장할 수 있게 됩니다.

Why it matters: YAML 예제는 PV/PVC 모델의 강력함을 보여줍니다. 파드 정의(pod-with-pvc.yaml)에는 실제 스토리지 기술에 대한 어떠한 정보도 포함되지 않습니다. 오직 claimName을 통해 추상화된 요청만 참조하므로, 스토리지 인프라가 변경되더라도 애플리케이션 코드는 전혀 수정할 필요가 없습니다.

결론 (요약 정리)

쿠버네티스 볼륨은 컨테이너 기반 환경에서 데이터 영속성을 확보하는 필수적인 기능입니다. emptyDir, hostPath와 같은 기본적인 볼륨 타입부터, 실제 프로덕션 환경을 위한 PersistentVolume(PV), PersistentVolumeClaim(PVC), StorageClass에 이르는 강력한 추상화 모델을 제공합니다. 이 모델을 통해 개발자와 인프라 관리자의 역할을 명확히 분리하고, 선언적인 방식으로 스토리지를 효율적으로 관리할 수 있습니다.

 

References:

반응형