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: persistentVolumeReclaimPolicyDelete일 경우, PVC가 삭제되면 PV도 함께 삭제된다. 반대로 Retain이면 수동으로 삭제해야 한다.