Persistent Volume Claims

Yu Sang Min·2025년 6월 23일

CKA

목록 보기
71/110
post-thumbnail

📌 Persistent Volume Claim(PVC) 핵심 정리


1. 🎯 목적

  • 사용자(User) 가 Persistent Volume(PV) 중에서 원하는 조건의 스토리지를 "요청(Claim)"하기 위한 객체
  • 사용자는 StorageClass, AccessMode, 용량만 명시하면 됨

2. 🧱 PVC 예제 구조

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
필드설명
accessModesPV와 일치해야 바인딩 가능
resources.requests.storage필요한 스토리지 용량

3. 🔄 PVC → PV 바인딩 조건

PVC가 PV와 바인딩 되려면 아래 조건이 모두 충족되어야 해:

조건설명
Access Mode예: PVC가 RWO 요청 시 PV도 RWO 이상이어야 함
Storage ≥ 요청 용량예: PVC 500Mi → PV 1Gi 매칭 가능
VolumeMode(선택사항) Filesystem or Block
StorageClass(선택사항) 동일한 StorageClass이거나 둘 다 없음

4. ⚠️ 바인딩 관련 주요 포인트

  • 작은 PVC큰 PV에 바인딩될 수 있다 → 하지만 남은 용량은 다른 PVC가 사용할 수 없다 (1:1 바인딩)
  • 바인딩 안 되면 Pending 상태로 남는다
  • 바인딩되면 PVC 상태는 Bound, PV 상태도 Bound로 변경됨

5. 🔧 PVC 삭제 시 PV 동작 (Reclaim Policy)

PVC를 삭제하면 PV는 다음 세 가지 중 하나의 방식으로 처리됨:

정책 (ReclaimPolicy)동작 설명
Retain (기본값)PV는 그대로 유지, 수동 정리 필요
DeletePVC 삭제 시 PV도 삭제 (볼륨, 스토리지 자체도 제거)
Recycle (구버전)PV 내용 초기화 후 재사용 가능하게 설정 (현재는 폐기됨)

6. 🧪 실습 흐름 요약

# PVC 생성
kubectl create -f pvc.yaml

# PVC 및 PV 상태 확인
kubectl get pvc
kubectl get pv
  • PVC 상태Bound로 바뀌면 정상 바인딩됨
  • PV 상태Bound로 바뀌어 있어야 함

7. 🌍 고급 바인딩 방식: Label + Selector

PVC에서 특정 PV를 선택적으로 매칭하고 싶다면, PV에 Label을 설정하고 PVC에 Selector로 조건 지정 가능:

# PVC 예시
spec:
  selector:
    matchLabels:
      storage-tier: gold

🧠 전체 흐름 시각화

[ Admin ]                  [ User ]
   ⬇                          ⬇
Create PV                Create PVC
   ⬇                          ⬇
     Kubernetes Scheduler: Match PV & PVC
                    ⬇
               Bind (1:1)

📦 PVC를 Pod에 마운트하는 구조

✅ 구성 예시:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: myfrontend
      image: nginx
      volumeMounts:              # ① 컨테이너 안에 마운트 위치 지정
        - mountPath: "/var/www/html"
          name: mypd             # volumes 아래 정의된 볼륨 이름 참조
  volumes:                       # ② Pod 수준에서 볼륨 정의
    - name: mypd
      persistentVolumeClaim:
        claimName: myclaim       # PVC 이름 지정

📌 핵심 구성요소 설명

위치필드설명
spec.containers[].volumeMounts[]mountPath컨테이너 내에서 해당 볼륨을 마운트할 경로
namespec.volumes[].name과 일치해야 함
spec.volumes[]name볼륨 이름. volumeMounts[].name에서 참조됨
persistentVolumeClaim.claimName마운트할 PVC의 이름

🔁 Deployment/ReplicaSet에서도 동일하게 사용

PodSpec이 들어가는 곳이라면 어디서든 사용 가능해. 예: Deployment, ReplicaSet, StatefulSet, Job, CronJob 등.

Deployment 예시:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:                            # Pod 템플릿
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - name: mypd
              mountPath: /usr/share/nginx/html
      volumes:
        - name: mypd
          persistentVolumeClaim:
            claimName: myclaim

🔗 참고 문서

🔹 Kubernetes Docs - Claims as Volumes


🧠 보충 개념 요약

  • PVC는 Pod가 사용할 수 있는 추상화된 스토리지 요청 객체
  • Pod에 연결할 때는 반드시 volumesvolumeMounts를 함께 구성해야 함
  • 마운트 경로인 mountPath는 컨테이너 내부 경로이며 실제 PVC는 Pod 외부의 볼륨으로 연결됨
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글