Volume ?#
volume 개념#
- 컨테이너 내 파일은 stateless 하기 때문에 데이터 보존이 필요한 경우 Volume을 사용해야함
- kubernetes에서 Volume은 Pod 에 종속되어 같은 Pod에 있는 container들은 volume을 공유함
- Volume type에는 아래와 같은 여러 방식이 있음
- emptyDir : Pod 와 함께 생성되고 Pod가 종료될 때 같이 삭제되는 임시볼륨
- hostPath : Pod가 속한 node의 로컬 디스크의 디렉토리를 Pod에 마운트 해서 사용함, 동일 node에서 Pod이 재생성 되는 경우엔 데이터 보존이 가능하나 node가 달라지면 데이터 보존이 불가능함
- nfs : 기존 NFS (네트워크파일시스템) 처럼 여러 Pod에서 동시에 마운트 할 수 있는 볼륨
PV / PV 개념#
- PV (Persistent Volume) : Pod에 종속적인 volume과는 달리 PV는 그 자체로 kubernetes cluster의 resource로 관리됨. Pod의 수명주기와는 관계 없이 독립적이기 때문에 Pod가 재시작되거나, 다른 node로 migration 되어도 상관없이 PV는 유지됨 ToastCloud 를 사용하는 경우 하나의 PV는 하나의 ToastCloud Block Storage와 연결됨
- PVC (Persistent Volume Claim) : 필요한 볼륨의 요구사항에 대한 정의서로 용량, 읽기/쓰기 모드 등을 정의하면 조건을 만족하는 PV를 가져다 binding 함
- static provisioning : 사용자가 직접 PV를 미리 준비해야 하며 PVC 를 통해 PV를 요청했을 때 조건에 맞는 PV 가 없을 땐 사용 불가
- dynamic provisioning : storageClass 에 정의된 속성을 참조하여 PVC의 요청이 있을 때 동적으로 PV를 생성하여 PVC에 binding 함
PV /PVC 생명 주기#
- PV, PVC 에는 위와 같은 Pod 독릭접인 생명주기가 있음
- Provisioning : PV를 만드는 단계 , static / dynamic 방식으로 나뉨
- Binding : Provisioning 단계를 거쳐 생성된 PV를 PVC와 1:1 로 연결하는 단계, PVC에서 원하는 스토리지의 용량과 스펙을 명시해서 요청하면 알맞은 PV가 할당되며 없으면 요청은 pending 상태로 빠짐.
- Using : PVC가 Pod에 할당되고, Pod는 PVC를 Volume으로 인식해서 사용하는 상태, 할당된 PVC는 임의로 삭제될 수 없고 보호됨 ( Storage Object in Use Protection )
- Reclaiming : 사용이 끝난 PVC가 삭제되어 PV를 초기화하는 단계
PV / PVC 사용 현황#
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-10412da7-46bb-43e0-b791-a810774b7c87 2Gi RWO Delete Bound default/redis-data-kimdubi-test-redis-cluster-1 kimdubi-test 2d4h
pvc-3b7c88ff-6e56-428a-885f-58301e05478f 2Gi RWO Delete Bound default/redis-data-kimdubi-test-redis-cluster-0 kimdubi-test 2d4h
pvc-6a5aa328-8ca2-4450-a308-1c07cc7aab60 2Gi RWO Delete Bound default/redis-data-kimdubi-test-redis-cluster-2 kimdubi-test 2d4h
pvc-92e41155-d644-4799-b974-2a35c19ada8b 2Gi RWO Delete Bound default/redis-data-kimdubi-test-redis-cluster-4 kimdubi-test 2d4h
pvc-b198c891-2d0c-474e-9113-2ad0f198a336 2Gi RWO Delete Bound default/redis-data-kimdubi-test-redis-cluster-3 kimdubi-test 2d4h
pvc-b2fe7621-e748-4cc7-aa4c-2efee2fc0cd8 2Gi RWO Delete Bound default/redis-data-kimdubi-test-redis-cluster-5 kimdubi-test 2d4h
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
redis-data-kimdubi-test-redis-cluster-0 Bound pvc-3b7c88ff-6e56-428a-885f-58301e05478f 2Gi RWO kimdubi-test 2d4h
redis-data-kimdubi-test-redis-cluster-1 Bound pvc-10412da7-46bb-43e0-b791-a810774b7c87 2Gi RWO kimdubi-test 2d4h
redis-data-kimdubi-test-redis-cluster-2 Bound pvc-6a5aa328-8ca2-4450-a308-1c07cc7aab60 2Gi RWO kimdubi-test 2d4h
redis-data-kimdubi-test-redis-cluster-3 Bound pvc-b198c891-2d0c-474e-9113-2ad0f198a336 2Gi RWO kimdubi-test 2d4h
redis-data-kimdubi-test-redis-cluster-4 Bound pvc-92e41155-d644-4799-b974-2a35c19ada8b 2Gi RWO kimdubi-test 2d4h
redis-data-kimdubi-test-redis-cluster-5 Bound pvc-b2fe7621-e748-4cc7-aa4c-2efee2fc0cd8 2Gi RWO kimdubi-test 2d4h
PV / PVC template을 살펴보자#
Persistent Volume#
$ kubectl get persistentvolume/pvc-10412da7-46bb-43e0-b791-a810774b7c87 -o yaml
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
kubernetes.io/createdby: cinder-dynamic-provisioner
pv.kubernetes.io/bound-by-controller: "yes"
pv.kubernetes.io/provisioned-by: kubernetes.io/cinder
creationTimestamp: "2021-02-21T07:33:56Z"
finalizers:
- kubernetes.io/pv-protection
labels:
failure-domain.beta.kubernetes.io/region: RegionOne
failure-domain.beta.kubernetes.io/zone: kr-pub-b
name: pvc-10412da7-46bb-43e0-b791-a810774b7c87
resourceVersion: "24691"
selfLink: /api/v1/persistentvolumes/pvc-10412da7-46bb-43e0-b791-a810774b7c87
uid: df950b89-f229-4d2f-9b77-0f1f47e327aa
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 2Gi
cinder:
volumeID: 9b284d26-a868-4f0a-86d2-4c3916ccf791
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: redis-data-kimdubi-test-redis-cluster-1
namespace: default
resourceVersion: "24628"
uid: 10412da7-46bb-43e0-b791-a810774b7c87
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: failure-domain.beta.kubernetes.io/region
operator: In
values:
- RegionOne
- key: failure-domain.beta.kubernetes.io/zone
operator: In
values:
- kr-pub-b
persistentVolumeReclaimPolicy: Delete
storageClassName: kimdubi-test
volumeMode: Filesystem
status:
phase: Bound
.spec.accessModes#
- ReadWriteOnce : node 하나만 볼륨에 read / write 할 수 있도록 mount하는 설정
- ReadOnlyMany : 여러 node에서 read 할 수 있도록 mount 하는 설정
- ReadWriteMany : 여러 노드에서 read / write 할 수 있도록 mount하는 설정
.spec.claimRef#
- 해당 PV 가 binding 된 PVC 정보, 위 PV는 redis-data-kimdubi-test-redis-cluster-1 PVC에 묶여있음
.spec.persistentVolumeReclaimPolicy#
- PV가 해제되었을 때의 초기화 옵션 설정
- retain : PV를 그대로 보존함, 이 PV를 재사용하려면 직접 수동으로 PV를 삭제하여 초기화해야함
- Recycle : PV의 데이터를 삭제하고 다시 새로운 PVC 에 binding 될 수 있도록 하는 설정
- Delete : PV를 삭제하고 연결된 외부의 스토리지 볼륨도 삭제함 (default 설정)