跳转至

Kubernetes 存储选型:Longhorn 与 Rook/Ceph 对比

一份面向公开读者的技术选型参考。不针对任何特定集群,目的是帮你在给 Kubernetes 选持久化存储时,搞清楚两者的适用边界,而不是比出"谁更强"。


0. 先分清三种存储形态

讨论选型之前,先明确你要的是哪一种,否则很容易拿错方案对比:

形态 访问模式 典型用途 代表实现
块存储(Block) 通常 ReadWriteOnce 数据库、消息队列、单 Pod 独占写 Ceph RBD、Longhorn、云盘(CBS/EBS/PD)
文件存储(File) ReadWriteMany 多 Pod 共享读写、CI 缓存、共享配置、媒体库 CephFS、NFS、云文件存储(CFS/EFS)
对象存储(Object) S3 API 备份、日志、大数据、制品库 Ceph RGW、MinIO、S3/OSS/COS

关键点:RWX(多 Pod 同时读写)在块存储上不能原生实现,必须由文件系统或 NFS 网关来提供。这一点决定了后面很多差异。


1. 两个项目速览

1.1 Longhorn

  • 定位:轻量级、纯 Kubernetes 原生的分布式块存储。
  • 出身:Rancher Labs 发起,现为 CNCF 孵化(Incubating)项目。
  • 架构:
  • 每个卷是一个"微服务",由 Longhorn Engine + 若干副本(Replica)组成;
  • 副本以快照链的方式保存增量,运行在普通 Pod 里;
  • 对上层暴露前端:内核设备(/dev/longhorn/...)和 iSCSI target。
  • 一个 3 副本的卷,大致对应 4 个容器(1 个控制器 + 3 个副本)。
  • 接口:只做块存储(RWO)。RWX 是通过 share-manager(一个 NFS 服务器 Pod 转发块卷)实现的,官方文档在 1.7.x 版本中仍将其列在 Experimental Features 下。
  • 管理面:纯 CRD + 自带 UI,没有"集群外"的概念。

1.2 Rook + Ceph

  • 定位:在 Kubernetes 上运行并管理 Ceph——一个通用的分布式存储系统。
  • 出身:Rook 是 CNCF 毕业(Graduated)项目;Ceph 本身是 Linux 基金会项目(不属于 CNCF),已有二十年以上历史。
  • 架构:
  • Rook 是 operator:通过 CephCluster、CephFilesystem、CephBlockPool 等 CR 声明式管理 Ceph;
  • Ceph 由一组守护进程组成:mon(集群大脑/一致性)、mgr(管理/指标)、osd(数据盘,一块盘一个 OSD)、mds(CephFS 元数据服务);
  • 数据分布由 CRUSH 算法决定,副本(或纠删码)按故障域(host/rack/chassis)分散。
  • 接口:三种一起给——
  • RBD:块存储(RWO);
  • CephFS:POSIX 共享文件系统(RWX,原生);
  • RGW:对象存储,兼容 S3 API。
  • 管理面:Ceph 有自己的 Dashboard / CLI;Rook 负责把它们部署在 k8s 里。

2. 能力对比

维度 Longhorn Rook / Ceph
存储形态 仅块存储 块 + 文件 + 对象
RWX 共享文件 有,但走 NFS 转发(share-manager),官方标注实验特性 原生 POSIX(CephFS)
对象存储(S3) ❌ ✅(RGW)
冗余机制 多副本(卷级) 多副本 或纠删码(EC)
副本故障域 按节点分散 可细到 host / rack / chassis(CRUSH)
空间效率 副本制:3 副本 = 3 倍空间 副本制,或 EC(如 4+2 ≈ 1.5 倍,可容忍 2 盘故障)
单节点可用 ✅ 天生支持 ⚠️ 可运行,但无冗余、无 mon quorum,不建议生产
节点故障不丢数据 需要 ≥3 节点 + 3 副本 需要 ≥3 节点 + 副本 3(或 EC)
多 K8s 集群共享 ❌ 每个集群一套独立实例 ✅ external cluster 模式(consumer 只装 CSI)
规模定位 官方目标是海量卷;社区实践多见于中小规模集群 PB 级、上千 OSD、大规模生产
运维复杂度 低:概念少,纯 CRD + UI 高:mon/mgr/osd/mds/pool/PG/CRUSH 一整套
性能特征 走 iSCSI/NBD + 副本链,小 IO 延迟相对更高 RBD 路径更短、CephFS 原生并发,通常更优
快照 / 备份 原生集成,支持 S3/NFS 备份目标 RBD/CephFS 快照,备份生态丰富但需配置
图形界面 自带 UI,简单直观 Ceph Dashboard(能力更强,概念更多)
CNCF 状态 Incubating Graduated(Rook)

说明:性能一栏只给方向,不给绝对结论——同一批硬件下差异很大,选型应基于自己的 POC 实测。


3. 各自的真实优势

3.1 Longhorn 的优势

  1. 轻:没有 mon/pool/PG/CRUSH 这些概念,一个卷就是一组 Pod,学习成本低。
  2. 单节点/小集群友好:天生支持单节点部署,开发测试环境上手极快。
  3. 纯 K8s 原生:全部是 CRD,升级、扩容、扩副本都是 k8s 操作,没有"外部存储系统"这层心智负担。
  4. 运维简单:UI 直观,快照/备份与 S3 集成开箱即用。
  5. 与 Rancher 生态整合好:如果本来就在用 Rancher,体验顺畅。

3.2 Ceph 的优势

  1. 一套存储、三种接口:块、文件、对象同时提供,省掉维护多套存储系统。
  2. 原生共享文件系统:CephFS 是真正的 POSIX 分布式文件系统,多客户端并发能力和语义完整性都优于"块卷 + NFS 转发"。
  3. 纠删码:冷数据/大容量场景可以显著降低冗余开销(副本制 3 倍 vs EC 约 1.5 倍)。
  4. 故障域更细:CRUSH 能按机架/机箱做数据分布,跨机架容灾比"仅按节点"更强。
  5. 规模上限高:PB 级容量、上千 OSD 有大量生产案例。
  6. 多集群共享:通过 Rook 的 external cluster 模式,一套 Ceph 可以服务多个 k8s 集群,consumer 侧不需要自己的 OSD。
  7. 生态成熟:Ceph 被 OpenStack、公有云、运营商大量使用,工具链与排障资料丰富。

4. 怎么选:按场景给结论

4.1 决策树

需要对象存储(S3)吗?
├─ 是  → Ceph(RGW)
└─ 否
   └─ 需要原生 RWX 共享文件、且并发/语义要求高吗?
      ├─ 是 → Ceph(CephFS)
      └─ 否
         └─ 有多个 K8s 集群要共享同一套存储吗?
            ├─ 是 → Ceph(external cluster)
            └─ 否
               └─ 规模是否较大(PB 级 / 上百 OSD),或需要 EC 省空间/机架级容灾?
                  ├─ 是 → Ceph
                  └─ 否 → Longhorn

4.2 分场景建议

场景 推荐 理由
本地开发 / 单节点 / 边缘小环境 Longhorn 轻量、单节点原生支持,装完即用
3–10 节点的中小生产集群,只要块存储 Longhorn 运维成本低,3 副本即可满足节点级冗余
需要多 Pod 共享读写(RWX)且性能敏感 CephFS 原生文件系统,避免 NFS 转发瓶颈
需要 S3 兼容对象存储 Ceph(RGW) 或 MinIO Ceph 可与块/文件共用一套硬件
大规模(PB 级、上百 OSD) Ceph CRUSH 扩展性与成熟度
多个 K8s 集群共享一套存储 Ceph(external cluster) Longhorn 无此能力
冷数据多、想省空间 Ceph(纠删码) EC 比多副本省 40%+ 空间
需要机架级容灾 Ceph CRUSH 支持 rack 级故障域

4.3 一个重要的反模式

不要为了"用 Ceph"而在每个 K8s 集群里各装一套。 如果目标是多集群共享,正确做法是:

  1. 建一套独立的 Ceph(≥3 节点,节点带本地盘做 OSD);
  2. 各 K8s 集群以 consumer 身份通过 Rook external cluster 模式接入,只部署 CSI;
  3. 存储容量和 OSD 只维护这一套。

每集群各装一套的结果是:N 倍硬件、N 倍运维,而且数据彼此隔离,共享不了。


5. 常见误区

  1. "Longhorn 的 RWX 等于 CephFS" 不是。Longhorn 的 RWX 是 share-manager 把一个块卷通过 NFS 暴露出去,本质仍是块存储 + NFS 网关;CephFS 是原生分布式文件系统。高并发、强一致、元数据密集的场景差距明显。

  2. "Ceph 一定更快" 不一定。Ceph 的优势建立在多节点、多 OSD、并行分布之上;单节点单盘时这些优势无法发挥。任何性能结论都应该基于自己的 POC。

  3. "副本数越多越安全" 副本每加一份,容量利用率就降一档(3 副本 = 33%)。真正的安全来自副本跨故障域,而不是盲目堆副本数。

  4. "多集群就是每个集群装一套" 见 4.3。多集群共享存储应该用 external cluster。

  5. "在 Ceph Dashboard 里建了卷,K8s 就能用" 不能直接对应。K8s 的存储入口是 PVC + StorageClass(动态供给);Ceph Dashboard 管的是 Ceph 集群本身。要把已有 Ceph 卷接进 k8s,需要用静态 PV(staticVolume: "true" + rootPath),且静态卷通常不支持在线扩容/快照。

  6. "Rook 是 CNCF 毕业项目,所以什么场景都该用它" 毕业只说明项目成熟、社区治理完善,不代表它适合所有规模。单节点、小集群用 Ceph 往往是过度设计。


6. 做 POC 时建议验证的指标

选型最终要靠数据,建议至少测这几项:

  • 随机读写 IOPS / 延迟(4K、64K,读写分开)
  • 顺序吞吐(大块)
  • 多 Pod 并发下的表现(尤其是 RWX 场景)
  • 故障注入:杀掉一个节点 / 一块盘,验证数据可用性与恢复时间
  • 扩容操作:加盘、扩 PVC、扩副本的实际耗时与业务影响
  • 运维演练:升级、备份恢复、监控告警是否完善

7. 参考资料


附:一句话总结

  • Longhorn:K8s 原生的轻量块存储,适合单节点到中小规模集群,运维简单。
  • Rook/Ceph:通用分布式存储平台,适合大规模、多集群、多接口(块/文件/对象)、需要 EC 与细粒度故障域的场景,代价是运维复杂度。
  • 选型的核心不是"谁更强",而是"你的规模、接口需求、故障域要求,落在谁的能力区间里"。