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

💾 내 데이터는 소중하니까! 쿠버네티스 영구 저장소 (PV, PVC) 완전 정복 (CKAD 대비)

by gasbugs 2025. 9. 3.

안녕하세요! 쿠버네티스를 공부하는 모든 개발자분들을 응원합니다. 🙏

CKAD 자격증을 준비하거나, 쿠버네티스 환경에 실제 애플리케이션을 배포하다 보면 한 가지 중요한 질문에 부딪히게 됩니다. "Pod가 사라지면 내 데이터는 어떻게 되는 거지?"

 

오늘은 이 질문에 대한 명쾌한 해답이자, CKAD 시험의 핵심 주제인 애플리케이션 데이터 영구 저장(State Persistence)에 대해 깊이 알아보겠습니다. 바로 PersistentVolume(PV)와 PersistentVolumeClaim(PVC)의 세계로 떠나볼까요? 🚀

 


🤔 영구 스토리지, 왜 필요할까?

쿠버네티스의 가장 큰 특징 중 하나는 'Pod는 영원하지 않다'는 것입니다. Pod는 필요에 따라 언제든지 생성되고, 삭제되고, 다른 노드로 옮겨갈 수 있습니다. 마치 일회용 컵처럼 말이죠.

  • Stateless (상태 없음) 애플리케이션: 웹 서버처럼 이전 요청을 기억할 필요가 없는 앱들은 Pod가 사라져도 괜찮습니다. 새로운 Pod가 떠서 요청을 처리하면 그만이니까요.
  • Stateful (상태 있음) 애플리케이션: 하지만 데이터베이스, 메시지 큐, 파일 업로드 서버처럼 데이터를 어딘가에 계속 저장하고 기억해야 하는 앱들은 어떨까요? 사용자가 올린 소중한 사진 파일, 데이터베이스에 저장된 고객 정보가 Pod와 함께 사라진다면 끔찍한 일이 벌어질 겁니다. 😱

이처럼 Pod의 수명 주기와 관계없이 데이터를 영구적으로 보존하기 위해 쿠버네티스는 '영구 스토리지'라는 개념을 제공합니다. Pod가 사라져도 데이터는 안전한 외부 공간에 남아있게 하는 것이죠.


🤝 PV와 PVC, 환상의 짝꿍을 만나다

"데이터를 외부에 저장해야 한다는 건 알겠어. 그럼 어떻게 연결하는데?"

여기서 바로 쿠버네티스의 추상화 개념이 빛을 발합니다. 개발자가 AWS의 EBS, GCP의 Persistent Disk, 사내의 NFS 서버 등 특정 스토리지 기술에 종속되지 않도록 PVPVC라는 두 가지 오브젝트로 역할을 분리했습니다.

도서관을 예로 들어볼까요? 📚

  • PersistentVolume (PV): 도서관의 '책' 자체입니다. 클러스터 관리자가 미리 준비해 둔 실제 저장 공간이죠. 이 책(PV)은 "나는 10GB 용량이고, 한 명만 읽고 쓸 수 있어" 같은 속성을 가집니다.
  • PersistentVolumeClaim (PVC): 사용자가 책을 빌리기 위해 작성하는 '대출 신청서'입니다. 개발자는 "나는 약 5GB 정도의 공간이 필요하고, 읽고 쓰기가 가능해야 해"라고 요청(Claim)합니다.

쿠버네티스는 이 '대출 신청서(PVC)'를 보고, 조건에 맞는 '책(PV)'을 찾아 서로 연결(Bind)해 줍니다. 이 과정을 통해 개발자는 복잡한 스토리지 인프라를 몰라도 필요한 만큼의 저장 공간을 할당받아 사용할 수 있습니다.

1. PersistentVolume (PV): 클러스터의 '저장 공간'

PV는 클러스터 관리자의 영역입니다. 관리자는 물리적인 스토리지(NFS, iSCSI, 클라우드 스토리지 등)를 클러스터에서 사용할 수 있도록 PV 리소스로 등록합니다.

주요 속성:

  • capacity: 저장 공간의 크기 (예: 5Gi, 100Mi)
  • accessModes: 접근 방식
    • ReadWriteOnce (RWO): 단일 노드에서만 읽고 쓰기 가능 (가장 일반적)
    • ReadOnlyMany (ROX): 여러 노드에서 읽기만 가능
    • ReadWriteMany (RWX): 여러 노드에서 읽고 쓰기 가능 (NFS 등 일부 스토리지에서만 지원)
  • persistentVolumeReclaimPolicy: PVC와의 연결이 해제되었을 때 PV를 어떻게 처리할지 정책
    • Retain: PV를 그대로 보존 (데이터도 유지됨, 수동 정리 필요)
    • Delete: PV와 외부 스토리지의 데이터까지 모두 삭제
    • Recycle: (Deprecated) 데이터를 삭제하고 다시 사용할 수 있도록 준비

2. PersistentVolumeClaim (PVC): 개발자의 '저장 공간 요청서'

PVC는 개발자의 영역입니다. Pod에 연결할 저장 공간이 필요할 때 PVC를 통해 쿠버네티스에 요청합니다.

 

YAML 예시:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-app-pvc
spec:
  accessModes:
    - ReadWriteOnce # 이런 접근 모드를 원해요.
  resources:
    requests:
      storage: 1Gi # 최소 1Gi의 공간이 필요해요.

이렇게 PVC를 생성하면, 쿠버네티스는 이 조건에 맞는 PV를 찾아 자동으로 바인딩해줍니다.


🔌 Pod에서 PVC 사용하기: 내 앱에 영구 볼륨 연결하기

이제 대출한 책(바인딩된 PV-PVC)을 내 책상(Pod) 위에 올려놓고 사용할 차례입니다. Pod 명세서에 두 가지 설정을 추가하면 됩니다.

  1. spec.volumes: Pod가 사용할 볼륨 목록을 정의합니다. "나는 my-app-pvc라는 이름의 PVC를 볼륨으로 사용할 거야"라고 선언하는 부분입니다.
  2. spec.containers.volumeMounts: 위에서 선언한 볼륨을 컨테이너 내부의 어떤 경로에 연결할지(마운트할지) 지정합니다. "그 볼륨을 내 컨테이너의 /app/data 폴더에 연결해 줘"라고 구체적으로 명시하는 것이죠.

Pod YAML 예시:

apiVersion: v1
kind: Pod
metadata:
  name: my-app-pod
spec:
  containers:
    - name: my-app-container
      image: nginx
      ports:
        - containerPort: 80
      # 2. 'my-app-storage' 볼륨을 컨테이너의 /usr/share/nginx/html 경로에 연결
      volumeMounts:
        - name: my-app-storage 
          mountPath: /usr/share/nginx/html
  # 1. 'my-app-storage'라는 이름의 볼륨을 정의하고, 'my-app-pvc' PVC와 연결
  volumes:
    - name: my-app-storage
      persistentVolumeClaim:
        claimName: my-app-pvc 

데이터가 정말 유지되는지 확인해 볼까요?

  1. 위 PVC와 Pod를 순서대로 클러스터에 배포합니다. (kubectl apply -f ...)
  2. exec 명령어로 실행 중인 Pod에 접속합니다.
    kubectl exec -it my-app-pod -- /bin/bash
    
  3. 마운트한 경로로 이동해 파일을 하나 생성합니다.
    # Pod 내부에서 실행
    cd /usr/share/nginx/html
    echo "My data is safe!" > index.html
    exit
    
  4. 이제 Pod를 과감하게 삭제합니다.
    kubectl delete pod my-app-pod
    
  5. 잠시 후, 동일한 YAML 파일로 Pod를 다시 생성합니다. (PVC는 그대로 두세요!)
    kubectl apply -f <pod-definition-file.yaml>
    
  6. 새로 생성된 Pod에 다시 접속해서 파일을 확인해 보세요."My data is safe!" 메시지가 그대로 출력되는 것을 볼 수 있습니다! Pod는 바뀌었지만 데이터는 PVC에 연결된 영구 스토리지에 안전하게 보관되었기 때문입니다. 🎉
    kubectl exec -it my-app-pod -- /bin/bash
    cat /usr/share/nginx/html/index.html
    

정리하며

오늘은 쿠버네티스에서 애플리케이션의 소중한 데이터를 지키는 방법, PV와 PVC에 대해 알아보았습니다.

  • 핵심 요약: Pod는 일회용이지만 데이터는 영구적이어야 한다!
  • 역할 분리: 관리자는 저장 공간(PV)을 준비하고, 개발자는 필요한 만큼 요청(PVC)한다.
  • 연결 방법: Pod는 PVC를 volumes와 volumeMounts를 통해 자신의 파일 시스템에 연결하여 사용한다.

이 개념은 상태 유지가 필요한 모든 애플리케이션을 쿠버네티스에 안정적으로 배포하기 위한 필수 지식이자, CKAD 시험의 단골 출제 문제입니다. 꼭 직접 실습해보며 손에 익혀두시길 바랍니다!


태그: 쿠버네티스, Kubernetes, CKAD, PV, PVC, PersistentVolume, PersistentVolumeClaim, 영구볼륨, 스토리지, 상태유지, Stateful