본문으로 건너뛰기

기본 스토리지 클래스 변경하기

· 약 6분
David Lee

cka

개념#

스토리지 클래스#

스토리지 클래스(storagesclass, sc)는 쿠버네티스의 워크로드에 퍼시스턴스 볼륨(persistencevolume, pv)을 공급해주는 방법을 가리키는 리소스입니다.

note

예를 들면, AWS에서 EKS(쿠버네티스)를 사용할 때는 AWS EBS를 볼륨 공급자로 사용하는 gp2가 기본 스토리지 클래스로 되어 있습니다. 그래서 스테이트풀셋(statefulset, sts)과 같은 워크로드에서 볼륨을 요청(claim)하면 AWS EBS의 gp2 타입 볼륨 생성해서 동적으로 공급하게 됩니다.

info

자세한 내용은 [쿠버네티스 공식 문서] 스토리지 클래스를 참조하세요.

기본 스토리지 클래스#

여러 스토리지 클래스 중에서도 클러스터에서 기본적으로 사용되는 스토리지 클래스가 있습니다. 기본 스토리지 클래스는 옵션으로 명시적으로 지정해주지 않아도 기본적으로 선택되는 스토리지 클래스입니다.

tip

kubectl로 내 클러스터의 스토리지 클래스를 보려면 아래와 같이 합니다.

kubectl get storageclass
kubectl get sc

클러스터에 등록된 스토리지 클래스 목록과, 기본으로 설정된 스토리지 클래스는 무엇인지 살펴보겠습니다.

$ kubectl get sc
NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGEhostpath (default)   docker.io/hostpath   Delete          Immediate              false                  12dopenebs-device       openebs.io/local     Delete          WaitForFirstConsumer   false                  11dopenebs-hostpath     openebs.io/local     Delete          WaitForFirstConsumer   false                  11d

아직 hostpath가 기본 스토리지 클래스로 되어 있습니다.

note

기본 스토리지 클래스가 아닌 다른 특정 스토리지 클래스를 사용하려면, 아래와 같이 리소스 선언에 매번 명시적으로 지정을 해줘야해서 불편한 점이 있습니다. 기본 스토리지 클래스였더라면 storageClassName은 생략할 수 있습니다.

spec:  ...  storageClassName: openebs-hostpath
tip

온프레미스 환경에서 쿠버네티스를 베어메탈로 구성한 경우, 마땅히 사용할 스토리지 클래스가 없다면 openebs를 한 번 사용해보세요.

실습: 기본 스토리지 클래스 변경하기#

그럼 지금부터 openebs-hostpath가 기본 스토리지 클래스가 되도록 바꿔 보겠습니다.

기존 기본 스토리지 클래스 지정 해제#

기존의 기본 스토리지 클래스였던 hostpath의 기본 스토리지 클래스 지정을 해제합니다.

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

아래와 같이 바뀐 것을 확인할 수 있습니다. (hostpath (default) => hostpath)

$ kubectl get sc
NAME               PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGEhostpath           docker.io/hostpath   Delete          Immediate              false                  12dopenebs-device     openebs.io/local     Delete          WaitForFirstConsumer   false                  11dopenebs-hostpath   openebs.io/local     Delete          WaitForFirstConsumer   false                  11d
note

기본 스토리지 클래스 지정을 해제하더라도 이미 실행 중인 워크로드에는 영향을 미치지 않습니다.

  • pv, pvc
  • 기타 pv, pvc를 사용하는 리소스들

새 기본 스토리지 클래스 지정#

openebs-hostpath를 기본 스토리지 클래스로 지정합니다.

kubectl patch sc openebs-hostpath -p \  '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'

아래와 같이 바뀐 것을 확인할 수 있습니다. (openebs-hostpath => openebs-hostpath (default))

$ kubectl get sc
NAME                         PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGEhostpath                     docker.io/hostpath   Delete          Immediate              false                  12dopenebs-device               openebs.io/local     Delete          WaitForFirstConsumer   false                  11dopenebs-hostpath (default)   openebs.io/local     Delete          WaitForFirstConsumer   false                  11d
tip

가장 기본적으로 사용하는 스토리지 클래스를 default로 지정합니다.

이제 storageClassName을 명시적으로 선언하지 않아도 openebs-hostpath가 적용됩니다.

spec:  ...  storageClassName: openebs-hostpath # 생략 가능

정리#

기본 스토리지 클래스 여부는 is-default-class 애노테이션의 유무로 판별하는 것을 알았습니다.

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  annotations:    storageclass.kubernetes.io/is-default-class: 'true'

그리고 kubectl 명령으로 기본 스토리지 클래스 지정을 해제하고 설정하는 방법을 알아보았습니다.

기본 해제#

kubectl patch sc [해제할 스토리지 클래스 이름] -p \  '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "false"}}}'

기본 지정#

kubectl patch sc [지정할 스토리지 클래스 이름] -p \  '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'
caution

당연하지만, 기본 스토리지 클래스가 둘 이상이면 곤란하겠죠?

도움이 되셨길 바랍니다.

감사합니다.