Kubernetes Volume - PV & PVC
목차
- PV object로 Storage를 추상화하고 PVC object로 Storage를 할당받아 사용
- PV(Persistent Volume)는 관리자나 StorageClass에 의해 생성되는 Volume
- PVC(PV Claim)는 사용자가 Volume을 사용하기 위해 PV에 요청

Provisioning
- PV를 만드는 단계
- PV를 미리만들고 사용하는 정적(static)방법과 요청이 있을때 만드는 동적(dynamic)방법이 있다.
Binding
- PV를 PVC와 연결하는단계
- PVC는 스토리지 용량과 접근방법에따라 PV와 연결, 대응되는 PV가 없으면 대응되는 PV가 생성될때까지 Pending
- PV와 PVC는 1:1 관계
Using
- Pod에서 PVC를 통해 PV의 볼륨으로 인식하고 사용하는 단계
Reclaiming(회수)
- 사용이 끝난 PVC가 초기화 되는 단계
- Retain: PVC 삭제 → PV Status(bound → Released)로 바뀌며 다른 PVC가 연결 될 수 없는 상태. PV 속 데이터는 유지
- Delete: PVC 삭제 → PV 삭제
- Recycle: PVC 삭제 → PV Status(bound → Pending)로 바뀜, 다른 PVC 대기
accessMode
- PV 생성시 설정하는 접근 권한
- ROX(ReadOnlyMany) - 읽기만 가능, 모든 노드 접근 가능
- RWX(ReadWriteMany) - 읽기, 쓰기, 모든 노드 접근 가능
- RWO(ReadWriteOnce) - 읽기, 쓰기, 단일노드
PV123.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1G
accessModes:
- ReadWriteOnce
local:
path: /data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
capacity:
storage: 1G
accessModes:
- ReadOnlyMany
local:
path: /data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv3
spec:
capacity:
storage: 2G
accessModes:
- ReadWriteMany
local:
path: /data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}PVC1234.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
accessModes:
- ReadOnlyMany
resources:
requests:
storage: 1G
#PV2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc2
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1G
#pv1
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc3
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5G
#Pending
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc4
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1G
#pv?테스트
$ kubectl apply -f pv123.yaml
$ kubectl apply -f pvc1234.yaml
$ kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pv1 1G RWO Retain Bound default/pvc2 4m10s
persistentvolume/pv2 1G ROX Retain Bound default/pvc1 4m10s
persistentvolume/pv3 2G RWX Retain Bound default/pvc4 4m10s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/pvc1 Bound pv2 1G ROX 3m55s
persistentvolumeclaim/pvc2 Bound pv1 1G RWO 3m55s
persistentvolumeclaim/pvc3 Pending 3m55s
persistentvolumeclaim/pvc4 Bound pv3 2G RWX 3m55s사용
apiVersion: v1
kind: Pod
metadata:
name: mynode-pod
spec:
containers:
- image: nginx:1.24.0
name: pv-pvc-pvccontainer
ports:
- containerPort: 80
volumeMounts:
- name: pvc-path
mountPath: /pvc-data
volumes:
- name: pvc-path
persistentVolumeClaim:
claimName: pvc1라벨을 사용한 지정
- 라벨을 통해 직접 연결 할 수 있다.
pv-pvc-label.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv4
labels:
name: pv4
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
local:
path: /data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: label-pv
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: ""
selector:
matchLabels:
name: pv4기타 (NFS PV)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 1G
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
mountOptions:
- hard
nfs:
path: /DATA1
server: 10.10.10.90