Rook Ceph 클러스터 Kubernetes 배포 가이드

이 포스트는 Kubernetes 클러스터에 Rook Ceph 클러스터를 배포하여 워커 노드의 스토리지를 통해 Ceph의 분산 스토리지 시스템을 구성하는 방법을 설명합니다. Rook은 Ceph를 Kubernetes에서 네이티브하게 실행할 수 있도록 지원하며, 이를 통해 블록, 파일, 오브젝트 스토리지를 효율적으로 관리할 수 있습니다.

이번 포스트에서는 Ceph, Rook이 무엇인지 알아보고 Kubernetes 클러스터에 Rook Ceph 클러스터를 구성하는 방법만을 다루며, 다양한 유형의 스토리지를 구성하고 사용하는 방법은 다음 포스트에서 다루도록 하겠습니다. 각 스토리지 유형 별 특징은 클라우드 스토리지 유형과 특징, 활용 방안 포스트를 참고하세요.

목차

1. Ceph란?
2. Rook이란?
 2-1. Rook Ceph 클러스터란?
 2-2. Rook Ceph와 워커 노드 스토리지 활용
3. 버전 정보
4. Rook 배포
5. Rook Ceph 클러스터 구성
6. 결론

1. Ceph란?

Ceph는 고가용성과 확장성을 갖춘 오픈소스 분산 스토리지 솔루션으로, 블록(Block), 파일(File), 오브젝트(Object) 스토리지 서비스를 제공하는 스토리지 플랫폼입니다. Ceph는 기존의 중앙 집중식 스토리지 시스템과 달리, 여러 노드에 데이터를 분산 저장하여 장애 발생 시에도 데이터의 안정성을 보장합니다.

Ceph는 주로 클라우드 환경과 대규모 데이터센터에서 사용되며, 성능, 확장성, 데이터 보호 기능이 뛰어나기 때문에 Kubernetes 환경에서도 널리 활용됩니다.

Ceph의 주요 특징
  • 완전한 분산 구조
    Ceph는 단일 장애 지점(Single Point of Failure)이 없는 분산 시스템으로, 여러 노드에 데이터를 복제하여 저장합니다. 이를 통해 장애 발생 시에도 데이터의 무결성과 가용성이 유지됩니다.
  • 확장성(Scalability)
    Ceph는 스토리지 노드를 추가하는 것만으로 쉽게 확장할 수 있습니다. 대규모 스토리지 클러스터를 운영할 때도 성능 저하 없이 유연하게 확장할 수 있습니다.
  • 자체 복구(Self-Healing) 기능
    노드 장애가 발생해도 Ceph는 자동으로 데이터의 복제본을 찾아 재배치하며, 클러스터 상태를 지속적으로 모니터링하여 데이터 일관성을 유지합니다.
  • 다양한 스토리지 인터페이스 지원
    • 블록 스토리지(RADOS Block Device, RBD): 클라우드 환경에서 가상 머신(VM) 또는 컨테이너의 영구 저장소로 사용됨
    • 파일 시스템(CephFS): POSIX 호환 파일 시스템을 제공하여 NAS(Network Attached Storage) 대체 가능
    • 오브젝트 스토리지(RADOS Gateway, RGW): AWS S3 호환 API를 지원하여 클라우드 스토리지처럼 활용 가능
  • 오픈소스 및 커뮤니티 지원
    Ceph는 Red Hat을 포함한 다양한 기업과 커뮤니티에서 활발히 개발 및 유지보수되고 있습니다. 이를 통해 최신 기술을 빠르게 도입하고, 다양한 환경에서 활용할 수 있습니다.

2. Rook 이란?

Rook은 클라우드 네이티브 환경에서 스토리지를 관리하기 위한 오픈소스 클라우드 네이티브 스토리지 오케스트레이터입니다. Kubernetes 환경에서 다양한 스토리지 솔루션을 쉽게 배포하고 관리할 수 있도록 도와주는 도구로, CNCF(Cloud Native Computing Foundation)의 졸업 프로젝트입니다.

Rook은 기본적으로 Kubernetes의 확장 기능인 Operator 패턴을 사용하여 스토리지 시스템을 배포, 업그레이드, 확장, 복구 및 모니터링 합니다. 이는 사용자가 복잡한 스토리지 시스템을 yaml 파일을 통해 선언적인 방식으로 관리할 수 있게 해주며, Kubernetes의 철학과 일치하는 방식으로 스토리지 리소스를 다룰 수 있게 합니다.

Rook의 주요 특징:

  • 자동화된 관리: 스토리지 시스템의 설정, 확장, 업그레이드 등을 자동화
  • 자가 복구 능력: 장애 발생 시 자동 복구 및 데이터 보호 메커니즘 제공
  • 클라우드 네이티브 설계: Kubernetes 생태계와 완벽하게 통합
  • 다양한 스토리지 백엔드 지원: Ceph, NFS 등 다양한 스토리지 시스템 지원
  • 선언적 관리: Kubernetes 리소스를 통한 선언적 방식의 스토리지 관리

Rook은 특히 Ceph와의 통합이 가장 성숙하고 널리 사용됩니다.

2-1. Rook Ceph 클러스터란?

Rook Ceph 클러스터는 Rook을 사용하여 Kubernetes 환경에 배포된 Ceph 스토리지 클러스터를 의미합니다. Rook은 Ceph 클러스터의 배포, 구성, 확장, 업그레이드 및 모니터링을 자동화하여 Kubernetes 관리자가 복잡한 Ceph 운영 지식 없이도 안정적인 분산 스토리지 환경을 구축할 수 있게 해줍니다.

Rook Ceph 클러스터는 다음과 같은 구성요소로 이루어집니다:

  • Ceph 모니터(MON): 클러스터 상태를 유지하고 모니터링하는 데몬
  • Ceph 관리자(MGR): 클러스터 상태 정보를 수집하고 대시보드를 제공하는 데몬
  • Ceph OSD(Object Storage Daemon): 실제 데이터를 저장하고 처리하는 데몬
  • Ceph MDS(Metadata Server): CephFS를 위한 메타데이터 서비스를 제공하는 데몬(파일 시스템 사용 시)
  • Rook Operator: Ceph 클러스터를 관리하는 Kubernetes Operator

Rook Ceph 클러스터의 주요 이점:

  • 고가용성: 데이터 복제 및 분산을 통한 높은 신뢰성과 가용성
  • 확장성: 필요에 따라 스토리지 노드를 쉽게 추가하여 수평 확장 가능
  • 다양한 스토리지 인터페이스: 블록(RBD), 파일(CephFS), 오브젝트(RGW) 스토리지 제공
  • Kubernetes 통합: PersistentVolume, StorageClass 등을 통한 쿠버네티스와의 원활한 통합
  • 선언적 관리: YAML 매니페스트를 통한 클러스터 구성 및 관리
  • 자동화된 운영: 모니터링, 확장, 장애 복구 등의 자동화

2-2. Rook Ceph 와 워커 노드 스토리지 활용

Rook Ceph 클러스터는 Kubernetes 워커 노드의 물리적 스토리지 자원을 활용하여 분산 스토리지 시스템을 구축합니다. 이는 Kubernetes 클러스터에서 추가적인 전용 스토리지 시스템 없이 Ceph 기반의 고가용성 스토리지를 구축할 수 있습니다.

스토리지 활용 방식

1. 블록 스토리지(Raw 디바이스) 활용

  • 워커 노드에 연결된 마운트되지 않은 디스크 또는 파티션이 없는 디스크를 Ceph OSD의 데이터 저장소로 사용합니다.
  • Ceph OSD는 ceph-volume을 이용해 자동으로 디스크를 포맷하고 관리합니다.
  • 별도의 파일 시스템을 필요로 하지 않으며, Ceph의 분산 데이터 저장 방식에 최적화되어 있습니다.

2. PVC 기반 볼륨 제공

  • PVC를 요청하면 Rook Ceph가 Ceph RBD(블록 스토리지) 또는 CephFS(파일 스토리지)를 생성하여 제공합니다.
  • Rook Ceph는 Kubernetes의 PersistentVolume(PV)를 제공하는 CSI(Container Storage Interface) 드라이버 역할을 합니다.

3. 버전 정보

  • Kubernetes : v1.32.2
  • Rook : v1.16.5

4. Rook 배포

Rook은 v1.16.5 기준 Kubernetes의 v1.27 ~ v1.32 버전을 지원합니다.

1. 명령어를 사용해 Rook의 1.16.5 버전 배포 파일을 다운로드합니다.
최신 버전 정보는 Rook GitHub에서 확인하실 수 있습니다.

$ git clone --single-branch --branch v1.16.5 https://github.com/rook/rook.git

2. 다운 받은 파일의 yaml 파일이 있는 디렉터리로 이동합니다.

$ cd rook/deploy/examples

3. Rook 구성에 필요한 CRD(custom resource definition)을 Kubernetes 클러스터에 배포합니다.

$ kubectl apply -f crds.yaml

customresourcedefinition.apiextensions.k8s.io/cephblockpoolradosnamespaces.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephblockpools.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephbucketnotifications.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephbuckettopics.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephclients.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephclusters.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephcosidrivers.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephfilesystemmirrors.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephfilesystems.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephfilesystemsubvolumegroups.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephnfses.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephobjectrealms.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephobjectstores.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephobjectstoreusers.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephobjectzonegroups.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephobjectzones.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephrbdmirrors.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/objectbucketclaims.objectbucket.io created
customresourcedefinition.apiextensions.k8s.io/objectbuckets.objectbucket.io created

4. 네임스페이스, role, rolebinding 및 service account 구성을 배포합니다.

$ kubectl apply -f common.yaml
 
namespace/rook-ceph created
clusterrole.rbac.authorization.k8s.io/cephfs-csi-nodeplugin created
clusterrole.rbac.authorization.k8s.io/cephfs-external-provisioner-runner created
clusterrole.rbac.authorization.k8s.io/objectstorage-provisioner-role created
clusterrole.rbac.authorization.k8s.io/rbd-csi-nodeplugin created
clusterrole.rbac.authorization.k8s.io/rbd-external-provisioner-runner created
clusterrole.rbac.authorization.k8s.io/rook-ceph-cluster-mgmt created
clusterrole.rbac.authorization.k8s.io/rook-ceph-global created
clusterrole.rbac.authorization.k8s.io/rook-ceph-mgr-cluster created
clusterrole.rbac.authorization.k8s.io/rook-ceph-mgr-system created
clusterrole.rbac.authorization.k8s.io/rook-ceph-object-bucket created
clusterrole.rbac.authorization.k8s.io/rook-ceph-osd created
clusterrole.rbac.authorization.k8s.io/rook-ceph-system created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-nodeplugin-role created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/objectstorage-provisioner-role-binding created
clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-nodeplugin created
clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/rook-ceph-global created
clusterrolebinding.rbac.authorization.k8s.io/rook-ceph-mgr-cluster created
clusterrolebinding.rbac.authorization.k8s.io/rook-ceph-object-bucket created
clusterrolebinding.rbac.authorization.k8s.io/rook-ceph-osd created
clusterrolebinding.rbac.authorization.k8s.io/rook-ceph-system created
role.rbac.authorization.k8s.io/cephfs-external-provisioner-cfg created
role.rbac.authorization.k8s.io/rbd-csi-nodeplugin created
role.rbac.authorization.k8s.io/rbd-external-provisioner-cfg created
role.rbac.authorization.k8s.io/rook-ceph-cmd-reporter created
role.rbac.authorization.k8s.io/rook-ceph-mgr created
role.rbac.authorization.k8s.io/rook-ceph-osd created
role.rbac.authorization.k8s.io/rook-ceph-purge-osd created
role.rbac.authorization.k8s.io/rook-ceph-system created
rolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role-cfg created
rolebinding.rbac.authorization.k8s.io/rbd-csi-nodeplugin-role-cfg created
rolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role-cfg created
rolebinding.rbac.authorization.k8s.io/rook-ceph-cluster-mgmt created
rolebinding.rbac.authorization.k8s.io/rook-ceph-cmd-reporter created
rolebinding.rbac.authorization.k8s.io/rook-ceph-mgr created
rolebinding.rbac.authorization.k8s.io/rook-ceph-mgr-system created
rolebinding.rbac.authorization.k8s.io/rook-ceph-osd created
rolebinding.rbac.authorization.k8s.io/rook-ceph-purge-osd created
rolebinding.rbac.authorization.k8s.io/rook-ceph-system created
serviceaccount/objectstorage-provisioner created
serviceaccount/rook-ceph-cmd-reporter created
serviceaccount/rook-ceph-default created
serviceaccount/rook-ceph-mgr created
serviceaccount/rook-ceph-osd created
serviceaccount/rook-ceph-purge-osd created
serviceaccount/rook-ceph-rgw created
serviceaccount/rook-ceph-system created
serviceaccount/rook-csi-cephfs-plugin-sa created
serviceaccount/rook-csi-cephfs-provisioner-sa created
serviceaccount/rook-csi-rbd-plugin-sa created
serviceaccount/rook-csi-rbd-provisioner-sa created

5. Rook Operator를 배포합니다.

$ kubectl apply -f operator.yaml

configmap/rook-ceph-operator-config created
deployment.apps/rook-ceph-operator created

이제 Rook Operator는 Kubernetes 클러스터에 관련 custom resource가 배포되면, 해당 구성에 맞는 리소스를 자동으로 구성합니다.

5. Rook Ceph 클러스터 구성

Rook Ceph 클러스터는 custom resource인 CephCluster 리소스를 통해 구성할 수 있습니다. 해당 리소스에는 Rook Operator가 스토리지를 구성하는 방식이 정의되어 있습니다.
Rook 배포 과정에서 다운받은 파일에 다양한 CephCluster 구성 yaml이 포함되어 있습니다.

  • cluster.yaml 파일은 프로덕션 환경에 맞는 기본 구성으로, 최소 3개의 워커 노드가 필요합니다.
  • cluster-test.yaml 파일은 redundancy 구성이 되지 않은 테스트 클러스터 세팅으로 하나의 워커 노드를 필요로 합니다.

이외의 CephCluster 예제 yaml 파일에 대한 자세한 내용은 공식 문서를 참고하세요.

cluster.yaml 파일을 Kubernetes 클러스터에 배포하여 cephcluster 리소스를 배포합니다.

$ kubectl apply -f cluster.yaml

cephcluster.ceph.rook.io/rook-ceph created

배포 시 전체 배포가 완료되기까지 몇 분 가량 시간이 소요되며, 배포 완료 시 다음과 같이 다양한 Pod가 Deployment, DamonSet, Job에 의해 구성 됩니다.

$ kubectl get po -n rook-ceph 

NAME                                                       READY   STATUS      RESTARTS   AGE

# DaemonSet
csi-cephfsplugin-24grx                                     3/3     Running     0          47h
csi-cephfsplugin-fsglg                                     3/3     Running     0          47h
csi-cephfsplugin-m892l                                     3/3     Running     0          47h
csi-cephfsplugin-sxc6z                                     3/3     Running     0          47h

# Deployment
csi-cephfsplugin-provisioner-5f589446b4-5nlkz              6/6     Running     0          47h
csi-cephfsplugin-provisioner-5f589446b4-znqvv              6/6     Running     0          47h

# DaemonSet
csi-rbdplugin-9ccdj                                        3/3     Running     0          47h
csi-rbdplugin-p47vr                                        3/3     Running     0          47h
csi-rbdplugin-qn8jh                                        3/3     Running     0          47h
csi-rbdplugin-zqb5z                                        3/3     Running     0          47h

# Deployment
csi-rbdplugin-provisioner-bb8f8f69d-5bmgj                  6/6     Running     0          47h
csi-rbdplugin-provisioner-bb8f8f69d-h8ghv                  6/6     Running     0          47h

# DaemonSet
rook-ceph-crashcollector-workernode11-1-d8b97df5c-kvkh9    1/1     Running     0          47h
rook-ceph-crashcollector-workernode11-2-7675f85744-vsn29   1/1     Running     0          47h
rook-ceph-crashcollector-workernode12-1-69d88bc9fb-9xh6p   1/1     Running     0          47h
rook-ceph-crashcollector-workernode12-2-68875599ff-hbgtf   1/1     Running     0          47h

# DaemonSet
rook-ceph-exporter-workernode11-1-7cd8cd7d8c-ch5fs         1/1     Running     0          47h
rook-ceph-exporter-workernode11-2-7586577958-kjw5m         1/1     Running     0          47h
rook-ceph-exporter-workernode12-1-6684986974-pfzcq         1/1     Running     0          47h
rook-ceph-exporter-workernode12-2-d74d7f8f-jv5x4           1/1     Running     0          47h

# Deployment
rook-ceph-mgr-a-66c65b66cc-2lhwk                           3/3     Running     0          47h
rook-ceph-mgr-b-5c4678c66-5mrl2                            3/3     Running     0          47h

# Deployment
rook-ceph-mon-a-d86fd8599-c79kj                            2/2     Running     0          47h
rook-ceph-mon-b-745874f6b-j9ks5                            2/2     Running     0          47h
rook-ceph-mon-c-f6b977b6-xscnx                             2/2     Running     0          47h

# Deployment- 이전 과정에서 배포됨
rook-ceph-operator-67944bdfcc-72wql                        1/1     Running     0          47h

# Deployment
rook-ceph-osd-0-659bb7c846-46rrb                           2/2     Running     0          47h
rook-ceph-osd-1-68974b8976-2swt5                           2/2     Running     0          47h

# Job
rook-ceph-osd-prepare-workernode11-1-qw2bg                 0/1     Completed   0          47h
rook-ceph-osd-prepare-workernode11-2-d98qd                 0/1     Completed   0          47h
rook-ceph-osd-prepare-workernode12-1-zj7dr                 0/1     Completed   0          47h
rook-ceph-osd-prepare-workernode12-2-b92rn                 0/1     Completed   0          47h
CSI (Container Storage Interface) 관련 Pod
  • csi-cephfsplugin-* : CephFS(파일 스토리지)용 CSI 노드 플러그인으로, CephFS 볼륨을 마운트하고 관리
  • csi-cephfsplugin-provisioner-* : CephFS 볼륨을 생성하고 관리하는 프로비저너
  • csi-rbdplugin-* : RBD(블록 스토리지)용 CSI 노드 플러그인으로, RBD 볼륨을 노드에 마운트
  • csi-rbdplugin-provisioner-* : RBD 볼륨을 생성하고 관리하는 프로비저너
Ceph 클러스터 핵심 Pod
  • rook-ceph-mon-* : Ceph 모니터(MON) 역할을 수행, 클러스터 상태 및 구성 정보를 관리
  • rook-ceph-mgr-* : Ceph 매니저(MGR) 역할 수행, Ceph의 상태 모니터링 및 웹 대시보드 제공
  • rook-ceph-osd-* : Ceph OSD(Object Storage Daemon) 역할 수행, 데이터를 저장하고 복제하는 역할
  • rook-ceph-osd-prepare-* : OSD를 초기화하고 디스크를 Ceph에서 사용할 수 있도록 설정하는 역할로 디스크 마운트, 파티셔닝, OSD ID 할당 등의 작업 수행
  • rook-ceph-exporter-* : Ceph 클러스터의 상태 및 성능 데이터를 수집. Prometheus 형태로 메트릭을 내보내도록 설정할 수 있음
  • rook-ceph-crashcollector-* : Ceph OSD, MON, MGR 등의 구성 요소에서 장애(Crash)가 발생하면 로그를 수집

배포가 완료된 후 Rook Ceph 클러스터의 상태를 확인하기 위해 Rook toolbox Pod를 클러스터에 배포하고, ceph status 명령어를 사용하여 확인할 수 있습니다.

$ kubectl apply -f toolbox.yaml

deployment.apps/rook-ceph-tools created

$ kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash

bash-5.1$ ceph status

  cluster:
    id:     0b3375d0-1aae-4b1d-9368-8eaa610f2ea3
    health: HEALTH_WARN
            OSD count 2 < osd_pool_default_size 3

  services:
    mon: 3 daemons, quorum a,b,c (age 2m)
    mgr: a(active, since 35s), standbys: b
    osd: 2 osds: 2 up (since 55s), 2 in (since 89s)

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   53 MiB used, 60 GiB / 60 GiB avail
    pgs:

위 예시 출력의 경우 최소 3개의 워커 노드에 스토리지 구성이 필요하나, 2개의 워커 노드만 구성되어 HEALTH_WARN 상태가 나타납니다.

클러스터의 상태에 문제가 없을 시 아래와 같이 출력됩니다.

$ ceph status

  cluster:
    id:     a0452c76-30d9-4c1a-a948-5d8405f19a7c
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum a,b,c (age 3m)
    mgr:a(active, since 2m), standbys: b
    osd: 3 osds: 3 up (since 1m), 3 in (since 1m)

[]...]

6. 결론

이번 포스트에서는 Kubernetes 클러스터에 Rook Ceph 클러스터를 배포하여 워커 노드의 스토리지를 활용하는 Ceph 기반의 분산 스토리지 시스템을 구성하는 방법을 알아봤습니다.

저 Ceph와 Rook의 개념 및 구성 요소를 살펴본 후, Rook의 GitHub 리포지토리에서 배포 파일을 다운로드하여 클러스터에 적용하는 방법과 생성되는 리소스에 대해 설명했습니다.

Rook Ceph 클러스터를 활용하면 추가적인 전용 스토리지 없이 Kubernetes 환경에서 Ceph 기반의 고가용성 스토리지를 구축할 수 있으며, 이를 통해 클러스터 내부의 Pod에서 효율적으로 스토리지를 활용할 수 있습니다.

다음 포스트에서는 Rook을 통해 다양한 유형의 스토리지를 구성하는 방법과 실제로 Pod에서 해당 스토리지를 사용하는 방안을 자세히 살펴보겠습니다.

Kubernetes 클러스터 운영에 어려움을 겪고계신가요? 지금 NGINX STORE를 통해 문의해 Kubernetes 기술지원 서비스에 대해 알아보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required