본문 바로가기
IT/Kubernetes

[Kubernetes] Storage - StorageClass

by 물통꿀꿀이 2019. 4. 21.

Storage를 계속 이어나가 이번 포스팅에서는 StorageClass에 대해 알아보려고 한다.


StorageClass

기존에는 관리자가 PersistentVolume을 개발자(사용자)로 부터 요청을 받을 때마다 생성을 해 주었다. 그런데 k8s에서는 이 작업을 StorageClass를 통해 자동으로 수행 할 수 있다. 즉, 관리자는 PersistentVolume을 여러 개 만드는 대신 Profile(또는 MetaClass)과도 같은 Storage Object을 정의하여 사용자로 하여금 Storage Object를 사용하게 하는 것이다.

그림 1. StorageClass


글로만 이해하기 어려우니 그림 1을 확인해보자. 개발자가 PersistentVolumeClaim을 생성할 때 이전에는 직접적으로 PersistentVolume을 참조했다면 지금은 StorageClass를 참조한다. 관리자가 StoageClass를 생성하기 위해서는 아래의 매니페스트 정의가 필요하다.


kind: StorageClass

apiVersion: storage.k8s.io/v1

metadata:

  name: standard

provisioner: kubernetes.io/aws-ebs

parameters:

  type: gp2

reclaimPolicy: Retain

mountOptions:

  - debug

volumeBindingMode: Immediate 

전에 PersistentVolumeClaim에 대해 살펴보았듯이 PersistentVolumeClaim 매니페스트 파일에 StorageClass를 정의하지 않으면 Default로 생성되며 그렇지 않으면 위에서 볼 수 있듯이 name: standard 같이 이름이 정의된 StorageClass를 사용한다.


그리고 중요한 부분이 빨간색으로 칠해져 있는 부분이다. 

- provisioner

StorageClass의 특징으로 처음에 언급했듯이 PersistentVolume을 자동으로 생성하기 위한 Provider를 지정한다. Provider는 PersistentVolume을 생성할 때 어떤 Volume 타입으로 제공할지 결정하는 역할을 한다. (예시에서 aws-ebs는 AWS 관련 Volume을 만든겠다는 정의이다.)

그림 2. StorageClass


Provider에 사용할 수 있는 종류는 그림 2에서 볼 수 있는 것보다 더 많이 있다. 

추가로 Internal의 의미는 k8s에서 내장된 것을 의미한다. 때문에 External의 경우는 외부 라이브러리를 사용해야 한다.

(https://github.com/kubernetes-incubator/external-storage)


- Parameters

Parameters는 Volume의 내부 속성을 정의한다. (물론 아무거나 속성을 정의할 수 없고 Provisioner에 의존적이다.) 


kind: StorageClass

apiVersion: storage.k8s.io/v1

metadata:

  name: slow

provisioner: kubernetes.io/aws-ebs

parameters:

  type: io1

  iopsPerGB: "10"

  fsType: ext4 

관련 예를 잠시 살펴보면, type과 iopsPerGB은 AWS EBS에서만 사용하는 것이다. (자세한 것은 AWS EBS Document 참조)

이 외에도 Parameters 내부적으로 여러 속성을 가지고 있지만 항상 Provisioner를 확인해야 한다. (물론 k8s에서 기본으로 지원해 주는 속성도 있다.)


- reclaimPolicy

reclaimPolicy는 PersistentVolumeClaim과 관련된 정책이다. (PersistentVolume을 정의할 때 속성과 같다.)

StorageClass에서는 Delete와 Retain 값을 사용 할 수 있으며 기본 값은 Delete이다.


그럼 간단히 정의한 매니페스트 파일을 실행하면 다음과 같다.

apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

  name: fast

provisioner: k8s.io/minikube-hostpath

parameters:

  type: pd-ssd 


그림 3. Created StorageClass


매니페스트 파일을 실행하면 그림 3과 같이 생성된 것을 확인 할 수 있다. 이를 바탕으로 PersistentVolumeClaim을 생성하면 아래와 같다.


apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: mongodb-pvc

spec:

  storageClassName: fast

  resources:

    ...

나머지는 PersistentVolumeClaim 생성 방식과 동일하고 StorageClass의 이름을 넣는 부분이 추가되었다. 

그림 4. StorageClass PersistentVolumeClaim


Reference

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

https://github.com/luksa/kubernetes-in-action/



'IT > Kubernetes' 카테고리의 다른 글

[Kubernetes] Networking - Kube Proxy  (0) 2019.04.26
[Kubernetes] Liveness & Readiness Probe  (0) 2019.04.26
[Kubernetes] Storage - PersistentVolume  (0) 2019.04.21
[Kubernetes] Storage - Volume  (0) 2019.04.21
[Kubernetes] Logging  (0) 2019.04.10

댓글