- Published on
7단계: Volume과 PVC
Kubernetes에서 저장소가 필요한 이유
- 컨테이너는 기본적으로 휘발성 스토리지 사용 → 재시작 시 데이터 소멸
- 로그, DB, 업로드 파일 등을 위해 영구 저장소(Volume) 필요
Volume의 종류
- emptyDir: Pod가 실행될 때 빈 디렉토리 생성 (비영구적)
- hostPath: 호스트 디렉토리를 공유 (학습/테스트 용도)
- PersistentVolume(PV): 클러스터 내 공유 가능한 스토리지 리소스
- PersistentVolumeClaim(PVC): Pod가 원하는 볼륨을 요청하는 객체
PVC 실습 예시
(1) PV + PVC 정의
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
(2) Pod에 연결
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: test-container
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: storage
volumes:
- name: storage
persistentVolumeClaim:
claimName: mypvc
확인
kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml
kubectl apply -f pod.yaml
kubectl exec -it volume-test -- /bin/bash
echo "Hello" > /usr/share/nginx/html/index.html
요약
- PV: 클러스터 관리자가 제공하는 저장소
- PVC: 사용자가 요청하는 저장소
- Pod는 PVC를 통해 저장소를 할당받아 사용하며, 데이터 유지가 가능하다
심화학습
Q1: PVC가 바인딩되기 위해 PV와 어떤 조건이 맞아야 할까?
A: storage 크기
, accessModes
, storageClass
조건이 모두 일치해야 PVC와 PV가 바인딩된다.
Q2: hostPath는 왜 실무에서 권장되지 않을까?
A: 호스트 노드에 종속되어 이동성과 확장성이 떨어지고, 여러 Pod가 다른 노드에서 실행될 경우 파일 접근이 불가능하다.
Q3: Pod 삭제 후 PVC는 유지되지만 PV는 삭제될 수 있을까?
A: persistentVolumeReclaimPolicy
가 Delete
일 경우, PVC가 삭제되면 PV도 함께 삭제된다. 반대로 Retain
이면 수동으로 삭제해야 한다.