-
[k8s] 동적 볼륨 프로비저닝클라우드/kubernetes 2021. 3. 30. 23:32728x90
동적 볼륨 프로비저닝
관리자가 스토리지 기능 및 분류 정보를 담고 있는 스토리지 클래스(StorageClass) 리소스만 정의해 놓고 개발자가 PVC를 요청하면 스토리지 클래스 리소스에 의해 PV가 자동으로 프로비저닝되어 사용할 수 있도록 동적 프로비저닝 기능을 제공한다.
1. 스토리지 클래스
쿠버네티스의 스토리지 클래스 리소스는 스토리지의 클래스(분류, 정책, 종류)에 대한 정보를 정의할 수 있는 리소스다. 쿠버네티스는 자체적으로 클래스에 무엇을 정의해야 하는지에 대한 강제성은 없다. 필요한 스토리지의 여러 정보를 정의할 수 있다.
2. 동적 볼륨을 위한 스토리지 클래스 리소스 확인
$ kubectl get storageclasses.storage.k8s.io No resources found in default namespace.
- 스토리지 클래스 정의
# rook git download (github.com/rook/rook)
git clone --single-branch --branch release-1.2 https://github.com/rook/rook.git
# access the directory
cd ~/rook/cluster/examples/kubernetes/ceph
# rook-ceph deploy
kubectl create -f common.yaml
kubectl create -f operator.yaml
# rook-ceph-operator 파드가 running 상태가 될 때 까지 기다림 (4개)
kubectl -n rook-ceph get pod
$ kubectl -n rook-ceph get pod NAME READY STATUS RESTARTS AGE rook-ceph-operator-b676fc78d-xqslm 1/1 Running 0 6m5s rook-discover-6cfkt 1/1 Running 0 5m7s rook-discover-6ptb4 1/1 Running 0 5m7s rook-discover-b9tmc 1/1 Running 0 5m7s
# 단일노드일 경우 cluster-test.yaml 생성
kubectl create -f cluster-test.yaml
# ceph toolbox pod
kubectl create -f toolbox.yaml
# storage class 생성
kubectl create -f csi/rbd/storageclass-test.yaml
kubectl get storageclasses.storage.k8s.io
$ kubectl get storageclasses.storage.k8s.io NAME PROVISIONER AGE rook-ceph-block rook-ceph.rbd.csi.ceph.com 13s
# cephfs 생성
kubectl create -f filesystem-test.yaml
kubectl -n rook-ceph get pod
kubectl -n rook-ceph get pod -l app=rook-ceph-mds
$ kubectl -n rook-ceph get pod -l app=rook-ceph-mds No resources found in rook-ceph namespace.
# cephfs 스토리지 클래스 생성
kubectl create -f csi/cephfs/storageclass.yaml
kubectl get storageclasses.storage.k8s.io
$ kubectl get storageclasses.storage.k8s.io NAME PROVISIONER AGE csi-cephfs rook-ceph.cephfs.csi.ceph.com 11s rook-ceph-block rook-ceph.rbd.csi.ceph.com 53s
- csi-cephfs: CephFS 파일시스템
- rook-ceph-block: Ceph RBD 블록
3. 동적 볼륨을 위한 PVC 리소스 생성
mynapp-pvc-dynamic.yml
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mynapp-pvc-dynamic spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-cephfs
$ kubectl create -f mynapp-pvc-dynamic.yml persistentvolumeclaim/mynapp-pvc-dynamic created # PVC 리소스 확인 $ kubectl get persistentvolumeclaims NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mynapp-pvc-dynamic Pending csi-cephfs 10s $ kubectl get persistentvolumeclaims NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mynapp-pvc-dynamic Bound pvc-473f7a3c-14f9-4ee6-b5a3-bf927202e8b1 1Gi RWX csi-cephfs 25s
PV 프로비저닝에 사용한 스토리지 클래스는 csi-cephfs 이고, 상태는 연결된 상태이다. PVC 리소스는 지정한 스토리지 클래스 리소스에 의해 이미 PV 리소스가 프로비저닝 되었고 연결도 되었다는 것을 예상할 수 있다.
# PV 리소스 확인 $ kubectl get persistentvolume NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-473f7a3c-14f9-4ee6-b5a3-bf927202e8b1 1Gi RWX Delete Bound default/mynapp-pvc-dynamic csi-cephfs 3m15s
4. 기본 스토리지 클래스
PVC 리소스 정의시 PV 프로비저닝에 사용할 스토리지 클래스 리소스를 직접 정의할 수도 있지만, 따로 사용할 스토리지 클래스를 지정하지 않더라도 기본으로 적용될 스토리지 클래스를 구성할 수 있다.
# csi-cephfs 스토리지 클래스를 기본 스토리지 클래스로 설정 $ kubectl patch storageclasses.storage.k8s.io csi-cephfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' # 스토리지 클래스 리소스의 상세 정보 확인 $ kubectl describe storageclasses.storage.k8s.io csi-cephfs Name: csi-cephfs IsDefaultClass: Yes Annotations: storageclass.kubernetes.io/is-default-class=true Provisioner: rook-ceph.cephfs.csi.ceph.com Parameters: clusterID=rook-ceph,csi.storage.k8s.io/controller-expand-secret-name=rook-csi-cephfs-provisioner,csi.storage.k8s.io/controller-expand-secret-namespace=rook-ceph,csi.storage.k8s.io/node-stage-secret-name=rook-csi-cephfs-node,csi.storage.k8s.io/node-stage-secret-namespace=rook-ceph,csi.storage.k8s.io/provisioner-secret-name=rook-csi-cephfs-provisioner,csi.storage.k8s.io/provisioner-secret-namespace=rook-ceph,fsName=myfs,pool=myfs-data0 AllowVolumeExpansion: True MountOptions: <none> ReclaimPolicy: Delete VolumeBindingMode: Immediate Events: <none> # 스토리지 클래스 목록 확인 $ kubectl get storageclasses.storage.k8s.io NAME PROVISIONER AGE csi-cephfs (default) rook-ceph.cephfs.csi.ceph.com 144m rook-ceph-block rook-ceph.rbd.csi.ceph.com 145m
스토리지 클래스 이름 옆에 (default) 라는 표시가 지정되어 있다.
'클라우드 > kubernetes' 카테고리의 다른 글
[k8s] 인그레스(Ingress) 컨트롤러 (0) 2021.03.30 [k8s] 워드프레스 구축 (0) 2021.03.16