4. Ceph 集群部署方式对比:手动部署、cephadm 部署、Rook Operator 部署

在生产环境中部署 Ceph 存储集群,通常面临三种主流选择:手动部署、cephadm 部署和Rook Operator 部署。这三种方式在自动化程度、运维复杂度、与 Kubernetes 的集成深度上存在显著差异。本章将从架构、流程、适用场景三个维度进行系统性对比。

4.1 部署方式概述与核心差异

下表从部署工具、依赖环境、生命周期管理、与 K8s 集成度四个关键维度,对三种方式进行横向对比:

对比维度 手动部署 cephadm 部署 Rook Operator 部署
部署工具 ceph-deploy / ceph-ansible / 手动命令 cephadm 单二进制工具 Rook Operator (K8s CRD + Controller)
依赖环境 物理机/虚拟机 + 手动配置 SSH/NTP/防火墙 Linux 主机 + Podman/Docker + Python3 Kubernetes 集群 + 节点标签 + 存储类
生命周期管理 手动升级、扩缩容、故障恢复 cephadm 命令驱动,半自动化 Operator 自动调和,声明式管理
与 K8s 集成度 低,需额外配置 CSI 驱动 中,可通过 ceph-csi 集成 高,原生 CRD + CSI + 存储类
选型提示:如果团队已有成熟的 Kubernetes 平台且追求声明式运维,Rook Operator 是首选;如果仅需独立 Ceph 集群且希望保留最大控制权,手动部署仍具价值;cephadm 则适合从手动向自动化过渡的场景。

4.2 手动部署:经典但繁琐

手动部署是 Ceph 最传统的部署方式,通常使用 ceph-deploy 或 ceph-ansible 工具。管理员需要手动配置每台主机的网络、时间同步、防火墙规则,并逐个启动 MON、MGR、OSD、MDS 等守护进程。

典型手动部署流程:

  1. 在所有节点上安装 Ceph 软件包,配置 SSH 免密登录。
  2. 在管理节点上执行 ceph-deploy new <mon-node> 创建初始 MON。
  3. 手动添加 OSD:ceph-deploy osd create --data /dev/sdb <osd-node>。
  4. 手动配置 CRUSH map、Pool、认证密钥。
  5. 部署 CSI 驱动(如 ceph-csi)以对接 Kubernetes。
运维痛点:手动部署在节点数量超过 10 台时,配置错误率显著上升;升级时需逐节点停止服务、替换二进制、重启进程,容易引发集群抖动。

4.3 cephadm 部署:半自动化容器化方案

cephadm 是 Ceph 官方推荐的部署工具,自 Ceph Octopus 版本起成为默认方式。它使用容器化方式运行所有 Ceph 守护进程,通过 SSH 或 API 管理集群。

cephadm 部署核心步骤:

# 1. 在 bootstrap 节点上初始化集群
cephadm bootstrap --mon-ip <ip>

# 2. 添加主机到集群
cephadm shell -- ceph orch host add <hostname> <ip>

# 3. 部署 OSD(自动发现可用磁盘)
cephadm shell -- ceph orch apply osd --all-available-devices

# 4. 部署 MDS / RGW 等服务
cephadm shell -- ceph orch apply mds <fs_name> --placement="3 host1 host2 host3"

cephadm 通过 ceph orch 命令集提供服务编排能力,支持声明式服务规格(YAML)和自动扩缩容。但它仍然需要管理员手动管理主机清单和网络配置,与 Kubernetes 的集成需要额外部署 ceph-csi。

关键优势:cephadm 将 Ceph 守护进程容器化,简化了依赖管理和版本升级;支持 cephadm upgrade 一键升级集群,大幅降低运维负担。

4.4 Rook Operator 部署:Kubernetes 原生声明式管理

Rook 是一个云原生存储编排器,它将 Ceph 集群的部署和管理抽象为 Kubernetes 自定义资源(CRD)。Rook Operator 负责监听这些 CRD 的变化,自动创建、配置、监控和恢复 Ceph 集群。

Rook Operator 部署架构:

Rook Operator 部署架构图 Kubernetes 集群 Kubernetes 控制平面 Rook CRD 定义 CephCluster / CephBlockPool / CephFilesystem Rook Operator (Deployment) 监听 CRD → 调和集群状态 Ceph 数据平面 (Pod) MON Pod (x3) — 集群状态 OSD Pod (xN) — 数据存储 MGR Pod (x2) — 监控/均衡 MDS / RGW Pod (可选) 创建/管理 底层存储资源 裸盘 / 分区 / LVM / PVC (hostPath / local PV) OSD 自动发现并接管可用设备 挂载/管理 K8s 工作负载 (PVC 挂载) CSI 驱动 (RBD / CephFS)

Rook Operator 部署核心流程:

# 1. 部署 Rook Operator
kubectl create -f deploy/examples/crds.yaml
kubectl create -f deploy/examples/common.yaml
kubectl create -f deploy/examples/operator.yaml

# 2. 创建 CephCluster CR(声明集群规格)
cat <<EOF | kubectl apply -f -
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  dataDirHostPath: /var/lib/rook
  mon:
    count: 3
    allowMultiplePerNode: false
  storage:
    useAllNodes: true
    useAllDevices: true
EOF

# 3. 创建存储池和 StorageClass
kubectl create -f deploy/examples/pool.yaml
kubectl create -f deploy/examples/storageclass.yaml

# 4. 工作负载通过 PVC 声明式使用存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ceph-pvc
spec:
  storageClassName: rook-ceph-block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

4.5 三种部署方式综合对比

以下表格从运维自动化、故障恢复、升级策略、学习曲线、生产适用性五个维度进行深度对比:

评估维度 手动部署 cephadm 部署 Rook Operator 部署
运维自动化 低,依赖脚本和人工操作 中,ceph orch 提供半自动化编排 高,Operator 自动调和 CRD 状态
故障恢复 手动检测并替换故障 OSD/MON cephadm 可自动替换故障守护进程 Operator 自动重建故障 Pod 并恢复
升级策略 逐节点停止服务、替换、重启 cephadm upgrade 滚动升级 Operator 滚动升级,支持回滚
学习曲线 陡峭,需深入理解 Ceph 内部机制 中等,掌握 cephadm 命令即可 中等,需理解 K8s CRD 和 Operator 模式
生产适用性 适合小规模或定制化场景 适合中等规模独立 Ceph 集群 适合大规模 K8s 原生存储场景

4.6 部署方式选择决策流程

以下 SVG 流程图帮助团队根据自身条件快速选择最合适的部署方式:

Ceph 部署方式选择决策流程 开始选择部署方式 是否已有 Kubernetes 集群? 是 → Rook Operator 声明式管理,原生集成 否 → 是否需要容器化运维? 是 否 是 → cephadm 部署 容器化,半自动化编排 否 → 手动部署 最大控制权,适合定制 是 否 说明:Rook Operator 要求 K8s 集群版本 ≥ 1.19;cephadm 要求 Linux 内核 ≥ 4.15 并支持 cgroup v2;手动部署适合对 Ceph 有深度定制需求的团队。

4.7 生产环境选型建议

  • 云原生优先:如果团队已经标准化 Kubernetes 平台,且希望存储资源像计算资源一样通过 YAML 声明式管理,Rook Operator 是最佳选择。它天然支持 CSI、StorageClass、PVC 动态供给,且 Operator 模式保证了集群状态的自动修复。
  • 独立 Ceph 集群:如果 Ceph 集群独立于 K8s 运行(例如作为统一存储后端同时服务 K8s 和虚拟机),cephadm 提供了良好的容器化运维体验,且升级和扩缩容操作比手动方式安全得多。
  • 特殊定制场景:当需要深度定制 Ceph 配置(如自定义 CRUSH 规则、多副本策略、专用网络配置)时,手动部署仍然保留最大灵活性,但建议配合自动化工具(如 Ansible)降低出错率。
迁移路径:从手动部署迁移到 cephadm 或 Rook Operator 是可行的。cephadm 支持通过 cephadm adopt 命令导入现有集群;Rook 社区也提供了从外部 Ceph 集群迁移到 Rook 管理的工具链。建议在非生产环境先行验证迁移流程。