티스토리 뷰
쿠버네티스 실습: PersistentVolume과 PersistentVolumeClaim으로 데이터 저장하기
octo54 2025. 8. 25. 10:33쿠버네티스 실습: 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 흐름 실습이 가능해져 학습 효과가 큽니다.
'project > 맥미니로 시작하는 쿠버네티스' 카테고리의 다른 글
| 쿠버네티스 실습: Redis 배포와 NestJS 애플리케이션 연동 (0) | 2025.08.27 |
|---|---|
| 쿠버네티스 실습: StatefulSet으로 PostgreSQL 배포하기 (PVC 연동) (0) | 2025.08.26 |
| 쿠버네티스 실습: ConfigMap과 Secret으로 환경 설정 관리하기 (0) | 2025.08.22 |
| 쿠버네티스 실습: YAML 매니페스트로 Nginx 배포하기 (0) | 2025.08.21 |
| 쿠버네티스 첫 걸음: 맥미니에서 로컬 클러스터 시작하기 (Minikube + kubectl 완전 실습) (0) | 2025.08.20 |
- Total
- Today
- Yesterday
- JWT
- Express
- 개발블로그
- nextJS
- 생성형AI
- Docker
- flax
- DevOps
- kotlin
- rag
- 쿠버네티스
- 백엔드개발
- llm
- REACT
- JAX
- CI/CD
- seo 최적화 10개
- node.js
- 딥러닝
- LangChain
- PostgreSQL
- Prisma
- SEO최적화
- Redis
- fastapi
- Python
- NestJS
- 웹개발
- Next.js
- ai철학
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |

