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 等守护进程。
典型手动部署流程:
- 在所有节点上安装 Ceph 软件包,配置 SSH 免密登录。
- 在管理节点上执行
ceph-deploy new <mon-node>创建初始 MON。 - 手动添加 OSD:
ceph-deploy osd create --data /dev/sdb <osd-node>。 - 手动配置 CRUSH map、Pool、认证密钥。
- 部署 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 部署核心流程:
# 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 流程图帮助团队根据自身条件快速选择最合适的部署方式:
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 管理的工具链。建议在非生产环境先行验证迁移流程。