본문 바로가기
클라우드/쿠버네티스

[CKAD] 내 데이터는 소중하니까! 영구 볼륨(PV/PVC)과 임시 볼륨(emptyDir) 완벽 정리

by gasbugs 2026. 2. 5.

안녕하세요! 오늘은 쿠버네티스 애플리케이션 개발자라면 반드시 넘어야 할 산, 볼륨(Volume)에 대해 알아보겠습니다. 쿠버네티스의 파드(Pod)는 언제든 죽고 다시 살아날 수 있는 '일시적인' 존재입니다. 그렇다면 그 안에 저장된 데이터는 어떻게 될까요? 파드가 죽어도 데이터를 살릴 방법, 그리고 잠깐 쓰고 버릴 데이터를 효율적으로 관리하는 방법을 15분 만에 마스터해 봅시다!

 


📑 목차

  1. 개요: 왜 볼륨이 필요한가? (Stateless vs Stateful)
  2. 임시 볼륨의 대명사: emptyDir
  3. 영구 데이터의 핵심: PV(Persistent Volume)와 PVC(Claim)
  4. 동적 공급의 마법: StorageClass
  5. CKAD 실전 팁: 볼륨 설정 시 자주 하는 실수들
  6. Hands-on: 실전 연습 문제

0. 개요: 왜 볼륨이 필요한가? 🤔

쿠버네티스 파드 내의 컨테이너는 기본적으로 **휘발성(Ephemeral)**입니다. 컨테이너가 충돌해서 재시작되면, 실행 중에 생성된 모든 파일은 사라집니다.

  • 임시 볼륨: 파드가 실행되는 동안만 데이터가 유지되면 되는 경우 (예: 캐시, 스크래치 공간). 파드가 삭제되면 데이터도 함께 삭제됩니다.
  • 영구 볼륨: 파드가 삭제되어도 데이터는 클러스터 외부(클라우드 스토리지, NFS 등)에 안전하게 보관되어야 하는 경우 (예: 데이터베이스, 사용자 업로드 파일).

1. 임시 볼륨의 대명사: emptyDir 🧹

emptyDir은 파드가 노드에 할당될 때 처음 생성되며, 해당 파드가 그 노드에서 실행되는 동안에만 존재합니다.

  • 특징: 파드 내의 모든 컨테이너가 공유할 수 있습니다. 한 컨테이너가 쓰고 다른 컨테이너가 읽는 '사이드카' 패턴에서 자주 쓰입니다.
  • 주의: 파드가 노드에서 제거(삭제)되면 emptyDir의 데이터도 영구히 삭제됩니다.

💡 emptyDir YAML 예시

apiVersion: v1
kind: Pod
metadata:
  name: sidecar-pod
spec:
  containers:
  - name: main-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html
  - name: helper-container
    image: busybox
    command: ["/bin/sh", "-c", "while true; do date >> /data/index.html; sleep 5; done"]
    volumeMounts:
    - name: shared-data
      mountPath: /data
  volumes:
  - name: shared-data
    emptyDir: {} # 여기에 설정!

2. 영구 데이터의 핵심: PV와 PVC 💾

대기업 환경이나 운영 환경에서는 데이터 보존이 필수입니다. 이를 위해 쿠버네티스는 PV(Persistent Volume)와 PVC(Persistent Volume Claim)라는 두 가지 리소스를 사용합니다.

  • PV (Persistent Volume): 실제 저장 공간(SSD, NFS 등)을 정의합니다. 인프라 관리자가 미리 준비해두는 '실제 파이'와 같습니다.
  • PVC (Persistent Volume Claim): 개발자가 "나 이 정도 용량의 저장 공간이 필요해!"라고 요청하는 '주문서'입니다.

💡 핵심 파라미터: AccessModes

  • ReadWriteOnce (RWO): 하나의 노드에서만 읽기/쓰기 가능.
  • ReadOnlyMany (ROX): 여러 노드에서 읽기만 가능.
  • ReadWriteMany (RWX): 여러 노드에서 동시에 읽기/쓰기 가능 (NFS 등에서 지원).

3. 동적 공급의 마법: StorageClass ✨

매번 관리자가 PV를 미리 만들어두는 것은 비효율적입니다. 그래서 실무(특히 대기업이나 클라우드 환경)에서는 StorageClass를 사용합니다.

개발자가 PVC에 특정 storageClassName을 적어서 요청하면, 쿠버네티스가 클라우드 업체(AWS, GCP, Azure 등)에 요청해 실시간으로 PV를 생성해 줍니다. 이를 **동적 공급(Dynamic Provisioning)**이라고 합니다.


4. CKAD 실전 팁: 시간 단축과 실수 방지 ⏱️

시험에서 볼륨 문제는 설정할 내용이 많아 오타가 나기 쉽습니다.

  1. 두 군데 모두 적기: spec.volumes에서 볼륨을 정의하고, 반드시 컨테이너 안의 spec.containers.volumeMounts에서 연결해 줘야 합니다. 하나라도 빠지면 파드는 ContainerCreating에서 넘어가지 않습니다.
  2. AccessMode 일치: PV와 PVC의 accessModes가 서로 일치해야 바인딩(Binding)이 됩니다.
  3. 빠른 YAML 생성: 볼륨 설정은 명령어로 다 하기 어렵습니다. 기본 파드 YAML을 뽑은 뒤 볼륨 부분만 직접 타이핑하세요.

5. Hands-on: 실전 연습 문제 🛠️

시나리오:

  1. 이름이 safedata-pvc인 PVC를 생성하세요. (용량: 1Gi, 모드: ReadWriteOnce, StorageClass: standard)
  2. nginx 이미지를 사용하고 이름이 data-app인 파드를 만드세요.
  3. 생성한 PVC를 파드의 /var/www/html 경로에 마운트하세요.

[풀이 가이드]

# 1. PVC 생성 (pvc.yaml)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: safedata-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: standard
---
# 2. Pod 생성 (pod.yaml)
apiVersion: v1
kind: Pod
metadata:
  name: data-app
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: storage-vol
      mountPath: /var/www/html
  volumes:
  - name: storage-vol
    persistentVolumeClaim:
      claimName: safedata-pvc

마무리하며 🏁

볼륨은 쿠버네티스 아키텍처에서 "인프라의 복잡함을 개발자로부터 숨기는" 가장 멋진 기능 중 하나입니다. emptyDir로 효율적인 협업 파드를 만들고, PV/PVC로 안전한 데이터 저장소를 구축해 보세요.

오늘 배운 내용이 여러분의 CKAD 합격과 실무 역량 강화에 큰 도움이 되길 바랍니다! 🌟