개념#
스토리지 클래스#
스토리지 클래스(storagesclass, sc)는 쿠버네티스의 워크로드에 퍼시스턴스 볼륨(persistencevolume, pv)을 공급해주는 방법을 가리키는 리소스입니다.
note
예를 들면, AWS에서 EKS(쿠버네티스)를 사용할 때는 AWS EBS를 볼륨 공급자로 사용하는 gp2가 기본 스토리지 클래스로 되어 있습니다. 그래서 스테이트풀셋(statefulset, sts)과 같은 워크로드에서 볼륨을 요청(claim)하면 AWS EBS의 gp2 타입 볼륨 생성해서 동적으로 공급하게 됩니다.
info
자세한 내용은 [쿠버네티스 공식 문서] 스토리지 클래스를 참조하세요.
기본 스토리지 클래스#
여러 스토리지 클래스 중에서도 클러스터에서 기본적으로 사용되는 스토리지 클래스가 있습니다. 기본 스토리지 클래스는 옵션으로 명시적으로 지정해주지 않아도 기본적으로 선택되는 스토리지 클래스입니다.
tip
kubectl로 내 클러스터의 스토리지 클래스를 보려면 아래와 같이 합니다.
kubectl get storageclasskubectl 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-hostpathtip
온프레미스 환경에서 쿠버네티스를 베어메탈로 구성한 경우, 마땅히 사용할 스토리지 클래스가 없다면 openebs를 한 번 사용해보세요.
실습: 기본 스토리지 클래스 변경하기#
그럼 지금부터 openebs-hostpath가 기본 스토리지 클래스가 되도록 바꿔 보겠습니다.
info
[공식 문서] 기본 스토리지 클래스 변경하기를 참조합니다.
기존 기본 스토리지 클래스 지정 해제#
기존의 기본 스토리지 클래스였던 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 11dnote
기본 스토리지 클래스 지정을 해제하더라도 이미 실행 중인 워크로드에는 영향을 미치지 않습니다.
- 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 11dtip
가장 기본적으로 사용하는 스토리지 클래스를 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
당연하지만, 기본 스토리지 클래스가 둘 이상이면 곤란하겠죠?
도움이 되셨길 바랍니다.
감사합니다.

