이전 강의에 나온 컨테이너 레이어에서의 데이터를 계속해서 보관하고 관리하고 싶을 경우 볼륨을 사용해야 한다.
PV와 PVC는 이 볼륨을 더 쉽게 관리하게 해준다.
관리자가 PVs라는 거대한 풀을 만들어놓고, 사용자는 PVC로 필요한 용량을 선택하여 사용한다.
거대한 PV를 나눠서 여러 PVC에 할당하여 사용할 수는 없다.
PV와 PVC는 1:1 관계이다. (pv : pvc = 1 : 1 )
manifest example
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-vol1
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
hostPath:
path: /tmp/dat
kubectl create -f {파일}
kubectl get pv
호스트에 볼륨이 어떻게 마운트 되어야 하는지 결정하는 것
ReadOnlyMany
ReadWriteOnce
ReadWriteMany
희망하는 PV의 전체 용량
볼륨의 형식을 지정
hostPath : 노드의 로컬 디렉토리를 사용하는 것 → 단일 노드에서만 지원됨, 운영에서 사용x, 대신 local 사용을 권장
local : 노드의 로컬 스토리지 장치
csi : container storage interface
등등
컨테이너 스토리지 관리를 위한 표준 인터페이스
CRI : container runtime interface
CNI : container network interface
CSI : container storage interface
manifest example
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
kubectl create -f {파일}
kubectl get pvc
이렇게 pvc가 생성되면 사용 가능한 pv를 찾아서 자동으로 바인딩 된다.
바인딩은 다른 k8s객체와 마찬가지로 label과 selector 를 통해 구현된다.
만약 사용 가능한 pv가 존재하지 않으면, 사용 가능한 pv와 바인딩될 때 까지 pending 상태로 머물러있는다.
kubectl delete pvc {pvc이름}
1
pvc가 삭제된 후 pv는 어떻게 될까?
PV의 persistentVolumeReclaimPolicy
로 설정한다.
Retain
(default) : pvc 삭제되어도 pv는 남아있음. 다만 다른 pvc에 재사용되지 않음. 관리자가 수동으로 삭제해야함
Delete
: pvc 삭제되는 순간, pv도 삭제됨
Recycle
: 더이상 사용되지 않음
2
Retain
모드일 경우 PVC 삭제
PVC가 Retain 모드일 경우 삭제되어도 여전히 파드에서 사용중인 상태이다.
그래서 pvc를 삭제해도 완전히 삭제되지 않고 삭제중 상태로 머무른다.
이 때 파드를 삭제하면 pvc도 삭제된다.
# pvc 삭제
controlplane ~ ➜ k delete pvc claim-log-1
persistentvolumeclaim "claim-log-1" deleted
# Terminating 상태 지속 - 파드가 pvc를 계속 사용하기 때문에
controlplane ~ ➜ k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
claim-log-1 Terminating pv-log 100Mi RWX 8m26s
# 파드 삭제
controlplane ~ ➜ k delete pod webapp
pod "webapp" deleted
# pvc 삭제 확인
controlplane ~ ➜ k get pvc
No resources found in default namespace.
# pv는 Release 상태 확인
controlplane ~ ➜ k get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-log 100Mi RWX Retain Released default/claim-log-1 15m
pod definition file에서 PVC를 생성하여 사용하는 방법
일반 Volume 사용법과 동일하다.
spec.volumes
에 미리 만들어 놓은 PVC 이름을 사용하여 볼륨을 생성하고
spec.containers.volumeMounts
에서 사용하면 된다.
파드뿐만 아니라 ReplicaSet, Deploy에도 같은 방식으로 사용한다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim: # 여기 작성
claimName: myclaim