Ceph 개요 및 구축하기

Ceph이란? #

완전히 분산되고, 확장성과 고가용성을 지향하는 storage platform

핵심 목표

  • 단일 클러스터에서 Object Storage, Block Storage, File System 모두 제공
  • 분산성, Self-Healing, 무중단 확장을 기본 설계 철학으로 둠
  • 하드웨어에 종속되지 않고 x86 서버 + disk 조합으로 대규모 스토리지 시스템 구축 가능

주요 특징

  • CRUSH 알고리즘(Controlled Replication Under Scalable Hashing) 기반 분산 데이터 맵핑.
  • 별도의 중앙 메타데이터 서버 없이 데이터 위치 결정 (Object Storage).
  • 장애 발생 시 자동 복구(Self Healing).
  • 수평 확장(linear scalability) 가능 (노드 추가만으로 확장).
  • 다양한 인터페이스 제공: S3 호환(Object), RBD(Block), CephFS(File System).

Ceph의 구성요소 #

컴포넌트설명
MON (Monitor)Ceph 클러스터의 맵 관리와 Quorum(합의)을 담당.
- 모든 클러스터 상태(MAP) 저장
- 3개 이상 추천 (항상 홀수)
MGR (Manager)Ceph의 상태 모니터링, 모듈 관리 담당.
- 대시보드, 모니터링 통합, Prometheus Exporter 제공
- 1 active + 1 standby 형태로 구성 추천
OSD (Object Storage Daemon)실제 데이터 저장.
- 물리 디스크 하나당 1 OSD 프로세스
- Ceph Pool 복제(replication), 데이터 복구, 리밸런싱 담당
MDS (Metadata Server)CephFS(파일시스템) 메타데이터 관리.
- 블록/오브젝트는 필요 없음. CephFS 쓸 때만 필요
RGW (Rados Gateway)S3, Swift API를 제공하는 게이트웨이.
- 오브젝트 스토리지 접속용 서비스
CSI DriverKubernetes PVC를 Ceph RBD, CephFS와 연결하는 역할.
- Rook Operator가 자동으로 설치
저장 방식필요한 컴포넌트
Block Storage (RBD)MON, MGR, OSD
Object Storage (S3)MON, MGR, OSD, RGW
File Storage (CephFS)MON, MGR, OSD, MDS
helm repo add {rook_repo명} https://charts.rook.io/release

helm install {rook-ceph_chart명} rook/rook-ceph --version 1.17.0

Ceph 구축하기 #

ceph-cluster.yaml
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: quay.io/ceph/ceph:v19.2.2
    allowUnsupported: false
  dataDirHostPath: /var/lib/rook
  skipUpgradeChecks: false
  continueUpgradeAfterChecksEvenIfNotHealthy: false
  mon:
    count: 3
    allowMultiplePerNode: false
  mgr:
    count: 2
    allowMultiplePerNode: false
  dashboard:
    enabled: true
    ssl: false
  monitoring:
    enabled: false
  network:
    connections:
      encryption:
        enabled: false
      compression:
        enabled: false
      requireMsgr2: false
  crashCollector:
    disable: false
  logCollector:
    enabled: true
    periodicity: daily
    maxLogSize: 500M
  cleanupPolicy:
    confirmation: ""
    sanitizeDisks:
      method: quick
      dataSource: zero
      iteration: 1
    allowUninstallWithVolumes: false
  removeOSDsIfOutAndSafeToRemove: false
  priorityClassNames:
    mon: system-node-critical
    osd: system-node-critical
    mgr: system-cluster-critical
  storage:
    useAllNodes: true
    useAllDevices: true
    config:
      # 필요한 경우 여기에 추가 설정 가능 (ex. databaseSizeMB)
    allowDeviceClassUpdate: false
    allowOsdCrushWeightUpdate: false
    scheduleAlways: false
    onlyApplyOSDPlacement: false
  disruptionManagement:
    managePodBudgets: true
    osdMaintenanceTimeout: 30
  csi:
    readAffinity:
      enabled: false
    cephfs:
      # fuseMountOptions, kernelMountOptions 설정 가능 (기본은 비워둠)
  healthCheck:
    daemonHealth:
      mon:
        disabled: false
        interval: 45s
      osd:
        disabled: false
        interval: 60s
      status:
        disabled: false
        interval: 60s
    livenessProbe:
      mon:
        disabled: false
      mgr:
        disabled: false
      osd:
        disabled: false
    startupProbe:
      mon:
        disabled: false
      mgr:
        disabled: false
      osd:
        disabled: false

좀 더 간단하게 하고싶다면,

ceph-cluster-short.yaml
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: quay.io/ceph/ceph:v19.2.2
  dataDirHostPath: /var/lib/rook
  mon:
    count: 3
    allowMultiplePerNode: false
  dashboard:
    enabled: true
    ssl: false
  storage:
    useAllNodes: true
    useAllDevices: true
    config: {}
  disruptionManagement:
    managePodBudgets: true

하지만 현재 상황에서 리소스가 여유롭진 않으니,

ceph-cluster-limit.yaml
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: quay.io/ceph/ceph:v18.2.2
    allowUnsupported: false
  dataDirHostPath: /var/lib/rook

  mon:
    count: 3
    allowMultiplePerNode: false

  mgr:
    count: 1
    allowMultiplePerNode: false

  dashboard:
    enabled: true
    ssl: false

  crashCollector:  # 🔻 비활성화
    disable: true

  logCollector:
    enabled: true
    periodicity: daily
    maxLogSize: 500M

  storage:
    useAllNodes: true
    useAllDevices: false
    deviceFilter: "vdb"
    config:
      osdsPerDevice: "1"

  disruptionManagement:
    managePodBudgets: true
    osdMaintenanceTimeout: 30

  priorityClassNames:
    mon: system-node-critical
    osd: system-node-critical
    mgr: system-cluster-critical

  healthCheck:
    daemonHealth:
      mon:
        disabled: false
        interval: 45s
      osd:
        disabled: false
        interval: 60s
      status:
        disabled: false
        interval: 60s

  resources:  # 🔧 각 데몬별 리소스 제한
    mgr:
      limits:
        cpu: "250m"
        memory: "256Mi"
      requests:
        cpu: "100m"
        memory: "128Mi"
    mon:
      limits:
        cpu: "500m"
        memory: "512Mi"
      requests:
        cpu: "250m"
        memory: "256Mi"
    osd:
      limits:
        cpu: "1000m"
        memory: "2Gi"
      requests:
        cpu: "500m"
        memory: "1Gi"

적용 포인트 #

항목설정 내용
Namespacerook-ceph
Ceph Versionv19.2.2 (Squid 최신 안정판)
Mon Count3개
Mgr Count2개 (Active + Standby)
OSD 구성useAllDevices: true (vdb 자동 인식)
Dashboard활성화, SSL 끄기 (HTTP)
Disk Encryption사용 안 함 (내부망 고려)
Monitoring비활성화 (Prometheus 아직 설치 안 되어 있음)
CrashCollector/LogCollector활성화
Disruption Management활성화 (PodDisruptionBudget 적용)
CleanUp Policy기본값 (데이터 보존)
Future ExpansionWorker, OSD 추가 용이하게 설정

“If you want all nodes and all available devices to be used automatically, set useAllNodes: true and useAllDevices: true. Specifying nodes: list is only necessary when you want fine-grained control over device selection.”"

  • 현재 worker 3,4,5만 vdb가 추가되어있어서 자동으로 w3,w4,w5에만 OSD가 생성됨
  • 추가로 w6, w7에 vdb 추가하면 자동으로 OSD도 확장됨
항목일반 설정 이유
skipUpgradeChecks: false업그레이드 시 cluster health 체크함 (안정성)
allowMultiplePerNode: false같은 노드에 MON 2개 생성 방지 (HA 보장)
dashboard.ssl: false내부망이면 SSL 불필요, 운영 편의성
useAllDevices: true자동 디바이스 인식, 디스크 추가시 확장성
managePodBudgets: truePodDisruptionBudget 적용, 장애/노드Drain 시 안정성
logCollector: enabled: true장애 분석 위해 daemon 로그 파일 저장
crashCollector: disable: falsecrash 발생 시 crash report 수집
healthCheck: 활성화MON, OSD, MGR 주기적으로 상태 점검