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와 매핑되는 block storage

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 설정)