쿠버네티스(k3s) OpenEBS 스토리지 클래스 설치 방법
쿠버네티스는 스토리지 클래스를 이용하여 스토리지 서비스를 제공한다. 쿠버네티스 자체에서는 스토리지 클래스를 제공하지 않고 별도의 솔루션을 설치해야 사용할 수 있다.
일반적으로 퍼블릭 클라우드 서비스 업체는 스토리지 클래스를 기본으로 제공하고 온프레미스 환경은 별도 스토리지 솔루션으로 구현해야 한다.
현업에서 많이 사용하는 오픈소스 스토리지 솔루션에는 Ceph(셰프), 글러스터FS(GlusterFS), OpenEBS 등이 있다.
OpenEBS는 속도가 빠르고 설치가 쉽기 때문에 k3s 에서도 쉽게 배포가 가능하다!
그렇다면, 쿠버네티스 스토리지란 무엇인지 개념부터 잡고 OpenEBS 설치를 해보도록 한다!
만약!! OpenEBS 설치 내용만 필요하신 분들은 스크롤을 쭉쭉 해주시길 바란다.
쿠버네티스 스토리지
컨테이너 환경에서는 별도 설정을 하지 않으면 데이터는 호스트 코드의 임시 디스크에 보관된다.
그러나 이 데이터는 컨테이너를 삭제하면 컨테이너와 함께 삭제되기 때문에 쿠버네티스에서는 파드와 데이터를 분리해서 영구 볼륨이라는 별도의 추상화된 리소스로 해결한다.
쿠버네티스 볼륨을 구성하는 주요 리소스는 영구볼륨(PersistentVolume), PVC(PersistentVolumeClain), 스토리지 클래스(StorageClass)가 있다.
[1] 영구 볼륨(PersistentVolume)
영구볼륨은 실제 데이터가 저장되는 리소스로써, 실제 데이터가 영속적으로 저장되는 스토리지의 일부이다. 관리자는 정적으로 직접 영구 볼륨을 생성할 수 있지만 운영환경에서는 대부분 스토리지 클래스를 이용해 동적으로 영구 볼륨을 할당한다.
[2] PVC(Persistent Volume Claim)
PVC는 실제 데이터가 저장되는 영구볼륨과 분리해서 영구볼륨의 스토리지 용량과 액세스 모드(ReadWriteOnce, ReadWriteMany) 등 PV와 관련된 설정만 별도로 분리한 쿠버네티스 리소스 이다.
[3] 스토리지 클래스(StorageClass)
스토리지 클래스는 스토리지 솔루션 또는 클라우드 서비스 제공업체에서 제공하는 여러가지 스토리지 중 동일한 속성(IOPS, 레이턴시, 백업정책 등)을 가지는 스토리지의 집합 리소스. 사용자는 원하는 스토리지 클래스를 지정해 PVC에서 요청하면 스토리지 클래스에서 해당 볼륨을 동적으로 할당한다.
즉, 관리자는 사전에 클러스터에 필요한 스토리지 유형을 정하고 이를 스토리지 클래스로 생성한다. 사용자는 PVC로 볼륨 할당을 요청하면 해당 스토리지 클래스에서 동적으로 PV가 할당된다.
OpenEBS 설치 방법
[1] openebs 네임스페이스 생성
먼저 openebs 네임스페이스를 생성하고 기본 설정을 해준다.
k create ns openebs
kubectl config set-context --current --namespace=openebs
[2] openebs 설치 및 확인
openEBS 설치는 간단한 구성이기 때문에 별도의 헬름 차트를 이용하지 않고 매니페스트 파일 기반으로 설치가 가능하다.
# apply this yaml
kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
openebs 네임스페이스에 해당 pod들이 설치된 것을 확인할 수 있다.
설치가 완료되면 스토리지 클래스도 생성 된다.
openebs-hostpath와 openebs-device라는 2가지 스토리지 클래스가 생성되었다.
현재는 local-path 스토리지클래스가 default 설정이 되어있다.
- openebs-hostpath : 호스트 노드의 특정 디렉터리에 데이터를 할당. host path에서 사용하는 디렉터리 위치는 관리자가 변경할 수 있는데, 기본 설정은 /var/openebs/local
- openebs-device : 노드에서 마운트하지 않은 별도의 디스크 디바이스(ex. /dev/sdb 등)에 파드의 데이터를 저장
*** OpenEBS에서 사용하는 볼륨이 호스트 노드의 파일시스템 용량에 영향을 끼치지 않도록 기본 디렉터리 경로가 아니라 별도의 마운트 포인트를 사용하는 것을 권장
[3] openebs-hostpath를 default storage class로 변경
kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
openebs를 기본 스토리지클래스로 설정하였지만 default 가 그럼 두개가 설정되어 있다.
하나만 설정하여야 추후 스토리지클래스를 사용할때 충돌 에러가 나지 않는다.
StorageClass를 기본값이 아닌것으로 설정하려면 아래와 같은 명령을 해주면 된다.
ubectl patch storageclass [스토리지클래스명] -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
원하는 openebs-hostpath만 default처리가 된것을 확인할 수 있다.