---
title: "Ceph 클러스터 설치 및 구성: 분산 스토리지 시스템 마스터하기"
description: "Ceph는 오픈소스 분산 스토리지로, 블록, 파일, 객체 서비스를 하나의 시스템에서 제공하며, Cephadm을 이용해 Docker/Podman 컨테이너 기반으로 쉽게 설치·관리할 수 있다. 최소 3노드 구성과 시간 동기화, SSH 키 배포가 필요하고, Bootstrap으로 첫 노드를 초기화한 뒤 다른 노드와 디스크를 OSD로 추가한다. public network와 별도 cluster network를 설정하면 성능이 향상되며, 설정 변경 시 모니터·매니저·OSD를 순차적으로 재시작해야 한다. 전체 과정은 사전 요구사항 점검, Cephadm 설치·Bootstrap, 호스트·OSD 추가, 필요시 네트워크 분리 구성으로 요약된다."
date: "2025-06-18"
last_modified: "2026-05-15T08:36:00.000Z"
type: "Post"
tags:
  - "ceph"
  - "docker"
  - "ubuntu"
  - "python"
  - "install"
  - "LVM"
  - "storage"
categories:
  - "📗 Docs"
series:
  - "ceph"
canonical_url: "https://blog.pieroot.xyz/ceph-cluster-setup"
markdown_url: "https://blog.pieroot.xyz/ceph-cluster-setup.md"
---

# Ceph 클러스터 설치 및 구성: 분산 스토리지 시스템 마스터하기

Ceph는 오픈소스 분산 스토리지로, 블록, 파일, 객체 서비스를 하나의 시스템에서 제공하며, Cephadm을 이용해 Docker/Podman 컨테이너 기반으로 쉽게 설치·관리할 수 있다. 최소 3노드 구성과 시간 동기화, SSH 키 배포가 필요하고, Bootstrap으로 첫 노드를 초기화한 뒤 다른 노드와 디스크를 OSD로 추가한다. public network와 별도 cluster network를 설정하면 성능이 향상되며, 설정 변경 시 모니터·매니저·OSD를 순차적으로 재시작해야 한다. 전체 과정은 사전 요구사항 점검, Cephadm 설치·Bootstrap, 호스트·OSD 추가, 필요시 네트워크 분리 구성으로 요약된다.

## Ceph란?

[Intro to Ceph &mdash; Ceph Documentation](https://docs.ceph.com/en/latest/start/)

안녕하세요! 오늘은 분산 스토리지 시스템인 **Ceph**를 직접 설치하고 구성하는 방법을 공유하려고 합니다.

Ceph는 클라우드 플랫폼에 스토리지를 제공하기 위한 오픈소스 소프트웨어입니다. **블록 디바이스(RBD)**, **파일시스템(CephFS)**, **객체 스토리지(RGW)** 와 같은 다양한 스토리지 서비스를 하나의 통합된 시스템에서 제공할 수 있다는 것이 가장 큰 장점이죠.

![image](https://blog.pieroot.xyz/api/image-proxy?id=0e268f98-95a5-449b-9a33-6f217d3fc1c9&kind=s3&pageId=216067c0-15d0-80a8-a80d-d5f7cf9d4db2&source=block&blockId=216067c0-15d0-8003-91be-c081d051ffc4)

> **Ceph의 핵심 구성 요소**
> 
> - **OSD (Object Storage Daemon)**: 실제 데이터를 저장하는 데몬으로, 각 디스크마다 하나씩 생성됩니다
> 
> - **MON (Monitor)**: 클러스터 맵의 마스터 복사본을 유지하고 클러스터 상태를 관리합니다
> 
> - **MGR (Manager)**: 대시보드, 모니터링, 클러스터 관리 기능을 담당합니다
> 
> - **MDS (Metadata Server)**: CephFS 사용 시 파일 메타데이터를 관리합니다

Ceph에 관한 기본 개념은 공식 문서에 상세히 정리되어 있으므로, 이 글에서는 **실제 설치 방법과 활용 방안**에 초점을 맞춰 설명하겠습니다.

---

### 🖥️ 구성 환경

Ceph 클러스터를 위해 구성한 초기 환경은 다음과 같습니다.

메모리와 디스크 용량이 제각각인 이유는 처음에 2노드로 구성하려다가 3노드로 변경하면서 장비를 재분배했기 때문입니다. Ceph는 **RAID를 사용하지 않고** 자체적인 복제 메커니즘(CRUSH 알고리즘)을 통해 데이터 안정성을 보장합니다. 따라서 노드마다 디스크 개수나 용량이 달라도 정상적으로 동작합니다.

> **권장 사항**: Ceph 클러스터는 최소 **3개 이상의 노드**로 구성하는 것이 좋습니다. 이는 데이터 복제 및 쿼럼(Quorum) 유지에 필요한 최소 조건입니다.

---

### 📋 사전 요구사항 (Requirements)

Cephadm은 **Docker** 또는 **Podman**을 사용하여 컨테이너 내에서 Ceph 클러스터를 운영합니다. 따라서 호스트 OS 종류에 크게 영향받지 않으며, 다음 요구사항만 충족하면 됩니다.

> **필수 요구사항**
> 
> - Python 3
> 
> - Systemd
> 
> - Podman 또는 Docker
> 
> - 시간 동기화 (chrony 또는 NTP)
> 
> - LVM2 (스토리지 디바이스 프로비저닝용)

#### Docker 설치

[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

Docker는 위 공식 문서를 따라 설치하면 됩니다. Ceph는 root 권한으로 실행되므로 일반 사용자 계정에 docker 그룹 권한을 추가할 필요는 없습니다.

Docker가 예기치 못하게 종료되거나 재시작되어도 Ceph가 정상 동작하도록 **Live Restore** 기능을 활성화하는 것을 권장합니다.

[Live restore](https://docs.docker.com/engine/daemon/live-restore/)

Learn how to keep containers running when the daemon isn

```bash
# /etc/docker/daemon.json 파일에 추가
{
  "live-restore": true
}
```

#### Python3

Ubuntu 18.04 이상에는 Python이 기본으로 설치되어 있습니다. 혹시 없다면 아래 명령어로 설치하세요.

```bash
sudo apt install python3 python3-pip -y
```

#### 시간 동기화 (chrony)

분산 시스템에서 **시간 동기화는 매우 중요**합니다. 노드 간 시간 차이가 발생하면 클러스터 동작에 문제가 생길 수 있습니다. 저는 기존 OpenStack 환경에서 사용 중인 chrony를 활용했습니다.

```bash
# chrony 설치
sudo apt update
sudo apt install chrony -y

# 설정 파일 편집
sudo vi /etc/chrony/chrony.conf
```

설정 파일 맨 아래에 NTP 서버 주소를 추가합니다.

```
server dms-controller iburst
```
*/etc/hosts 파일에 호스트네임이 설정 되어있어야한다.*

설정을 저장한 후 서비스를 재시작합니다.

```bash
sudo systemctl restart chrony.service
```

정상적으로 NTP 서버에 연결되었는지 확인합니다.

```bash
sudo chronyc sources
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=ebf33aa2-498b-49f1-adb6-59348910bfe7&kind=s3&pageId=216067c0-15d0-80a8-a80d-d5f7cf9d4db2&source=block&blockId=216067c0-15d0-80dd-b228-f0a48c6ccb16)

출력 결과에서 `^*` 기호가 서버명 앞에 표시되면 정상적으로 동기화된 것입니다.

> **중요**: 모든 Ceph 노드에서 동일한 NTP 설정을 수행해야 합니다!

---

### 🚀 Cephadm 설치

현재 Ceph를 설치하는 방법은 크게 두 가지가 있습니다.

이 글에서는 **Cephadm**을 사용하여 Ceph 클러스터를 구성합니다.

[Using Cephadm to Deploy a New Ceph Cluster &mdash; Ceph Documentation](https://docs.ceph.com/en/latest/cephadm/install/)

Cephadm 설치는 아래 명령어로 간단히 진행할 수 있습니다.

```bash
# 최신 안정 버전으로 설치하는 것을 권장합니다
CEPH_RELEASE=18.2.0
curl --silent --remote-name --location https://download.ceph.com/rpm-${CEPH_RELEASE}/el9/noarch/cephadm

chmod +x cephadm
./cephadm install
```

curl 외에도 apt나 dnf를 통한 설치도 가능하지만, 위 방법이 호스트 OS 환경에 덜 의존적입니다.

설치가 완료되면 정상 설치 여부를 확인합니다.

```bash
# cephadm 경로 확인
which cephadm
# 출력: /usr/sbin/cephadm

# 도움말 확인
cephadm -h
```

---

### 🏗️ 클러스터 Bootstrap

Cephadm이 정상적으로 설치되었다면, `bootstrap` 명령어로 첫 번째 노드에 Ceph 클러스터를 생성합니다.

```bash
cephadm bootstrap --mon-ip <mon-ip>
```

`--mon-ip`는 **Monitor 데몬의 수신 IP 주소**를 의미합니다. 이 IP는 클러스터의 첫 번째 진입점이 됩니다.

#### ⚡ Public Network vs Cluster Network

여기서 반드시 이해하고 넘어가야 할 중요한 개념이 있습니다. Ceph는 두 가지 네트워크를 사용합니다.

> **Public Network**: 클라이언트와 통신하는 네트워크. 외부에서 Ceph 서비스에 접근할 때 사용됩니다.
> 
> **Cluster Network**: OSD 간의 내부 통신 전용 네트워크. 데이터 복제, 복구, 하트비트 처리에 사용됩니다.

Bootstrap 시 `--mon-ip`만 지정하면 public network만 설정됩니다. 이 경우 **모든 트래픽이 하나의 네트워크로 집중**되어 성능이 크게 저하될 수 있습니다.

![image](https://blog.pieroot.xyz/api/image-proxy?id=c5b22358-ba52-4309-affb-6372ad72cdd6&kind=s3&pageId=216067c0-15d0-80a8-a80d-d5f7cf9d4db2&source=block&blockId=216067c0-15d0-8027-b761-f0c702351b73)

실제 서비스 환경에서는 OSD 간에 지속적으로 데이터를 이동하고 복제해야 합니다. Public network로 모든 통신을 처리하면 클라이언트 요청과 내부 복제 트래픽이 경합하여 시스템이 극도로 느려집니다.

> **권장 사항**: 처음부터 cluster network를 분리하여 구성하세요!
> 
> ```bash
> cephadm bootstrap --mon-ip 172.30.2.101 --cluster-network 10.10.10.0/24
> ```

하지만 이 글에서는 처음에 mon-ip만 설정한 경우를 가정하고 진행하겠습니다. (나중에 cluster network를 추가하는 방법도 설명합니다.)

```bash
cephadm bootstrap --mon-ip 172.30.2.101
```

명령어를 실행하고 잠시 기다리면 자동으로 필요한 컨테이너들이 생성되고 구동됩니다. Bootstrap이 완료되면 **대시보드 접속 정보**와 **초기 관리자 비밀번호**가 출력됩니다.

---

### 💻 Ceph CLI 활성화

Cephadm을 사용하면 호스트에 ceph 패키지를 별도로 설치하지 않아도 됩니다. Ceph 명령어는 컨테이너 내에서 실행되므로, 다음 명령어로 ceph shell에 접근할 수 있습니다.

```bash
cephadm shell
```

하지만 매번 shell에 접근하는 것은 번거로우므로, **ceph-common** 패키지를 설치하여 호스트에서 직접 명령어를 실행할 수 있게 합니다.

```bash
# Ceph 저장소 추가 (squid는 최신 LTS 릴리즈)
cephadm add-repo --release squid
cephadm install ceph-common
```

> **참고**: Ceph 릴리즈 버전은 알파벳 순서로 명명됩니다. 주요 릴리즈로는 Pacific → Quincy → **Reef** → **Squid** 등이 있습니다. 가능하면 LTS(Long Term Support) 버전을 사용하세요.

---

### 🖧 호스트 추가

- Host Management — Ceph Documentation

3개의 노드를 준비했으므로, bootstrap으로 설정한 1번 노드에 2번, 3번 노드를 추가해야 합니다.

Cephadm은 SSH를 통해 원격 노드에 자동으로 Ceph 컴포넌트를 배포합니다. 따라서 먼저 **SSH 키를 다른 노드에 복사**해야 합니다.

```bash
# Ceph용 SSH 키가 없다면 생성
# ssh-keygen -f /etc/ceph/ceph.pub

# 다른 노드에 SSH 키 복사
ssh-copy-id -f -i /etc/ceph/ceph.pub root@172.30.2.102
ssh-copy-id -f -i /etc/ceph/ceph.pub root@172.30.2.103
```

> **주의**: SSH 데몬은 기본적으로 패스워드 인증과 root 로그인을 차단합니다. 필요하다면 `/etc/ssh/sshd_config`에서 `PermitRootLogin yes`와 `PasswordAuthentication yes`를 설정하세요.
> 
> cloud-init 환경이라면 `/etc/ssh/sshd_config.d/50-cloud-init.conf` 파일도 확인하세요.

SSH 키 복사가 완료되면 Ceph 클러스터에 새 노드를 추가합니다.

```bash
ceph orch host add dms-storage2 172.30.2.102
ceph orch host add dms-storage3 172.30.2.103
```

노드가 추가되면 Ceph가 자동으로 필요한 서비스들을 배포합니다. 이 과정에서 기존 PG(Placement Group)와 OSD 내 오브젝트들의 위치를 재정리하고 분배하므로 **시간이 다소 소요**됩니다.

클러스터 상태는 다음 명령어로 확인할 수 있습니다.

```bash
ceph -s
# 또는
ceph orch host ls
```

---

### 💾 OSD 추가

클러스터에 노드가 추가되었다고 끝이 아닙니다. 각 노드의 **디스크를 OSD로 등록**해야 실제로 데이터를 저장할 수 있습니다.

모든 가용 디바이스를 OSD로 자동 추가하려면 다음 명령어를 사용합니다.

```bash
ceph orch apply osd --all-available-devices
```

이 명령어는 부팅 디스크를 제외한 **사용 가능한 모든 디스크**를 OSD로 등록합니다.

> **OSD로 사용 가능한 디스크 조건**
> 
> - 파티션이 없어야 함
> 
> - LVM 논리 볼륨이 없어야 함
> 
> - 파일시스템이 없어야 함
> 
> - Ceph BlueStore OSD가 없어야 함
> 
> - 마운트되어 있지 않아야 함

OSD 상태는 다음 명령어로 확인합니다.

```bash
ceph osd tree
ceph osd status
```

---

### 🔧 Cluster Network 나중에 추가하기

처음에 public network만 구성하고 cluster network를 설정하지 않았다면, 모든 트래픽이 하나의 네트워크로 집중되어 성능이 크게 저하됩니다. 이 섹션에서는 **운영 중인 클러스터에 cluster network를 추가하는 방법**을 설명합니다.

> **주의**: 이 작업은 클러스터 서비스에 일시적인 영향을 줄 수 있습니다. 가능하면 트래픽이 적은 시간대에 진행하세요.

아래 모든 과정은 `cephadm shell` 내에서 또는 ceph-common이 설치된 호스트에서 수행합니다.

#### 1단계: 네트워크 설정 추가

```bash
# Public network와 Cluster network 설정
ceph config set global public_network 172.30.0.0/16
ceph config set global cluster_network 10.10.10.0/24

# 설정 확인
ceph config dump | grep network
```

> **왜 45초를 기다릴까요?**
> 
> Ceph는 데몬 수가 변경되면 쿼럼 체크와 데이터 재분배가 발생합니다. 이 과정이 안정화되고 `HEALTH_OK` 상태가 될 때까지 기다려야 다음 데몬을 안전하게 재시작할 수 있습니다.

- image.png

#### 2단계: Monitor 데몬 재시작

설정만 변경해서는 바로 적용되지 않습니다. 각 노드의 **Monitor 데몬을 순차적으로 재시작**해야 합니다.

```bash
# 한 번에 하나씩, 45초 간격으로 재시작
ceph orch daemon restart mon.dms-storage3
sleep 45
ceph -s

ceph orch daemon restart mon.dms-storage2
sleep 45
ceph -s

ceph orch daemon restart mon.dms-storage1
sleep 45
ceph -s
```

```bash
ceph orch restart osd.all-available-devices
```

- image.png

#### 3단계: Manager 재시작

```bash
ceph orch restart mgr
```

#### 4단계: OSD 재시작

마지막으로 OSD를 재시작하여 새로운 cluster network 설정을 적용합니다.

- image.png

재시작이 완료되면 OSD들이 cluster network를 통해 통신하는 것을 확인할 수 있습니다.

- image.png

---

### 🎯 마무리

지금까지 Cephadm을 사용하여 Ceph 클러스터를 구축하는 방법을 살펴보았습니다.

> **정리**
> 
> 1. 사전 요구사항 확인 (Docker, Python3, chrony)
> 
> 1. Cephadm 설치
> 
> 1. Bootstrap으로 첫 번째 노드 초기화
> 
> 1. SSH 키 배포 후 추가 노드 등록
> 
> 1. OSD 추가로 스토리지 활성화
> 
> 1. (선택) Cluster network 분리 구성

Cephadm 덕분에 Ceph 설치와 관리가 과거에 비해 훨씬 편리해졌습니다. 하지만 개인 환경에서 사용하기에는 다소 무겁고, OpenStack 같은 **클라우드 플랫폼과 함께 사용할 때 진가를 발휘**합니다.

다음 글에서는 OpenStack Cinder와 Ceph를 연동하는 방법, 그리고 RGW(Object Storage)를 구성하는 방법을 다룰 예정입니다.

---

#### 📚 참고 자료

- [Ceph 공식 문서 - Cephadm](https://docs.ceph.com/en/latest/cephadm/)

- [Ceph Network Configuration](https://docs.ceph.com/en/latest/rados/configuration/network-config-ref/)

- [오픈소스컨설팅 - Ceph-Ansible로 Ceph 구축해보기](https://tech.osci.kr/ceph-ansible%25EB%25A1%259C-ceph-%25EA%25B5%25AC%25EC%25B6%2595%25ED%2595%25B4%25EB%25B3%25B4%25EA%25B8%25B0/)
