
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
| 필드 | 설명 |
|---|---|
accessModes | PV와 일치해야 바인딩 가능 |
resources.requests.storage | 필요한 스토리지 용량 |
PVC가 PV와 바인딩 되려면 아래 조건이 모두 충족되어야 해:
| 조건 | 설명 |
|---|---|
| Access Mode | 예: PVC가 RWO 요청 시 PV도 RWO 이상이어야 함 |
| Storage ≥ 요청 용량 | 예: PVC 500Mi → PV 1Gi 매칭 가능 |
| VolumeMode | (선택사항) Filesystem or Block |
| StorageClass | (선택사항) 동일한 StorageClass이거나 둘 다 없음 |
Pending 상태로 남는다Bound, PV 상태도 Bound로 변경됨PVC를 삭제하면 PV는 다음 세 가지 중 하나의 방식으로 처리됨:
| 정책 (ReclaimPolicy) | 동작 설명 |
|---|---|
Retain (기본값) | PV는 그대로 유지, 수동 정리 필요 |
Delete | PVC 삭제 시 PV도 삭제 (볼륨, 스토리지 자체도 제거) |
Recycle (구버전) | PV 내용 초기화 후 재사용 가능하게 설정 (현재는 폐기됨) |
# PVC 생성
kubectl create -f pvc.yaml
# PVC 및 PV 상태 확인
kubectl get pvc
kubectl get pv
PVC 상태가 Bound로 바뀌면 정상 바인딩됨PV 상태도 Bound로 바뀌어 있어야 함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)
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 | 컨테이너 내에서 해당 볼륨을 마운트할 경로 |
| 〃 | name | spec.volumes[].name과 일치해야 함 |
spec.volumes[] | name | 볼륨 이름. volumeMounts[].name에서 참조됨 |
| 〃 | persistentVolumeClaim.claimName | 마운트할 PVC의 이름 |
PodSpec이 들어가는 곳이라면 어디서든 사용 가능해. 예: Deployment, ReplicaSet, StatefulSet, Job, CronJob 등.
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
volumes와 volumeMounts를 함께 구성해야 함mountPath는 컨테이너 내부 경로이며 실제 PVC는 Pod 외부의 볼륨으로 연결됨