티스토리 뷰

반응형

쿠버네티스 실습: PersistentVolume과 PersistentVolumeClaim으로 데이터 저장하기

앞선 글에서는 ConfigMap과 Secret을 이용해 환경 변수 및 보안 값 주입을 실습했습니다.
이번 글에서는 **PersistentVolume(PV)**과 **PersistentVolumeClaim(PVC)**을 통해 데이터가 사라지지 않는 스토리지를 연결하는 방법을 다룹니다.

컨테이너는 기본적으로 휘발성입니다. Pod가 삭제되면 그 안에 있던 데이터는 같이 사라집니다. 하지만 DB 같은 애플리케이션은 데이터 영속성이 필수입니다. 이를 해결하는 게 바로 PV/PVC 구조입니다.


1) 핵심 개념

  • PersistentVolume(PV): 클러스터에서 제공하는 스토리지 자원. (NFS, 클라우드 디스크, 로컬 디렉토리 등)
  • PersistentVolumeClaim(PVC): Pod가 스토리지를 요청하는 방식. PV에 연결됨.
  • Pod는 직접 PV를 쓰지 않고 PVC를 통해 접근합니다.

구조 이해:

Pod → PVC → PV → 실제 스토리지 (hostPath, NFS, AWS EBS, GCP Disk 등)

2) 로컬 PersistentVolume 생성

먼저, 맥미니에서 Minikube 환경이므로 로컬 경로(hostPath)를 이용해 PV를 만듭니다.

local-pv.yaml 작성:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data/k8s"

설명

  • capacity.storage: 1Gi 할당.
  • accessModes: ReadWriteOnce → 하나의 노드에서 읽기/쓰기 가능.
  • hostPath: 실제 노드(맥미니 내 Minikube VM)의 경로.

적용:

kubectl apply -f local-pv.yaml

확인:

kubectl get pv

3) PVC 생성

반응형

local-pvc.yaml 작성:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi

설명

  • Pod가 500Mi를 요청.
  • PV(local-pv)가 1Gi이므로 매칭되어 바인딩됨.

적용:

kubectl apply -f local-pvc.yaml
kubectl get pvc

예상 출력:

NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   AGE
local-pvc   Bound    local-pv   1Gi        RWO            5s

4) PVC를 사용하는 Pod 만들기

nginx-pv-pod.yaml 작성:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pv-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.27
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: html-volume
  volumes:
  - name: html-volume
    persistentVolumeClaim:
      claimName: local-pvc

적용:

kubectl apply -f nginx-pv-pod.yaml
kubectl get pods

Pod가 Running 상태가 되면 PVC가 자동으로 연결됩니다.


5) 데이터 쓰기 & 유지 확인

Pod 안으로 들어가서 데이터를 작성해봅니다.

kubectl exec -it nginx-pv-pod -- /bin/bash
echo "Hello Persistent Volume!" > /usr/share/nginx/html/index.html
exit

브라우저에서 접속:

kubectl port-forward pod/nginx-pv-pod 8080:80

http://localhost:8080 에 접속 → “Hello Persistent Volume!” 출력 확인.

이제 Pod를 삭제합니다:

kubectl delete pod nginx-pv-pod

다시 같은 Pod를 올리고 접속해보면 데이터가 그대로 유지됩니다.


6) 구조 이해

  • Pod 삭제 후 재생성해도 데이터 유지: PVC가 동일한 PV를 계속 참조하기 때문.
  • 운영 환경에서는 hostPath 대신:
    • 클라우드(예: AWS EBS, GCP Persistent Disk)
    • 네트워크 스토리지(NFS, Ceph, GlusterFS 등)
      를 주로 사용합니다.

7) 정리

  • PV는 클러스터의 스토리지 풀, PVC는 Pod의 스토리지 요청.
  • Pod는 PVC를 통해 PV에 연결.
  • 데이터 영속성을 확보해야 DB, 로그 저장소 등에 활용 가능.

다음 글에서는 StatefulSet을 사용해 PostgreSQL 데이터베이스를 쿠버네티스 위에 배포하고, PVC를 붙여 데이터가 유지되도록 만드는 실습을 진행합니다.


 

쿠버네티스,PersistentVolume,PersistentVolumeClaim,PV,PVC,데이터영속성,쿠버네티스스토리지,Minikube,컨테이너스토리지,K8s튜토리얼

 

 

1) hostPath 기반 PV의 한계와 주의점 (Minikube 환경)

Minikube는 hostPath 타입의 PV를 기본으로 지원하지만, 실제로는 Minikube VM 내부의 경로와 연결된다는 점을 이해해야 합니다.

  • Minikube는 hostPath 볼륨을 Minikube VM 내부의 디렉토리에 매핑합니다. 즉, /data, /var/lib/minikube, /tmp/hostpath_pv 등의 경로에 저장된 데이터가 재부팅 이후에도 지속적으로 유지됩니다.
    (Reddit, minikube)
  • 하지만 /data/k8s처럼 사용자가 지정한 경로는 해당 디렉토리가 Minikube VM 내부에 미리 생성되어 있거나, Minikube가 접근할 수 있는 방식으로 연결되어 있어야 합니다. 단순히 macOS 호스트의 디렉토리를 지정하면 Minikube VM 내에 해당 경로가 없어 매핑되지 않거나, 데이터가 사라지는 상황이 발생할 수 있습니다.
    (Stack Overflow)

따라서 다음 두 가지 중 하나로 실습을 확실하게 구성하는 것이 좋습니다:

A) Minikube 내부에 있는 /data 경로 이용

Minikube가 이미 유지 보수 대상으로 지정한 경로(/data)를 활용하면, VM 내부에서 안정적으로 데이터를 유지할 수 있습니다.
예시:

hostPath:
  path: "/data/pv-example"

B) minikube mount 기능을 사용

macOS 호스트의 디렉토리를 Minikube VM에 연결하려면 minikube mount를 활용할 수 있습니다.

minikube mount <호스트경로>:<VM 내부 경로>

이후 hostPath에 해당 VM 내부 경로를 지정하면, 호스트와 PV 간 파일 동기화가 이루어져 개발 편의성이 올라갑니다.
(Stack Overflow, minikube)


2) 동적 프로비저닝(Dynamic Provisioning) 기능 활용 가능성

Minikube는 단순 hostPath 외에도 Dynamic Provisioning 기능을 내장하고 있어, StorageClass 기반 PVC 생성으로 PV가 자동할당되는 구조를 실습할 수 있습니다.

  • Minikube는 자체적으로 동작하는 기본 Storage Provisioner를 내장하고 있어, 특별한 설정 없이 PVC만 만들면 PV를 자동으로 생성 및 바인딩합니다.
    (Platform9, Medium)

이는 실습의 생동감을 높이고, 클라우드 환경에서 사용하는 방식과 동일한 흐름으로 연습할 수 있다는 장점이 있습니다.


3) 권장 보완 요약

항목 제안 및 설명

PV hostPath 설정 경로 /data 등 Minikube VM 내부 경로 사용하는 것을 권장
호스트 디렉토리 연동 minikube mount + hostPath 방식으로 연동 시 실습 편의성↑
자동 PV 생성 실습 StorageClass 기반 PVC로 동적 프로비저닝 예시 추가로 내용 강화
데이터 유지 확인 Pod 재생성 후에도 데이터 유지되는 흐름 명확히 강조

정리

  • Minikube 환경이기 때문에 hostPath는 Minikube VM 내부 경로에 매핑된다는 사실을 명확히 해야 합니다.
  • macOS의 특정 디렉토리 사용이 필요하다면 minikube mount 기능을 꼭 활용하도록 안내하는 것이 좋습니다.
  • Dynamic Provisioning 지원을 활용하면, 클라우드 환경과 유사한 PV/PVC 흐름 실습이 가능해져 학습 효과가 큽니다.

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함
반응형