본문 바로가기
DevOps/Kubernetes

[k8s] 쿠버네티스 스토리지, 어디서부터 시작해야 할까? (PVC, PV, StorageClass, 그리고 CSI)

by couque 2026. 4. 1.
반응형

쿠버네티스를 처음 접하는 분들이 가장 어려워하는 부분 중 하나가 바로 스토리지입니다. 쿠버네티스는 컨테이너 오케스트레이션 도구로, 컨테이너의 생성, 삭제, 확장 등을 자동화해 줍니다. 컨테이너는 기본적으로 임시(ephemeral)적인 성격을 가지고 있습니다. 컨테이너가 삭제되면 그 안에 있던 데이터도 함께 사라지게 됩니다. 하지만 데이터베이스나 파일 서버처럼 데이터를 영구적으로 보관해야 하는 애플리케이션의 경우, 데이터를 안전하게 저장할 수 있는 공간이 필요합니다.

이번 포스팅에서는 쿠버네티스에서 데이터를 영구적으로 저장하기 위한 스토리지의 기본 개념과 종류, 그리고 동작 과정에 대해 알아보겠습니다.

이전에 학습한 [k8s] 쿠버네티스 네트워킹: Pod 간 통신 (Pod-to-Pod Communication) 가이드 알아보기

 


쿠버네티스 스토리지 핵심 개념

쿠버네티스 스토리지 시스템의 핵심은 PVC (PersistentVolumeClaim)PV (PersistentVolume) 입니다. 이 두 가지 개념을 이해하는 것이 스토리지 학습의 첫걸음입니다.

 

PVC (PersistentVolumeClaim)

  • 사용자의 요구 사항: "개발자"가 애플리케이션에 필요한 스토리지의 크기, 성능, 접근 모드 등을 정의한 것입니다. "나 10GB 공간이 필요해", "읽기/쓰기가 가능해야 해"와 같은 요청을 담고 있습니다.

PV (PersistentVolume)

  • 실제 스토리지 자원: "관리자"가 미리 준비해 둔 실제 스토리지 공간입니다. NFS, iSCSI, 클라우드 저장소 (AWS EBS, GCE Persistent Disk 등) 가 될 수 있습니다. PV는 PVC의 요청에 따라 동적으로 생성되거나 미리 만들어진 상태로 존재할 수 있습니다.

PVC와 PV의 관계: 바인딩

  • 매칭: PVC가 생성되면 쿠버네티스는 등록된 PV 중에서 PVC의 요구 사항을 충족하는 PV를 찾습니다. 요구 사항에 맞는 PV가 발견되면 PVC와 PV가 서로 "바인딩(Binding)"됩니다.
  • 할당: 바인딩된 PV는 PVC를 사용하는 팟(Pod)에 할당되어 데이터를 저장할 수 있는 공간이 됩니다.

StorageClass (SC)

  • 자동화된 스토리지 관리: PV를 수동으로 하나씩 생성하는 것은 번거로운 작업입니다. StorageClass는 PV 생성을 자동화하기 위한 템플릿 역할을 합니다. 관리자는 StorageClass에 스토리지의 종류, 프로비저닝 방법, 파라미터 등을 정의해 둡니다. PVC가 StorageClass를 지정하여 요청하면, 쿠버네티스는 StorageClass에 정의된 내용을 기반으로 동적으로 PV를 생성하고 PVC와 바인딩합니다.

 

쿠버네티스 스토리지의 종류

쿠버네티스는 다양한 종류의 스토리지를 지원합니다. 크게 내장형 스토리지외부 스토리지로 나눌 수 있습니다.

내장형 스토리지 (Built-in Volume)

  • emptyDir: 팟이 생성될 때 생성되고, 팟이 삭제될 때 함께 삭제되는 임시 스토리지입니다. 컨테이너 간의 데이터 공유나 임시 파일 저장에 사용됩니다.
  • hostPath: 노드의 로컬 디렉토리를 팟에 마운트하여 사용하는 스토리지입니다. 노드에 종속적이므로 팟이 다른 노드로 이동하면 데이터를 사용할 수 없습니다. 테스트나 특정 노드에 있는 데이터에 접근해야 하는 경우에 사용됩니다.
  • ConfigMap, Secret: 설정 정보나 비밀번호 등을 저장하는 데 사용되는 스토리지입니다. 팟에 파일 형태로 마운트되어 사용됩니다.

외부 스토리지 (External Volume)

  • 클라우드 스토리지: AWS EBS, GCE Persistent Disk, Azure Disk 등 클라우드 제공 업체가 제공하는 스토리지 시스템입니다. StorageClass를 통해 손쉽게 생성하고 관리할 수 있습니다.
  • NFS (Network File System): 네트워크를 통해 공유되는 파일 시스템입니다. 여러 팟에서 동시에 접근하여 데이터를 읽고 쓸 수 있습니다.
  • CSI (Container Storage Interface): 쿠버네티스와 스토리지 시스템 간의 표준 인터페이스입니다. 다양한 스토리지 벤더들이 CSI 드라이버를 제공하여 쿠버네티스에서 스토리지를 사용할 수 있도록 지원합니다.

 

쿠버네티스 스토리지 동작 과정

쿠버네티스 스토리지가 어떻게 작동하는지 단계별로 살펴보겠습니다.

  1. PVC 생성: 사용자가 필요한 스토리지 요구 사항(크기, 접근 모드, StorageClass 등)을 정의한 PVC를 생성합니다.
  2. PV 생성 (StorageClass 사용): PVC에 StorageClass가 지정되어 있다면, 쿠버네티스는 StorageClass에 정의된 파라미터를 기반으로 스토리지 프로비저너를 호출하여 동적으로 PV를 생성합니다.
  3. PV 생성 (수동): StorageClass가 없거나 수동으로 관리하고 싶다면 관리자가 직접 PV를 생성할 수도 있습니다.
  4. 바인딩 (Binding): PVC와 PV가 생성되면 쿠버네티스는 PVC의 요구 사항과 PV의 속성을 비교하여 적절한 PV를 찾습니다. 매칭되는 PV가 발견되면 PVC와 PV를 바인딩합니다.
  5. 팟 생성 및 마운트: 사용자가 PVC를 사용하는 팟을 생성하면, 쿠버네티스는 팟이 배포될 노드에 바인딩된 PV에 해당하는 실제 스토리지를 마운트합니다. 컨테이너 내부에서는 마운트된 디렉토리를 통해 스토리지에 접근할 수 있습니다.
  6. 데이터 저장: 컨테이너는 마운트된 디렉토리에 데이터를 읽고 씁니다. 데이터는 실제 스토리지에 저장됩니다.
  7. 팟 삭제: 팟이 삭제되더라도 PV와 PVC는 그대로 남아 있습니다.
  8. 데이터 보존: PV와 PVC가 남아 있기 때문에, 나중에 동일한 PVC를 사용하는 새로운 팟을 생성하면 이전 데이터를 그대로 사용할 수 있습니다.

 

Hands-on: PVC와 PV를 이용한 데이터 영속성 테스트

이제 간단한 실습을 통해 PVC와 PV를 이용한 데이터 영속성을 직접 확인해 보겠습니다.

 

1. PVC 정의 (pvc.yaml)

YAML
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  • my-pvc라는 이름의 PVC를 정의합니다.
  • ReadWriteOnce 접근 모드와 1Gi 용량을 요청합니다.

2. 팟 정의 (pod.yaml)

YAML
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - name: my-volume
      mountPath: /var/www/html
  volumes:
  - name: my-volume
    persistentVolumeClaim:
      claimName: my-pvc
  • my-pod라는 이름의 팟을 정의합니다.
  • my-pvc라는 이름의 PVC를 사용하며, /var/www/html 디렉토리에 마운트합니다.

3. PVC 생성

Bash
kubectl apply -f pvc.yaml
  • kubectl get pvc 명령어로 PVC 상태를 확인해 봅니다. 처음에는 'Pending' 상태일 수 있습니다. StorageClass가 설정되어 있다면 잠시 후 PV가 생성되고 PVC가 'Bound' 상태로 바뀔 것입니다.

4. 팟 생성 및 데이터 쓰기

Bash
kubectl apply -f pod.yaml
kubectl get pods -w
  • 팟이 실행될 때까지 기다립니다.
  • 팟 내부에서 /var/www/html 디렉토리에 테스트 파일을 생성해 봅니다.
Bash
kubectl exec -it my-pod -- bash -c "echo 'Hello from PVC!' > /var/www/html/hello.txt"

 

5. 팟 삭제 및 재생성

Bash
kubectl delete pod my-pod
  • 팟이 삭제된 후, 다시 팟을 생성합니다.
Bash
kubectl apply -f pod.yaml
kubectl get pods -w
  • 새로 생성된 팟 내부에서 이전에 생성한 파일이 남아 있는지 확인해 봅니다.
 
Bash
kubectl exec -it my-pod -- bash -c "cat /var/www/html/hello.txt"
  • "Hello from PVC!" 라는 내용이 출력된다면, PVC와 PV를 통해 데이터 영속성이 유지되고 있음을 확인할 수 있습니다.

 

인사이트 및 결론

이번 포스팅에서는 쿠버네티스 스토리지의 기본 개념과 종류, 그리고 동작 과정에 대해 알아보았습니다. PVC와 PV를 이용하면 컨테이너 기반 환경에서도 데이터를 영구적으로 저장하고 관리할 수 있습니다. StorageClass와 CSI를 활용하면 스토리지 관리를 더욱 효율적이고 자동화할 수 있습니다.

쿠버네티스 스토리지는 데이터의 안전성과 성능을 결정하는 중요한 요소입니다. 애플리케이션의 요구 사항에 맞는 적절한 스토리지 솔루션을 선택하고 구성하는 것이 중요합니다. 다양한 스토리지 종류와 특징을 이해하고 활용한다면, 쿠버네티스 환경에서 더욱 안정적이고 고성능의 서비스를 운영할 수 있을 것입니다.

다음 포스팅에서는 각 스토리지 종류에 대해 더욱 자세히 알아보고, 구체적인 구성 방법과 활용 사례를 다룰 예정입니다.

반응형

댓글