Kubernetes StorageClass

Kubernetes를 효율적으로 운영하기 위해서는 Dynamic Volume Provisioning 기능을 활성화해야한다. Dynamic Volume Provisioning을 사용하기 위해서는 StorageClass를 정의하여 블록 스토리지와 연동해야한다. 이 글에서는 StorageOS와 연계하는 StorageClass를 설정하는 방법을 소개한다.

관련 키워드: Kubernetes, StorageClass, Block Storage


Persistent Volume

StorageClass와 Dynamic Volume Provisioning을 이해하기 위해서는 먼저 Persistent Volume(PV)과 Persistent Volume Claim(PVC)에 대한 이해가 필요하다.  Kubernetes의 응용 프로세스인 Pod의 생명주기는 Docker의 컨테이너와 동일하다. Pod이 작업을 종료하면 내부에서 생성하던 데이터도 삭제된다. MySQL 등의 데이터베이스를 사용한다면 응용 프로세스가 종료되어도 데이터가 보존되어야 한다. Docker에서는 컨테이너를 실행할 때 호스트의 디스크를 컨테이너와 공유하는 방식으로 데이터를 보존 할 수 있다. Docker는 기본적으로 단일 머신에서 실행되기 때문에 로컬 스토리지를 공유하여 관리가 가능하지만 Kubernetes는 클러스터로 구성되어 다중 머신에서 운영되기 때문에 효과적인 관리를 위해서는 스토리지에 대한 관리가 필요하다. PV는 Pod에 할당되는 공유 스토리지를 별도의 생명주기로 관리하는 기능을 한다. PV를 생성 한 후 Pod에 매핑하면 Pod이 종료되어도 PV를 삭제하기 전까지 데이터를 보존 할 수 있다. PV는 사용자가 원하는 크기만큼 볼륨을 설정 할 수 있다. PVC는 PV를 요청하는 방식으로 최대 PV에 할당된 크기만큼의 볼륨을  Pod에 연결할 수 있다.

kind: PersistentVolume
apiVersion: v1
metadata:
  name: my-pv-volume
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

위의 yaml 파일을 작성하여 PV를 생성해보자. Kubernetes에 별도의 StorageClass가 연계되지 않았다면, PV 생성을 위해서는 storageClassName을 manual로 설정해야 한다. storageClassName을 별도로 지정하지 않으면 시스템에서 Default 설정으로 되어있는 StorageClass를 사용한다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

PV 생성을 했다면 위의 yaml 파일을 추가로 생성해서 PVC를 생성해보자. PV에서 stoargeClass를 manual로 설정했기 때문에 PVC에서도 마찬가지로 manual로 지정한다. PVC는 최대 PV의 크기만큼 설정 가능하다. 만약 manual에 존재하는 PV의 크기보다 크게 PVC를 지정한다면 Pending 상태로 PVC가 생성되고 PVC에 지정된 용량보다 큰 PV가 존재 할 때 Bound 상태로 변경된다.

Dynamic Volume Provisioning 기능은 StorageClass와 연계하여 PV를 별도로 생성하지 않고 PVC 요청을 처리 할 수 있는 역할을 한다. Helm 등의 Kubernetes Package Manager에 존재하는 패키지들은 대부분 Dynamic Volume Provisioning 기능이 활성화 되어있어야 정상적으로 동작한다.


StorageClass

https://kubernetes.io/docs/concepts/storage/storage-classes

StorageClass는 블록 스토리지를 추상화하여 Kubernetes와 연계하는 방식이다. 이 개념은 일반적으로는 스토리지 시스템에서 프로파일이라고 정의하기도 한다. StorageClass를 통해 AWS, GCE, Azure 등의 클라우드에서 제공되는 블록 스토리지와도 연계 할 수 있다. 연계 할 수 있는 스토리지는 위의 링크에서 확인 할 수 있다. 이 글에서는 StorageOS를 사용하여 StorageClass를 연계하는 방법을 소개할 예정이다.

> git clone https://github.com/storageos/deploy.git storageos
> cd storageos/k8s/deploy-storageos/standard
> ./deploy-storageos.sh

Kubernetes에 StorageOS를 설치하기 위해서는 클러스터를 구축 한 뒤 위의 명령어를 입력하면 자동으로 Deploy 된 후 StorageClass 등록까지 진행된다. 설치 된 후 Master Node에서 아래 명령어를 실행해보자.

> kubectl get storageclass
NAME             PROVISIONER               AGE
fast             kubernetes.io/storageos   0h

StorageOS를 설치하면 StorageClass의 이름이 fast로 생성 된 것을 확인 할 수 있다. Helm 등 다양한 예제들을 모두 사용하기 위해서는 생성된 StorageClass를 기본값으로 설정이 필요하다. 

> kubectl patch storageclass fast -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

위의 명령어를 통해 fast 라는 이름의 StorageClass를 기본값으로 변경 할 수 있다. 만약 기본값으로 설정된 StorageClass를 해제하고 싶다면 아래의 명령어를 사용한다.

> kubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

StorageOS를 기본값으로 지정하였다면 아래의 yaml 파일을 작성해서 PVC를 생성해보자. 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: storageos-pv-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

별도의 PV를 생성하지 않아도 위의 PVC를 생성하면 자동으로 PV가 생성된 후 PVC가 생성된 것을 확인 할 수 있다. 아래 명령어로 생성된 PV와 PVC를 확인해보자.

> kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                        STORAGECLASS   REASON   AGE
pvc-e1f64381-d6d8-11e8-b585-46c01c4b5f21   20Gi       RWO            Delete           Bound    default/storageos-pv-claim   fast                    1s

> kubectl get pvc
NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
storageos-pv-claim   Bound    pvc-e1f64381-d6d8-11e8-b585-46c01c4b5f21   20Gi       RWO            fast           9s

정상적으로 생성이 되었다면 STATUS가 Bound 상태로 되어있는 것을 확인 할 수 있다. 생성된 PV를 보면 RECLAIM POLICY 항목이 Delete로 출력된 것을 볼 수 있다. RECLAIM POLICY는 스토리지 환원 정책으로 PV 생성시 StorageClass에 정의된 정책을 사용하게 된다. 환원 정책은 Delete, Retain의 상태를 가질 수 있다. 기본값으로는 Delete 정책이 선택되는데, Delete 정책이 선택된다면 PVC가 삭제될 때 PV 또한 같이 삭제되게 된다.

“Kubernetes StorageClass”에 대한 한개의 댓글

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.