#
개념#
스토리지 클래스스토리지 클래스(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
가 기본 스토리지 클래스가 되도록 바꿔 보겠습니다.
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 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
당연하지만, 기본 스토리지 클래스가 둘 이상이면 곤란하겠죠?
도움이 되셨길 바랍니다.
감사합니다.