Skip to content

Ceph

概念

Ceph 是 统一存储系统:块(RBD)、文件(CephFS)、对象(S3 兼容 RGW)三种接口一套集群。K8s 上用 RBD 或 CephFS 通过 CSI 暴露给 Pod。

  • 项目起源:Sage Weil 2003 博士论文,2010s 走向成熟
  • 治理:Ceph 基金会 → 已被 Red Hat 收购并入 OpenShift Data Foundation
  • K8s CSI driver:ceph-csi(CNCF 官方,github.com/ceph/ceph-csi)

架构

┌────────────── K8s cluster ──────────────┐
│                                          │
│  ceph-csi (Deployment + DaemonSet)       │
│   ├─ external-provisioner sidecar       │
│   ├─ external-attacher sidecar          │
│   ├─ external-resizer sidecar           │
│   └─ external-snapshotter sidecar       │
│                                          │
└──────────────────┬───────────────────────┘
                   │ RADOS (librados)
                   ▼
┌─────────── Ceph cluster ────────────────┐
│  MON (集群元数据 / 选举) ×3+             │
│  MGR (集群状态 / dashboard) ×2+         │
│  OSD (数据存储, 每节点多个)              │
│  MDS (CephFS 元数据)                     │
│  RGW (S3 / Swift, 可选)                  │
│                                          │
│  副本: 3x 默认, EC 也可                  │
└─────────────────────────────────────────┘
  • MON:保存 cluster map,paxos 选举
  • OSD:每个 disk 一个进程,负责复制、恢复、回填
  • MGR:manager,提供 dashboard / prometheus exporter
  • MDS:CephFS 元数据服务
  • CRUSH 算法:去中心化的数据分布(不查表,按权重 + 故障域)

RBD vs CephFS

维度 RBD CephFS
接口 块设备 分布式文件系统(POSIX)
协议 librbd / kernel krbd ceph-fuse / kernel cephfs
共享 ❌ ReadWriteOnce(单 Pod RW) ✅ ReadWriteMany(多 Pod 共享)
快照 ✅ ✅
克隆 ✅ ✅
性能 高(块直写) 中(元数据开销)
适用 数据库 / 单 Pod 块设备 共享数据 / AI 数据集 / 内容管理

部署

# 1. 用 Rook 部署 Ceph 集群(推荐,K8s 原生方式)
kubectl apply -f https://raw.githubusercontent.com/rook/rook/release-1.16/deploy/examples/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/rook/rook/release-1.16/deploy/examples/operator.yaml
kubectl apply -f https://raw.githubusercontent.com/rook/rook/release-1.16/deploy/examples/cluster.yaml

# 2. 装 ceph-csi
kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/csi-driver-object.yaml  # 或 rbd.yaml

# 3. 建 StorageClass

StorageClass 示例(RBD):

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
  clusterID: <rook-ceph-cluster-id>
  pool: replicapool
  imageFormat: "2"
  imageFeatures: layering
  csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  csi.storage.k8s.io/node-publish-secret-name: rook-csi-rbd-node
  csi.storage.k8s.io/node-publish-secret-namespace: rook-ceph
reclaimPolicy: Delete
volumeBindingMode: Immediate

优缺点

  • ✅ 三合一:块 / 文件 / 对象统一集群
  • ✅ 成熟稳定:15+ 年发展,大规模验证(EB 级)
  • ✅ 去中心化:无单点,CRUSH 算法可预测
  • ✅ 生态完整:Rook Operator 一键部署,OpenShift Data Foundation 集成
  • ✅ 多协议互通(同一份数据 RBD / CephFS / RGW 都能访问)
  • ❌ 运维复杂:MON / OSD / MDS / MGR 都要懂
  • ❌ 默认 3 副本,磁盘利用率 33%,要 EC 提高
  • ❌ 故障恢复期(rebalance)IO 受影响
  • ❌ 学习曲线陡
  • ❌ 高性能场景(低延迟 DB)需要 NVMe / SPDK 调优

适用场景

  • 大集群统一存储(>10 节点,混合 workload)
  • 既要块又要共享文件(CephFS)
  • AI / 大数据(HDFS 替代)
  • 自建对象存储(S3 替代)
  • OpenShift 用户(ODF 集成)

监控 / 排查

# Ceph 状态
ceph -s
ceph health detail
ceph osd tree

# OSD 性能
ceph osd perf

# 看 Pool 用量
ceph df

# Dashboard
ceph mgr dashboard

# K8s 这边
kubectl -n rook-ceph get pods
kubectl -n rook-ceph logs -l app=csi-rbdplugin

一句话

统一存储三件套(块 / 文件 / 对象),Rook + ceph-csi 一键起,运维复杂但能力全面。