Ceph란?
SAN(Block:RDB) + NAS(File:CephFS) + Object Storage(S3:RGW)를 하나의 클러스터에서 제공하는 것이 Ceph의 핵심 가치
RGW = RADOS Gateway
- RADOS를 이해하면 Ceph 구조가 한 번에 정리된다.
- RADOS = Reliable Autonomic Distributed Object Store
- 쉽게 말하면 핵심 저장 엔진
Ceph 아키텍쳐
Ceph 계층으로 표현
RBD (/dev/rbd0)
↑
CephFS (/data)
↑
RGW (S3 API)
↑
---------------------------------
RADOS
---------------------------------
↑
OSD + CRUSH
↑
HDD / SSD / NVMe
RBD, CephFS, RGW는 전부 RADOS 위에 만들어진 서비스다.
Ceph 내부의 진짜 저장 단위는 전부 Object다.
RBD, CephFS, RGW가 겉으로는 다르게 보이지만, 결국 OSD에 저장될 때는 모두 RADOS Object로 쪼개진다.
사용자 관점
------------------------------------------------
RBD = Block Device (/dev/rbd0)
CephFS = File System (/data/a.txt)
RGW = S3 Object (bucket/file.jpg)
↓ 변환
Ceph 내부
------------------------------------------------
RADOS Object
RADOS Object
RADOS Object
...
↓
OSD
Ceph 클러스터 구조도
Ceph Cluster
┌───────────────────┐
│ MON │
│ MGR │
│ OSD │
└───────────────────┘
↑ ↑ ↑
RBD CephFS RGW
(Block) (File) (Object)
SAN NAS S3
스토리지 서비스
CephFS (파일 스토리지)
- NFS 같은 공유 파일시스템
- Pod A -> RWX -> CephFS
Pod B -> RWX / - ex) Jenkins 공유 workspace, AI 모델 공유, 웹서버 정적 파일 공유, 여러 Pod가 같은 파일 접근
RBD (블록 RADOS Block Device)
- Kubernetes PVC, VM 디스크
- PVC -> RBD Image -> OS 입장에서는 디스크
- ex) MySQL, PostgreSQL, ElasticSearch, VM Disk
RGW (오브젝트 RADOS Gateway)
- S3 호환 Object Storage (로그, 백업, 이미지 등)
- S3 API -> RGW -> Ceph Object
- ex) 로그 저장, 백업, 이미지 저장, AI 데이터셋
NFS Gateway
- Ceph 고유 스토리지는 아니고 CephFS -> NFS-Ganesha -> NFS Export 형태로 외부 서버에 NFS 제공 가능
- 레거시 서버, Windows/Linux 파일 공유
iSCSI Gateway
- Ceph RDB -> iSCSI Gateway -> 외부 서버
- VMware나 물리 서버가 iSCSI LUN처럼 사용
쿠버네티스 기준
쿠버네티스 기준으로 많이 사용되는 형태는 아래와 같다.
| 형태 | Ceph 기능 | K8s AccessMode |
| Block | RBD | RWO |
| File | CephFS | RWX |
| Object | RGW | PVC 없음(S3 API) |
RGW(RADOS Gateway) 로그 저장이 필요한 경우에는 애플리케이션 Pod에 Fluent Bit, Fluentd, Vector 등의 로그 수집기를 사이드카 또는 DaemonSet 형태로 구성하고, 애플리케이션이 생성한 로그 파일(또는 stdout 로그)을 수집하여 S3 API를 통해 RGW 버킷으로 전송하는 방식을 사용한다.
예를 들어 애플리케이션이 /var/log/app/app.log 에 로그를 남기고, Fluent Bit이 이를 수집해서 Ceph RGW(S3)로 업로드하는 구조다.
+------------------------+
| Application Container |
| |
| /var/log/app/app.log |
+-----------+------------+
|
| shared volume
v
+------------------------+
| Fluent Bit Sidecar |
| tail app.log |
| buffer |
| S3 PutObject |
+-----------+------------+
|
v
+------------------------+
| Ceph RGW (S3 API) |
| s3://logs-bucket |
+------------------------+
예시 1. Sidecar 방식
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
volumes:
- name: applogs
emptyDir: {}
containers:
- name: app
image: myapp:latest
volumeMounts:
- name: applogs
mountPath: /var/log/app
- name: fluent-bit
image: fluent/fluent-bit:latest
volumeMounts:
- name: applogs
mountPath: /var/log/app
앱은:
echo "user login" >> /var/log/app/app.log
Fluent Bit은:
[INPUT]
Name tail
Path /var/log/app/*.log
[OUTPUT]
Name s3
bucket logs-bucket
region us-east-1
endpoint http://rgw.ceph.local:80
use_put_object On
결과:
s3://logs-bucket/
├── app-20260616-1000.log
├── app-20260616-1100.log
└── app-20260616-1200.log
예시 2. DaemonSet 방식 (실무에서 더 흔함)
애플리케이션은 그냥 stdout으로 출력:
print("user login")
쿠버네티스는 이를 노드에 저장:
/var/log/pods/...
/var/log/containers/myapp-xxx.log
Fluent Bit DaemonSet이 모든 노드에서 수집:
Node1
├─ Pod A
├─ Pod B
└─ Fluent Bit
Node2
├─ Pod C
├─ Pod D
└─ Fluent Bit
Fluent Bit 설정:
[INPUT]
Name tail
Path /var/log/containers/*.log
[OUTPUT]
Name s3
bucket logs-bucket
endpoint http://rgw.ceph.local
로그 흐름:
stdout
↓
/var/log/containers/*.log
↓
Fluent Bit DaemonSet
↓
Ceph RGW(S3)
↓
logs-bucket
그래서 Ceph 입장에서 보면
- RBD → PVC 제공 (DB, VM 디스크)
- CephFS → 공유 파일시스템 제공
- RGW → S3 API 제공 (로그, 백업, 이미지, AI 데이터셋)
이고,
"애플리케이션 로그를 RGW에 저장한다"는 것은
Pod
→ Fluent Bit
→ S3 API
→ RGW
→ Ceph Object Storage
이지,
Pod
→ PVC
→ RGW
처럼 RGW를 직접 마운트해서 쓰는 구조는 아니다.
그래서 앞서 말한 것처럼 RGW는 ceph-csi의 대상이 아니다.
쿠버네티스 사용
Ceph 스토리지를 Kubernetes에 제공하기 위한 사전 준비 작업
Ceph에서의 작업
1. CSI가 사용할 RBD Pool 생성
2. Pool을 RBD 용도로 설정
3. Namespace 생성
4. CSI용 CephX 계정 생성
5. 계정의 인증키(Key) 발급
을 수행하는 Ceph 측 사전 준비 작업이다.
| 작업수행 | 위치 |
| ceph osd pool create | Ceph |
| ceph auth get-or-create | Ceph |
| rbd namespace create | Ceph |
| ceph fsid 조회 | Ceph |
| CSI Driver 설치 | Kubernetes |
| Secret 생성 | Kubernetes |
| StorageClass 생성 | Kubernetes |
| PVC 생성 | Kubernetes |
Kubernetes가
FSID
MON 주소
client.porthos-csi-rbd-controller Key
client.porthos-csi-rbd-node Key
를 받아 Secret과 StorageClass를 만들고 PVC를 사용할 수 있게 된다.