3. Rook Ceph 集群部署:在 Kubernetes 上部署生产级 Ceph 集群的步骤与配置

在生产环境中使用 Rook 部署 Ceph 集群,需要遵循严格的版本兼容性、资源规划与配置步骤。本章将拆解从 Operator 部署到存储集群就绪的完整流程,并给出生产级参数配置建议。

3.1 部署前环境检查与版本兼容性

在开始部署前,必须确认 Kubernetes 集群版本、Rook Operator 版本与 Ceph 版本之间的兼容关系。下表列出了当前主流的生产级组合:

组件推荐版本最低要求备注
Kubernetesv1.27+v1.21需启用 RBD、CSI 相关特性门控
Rook Operatorv1.14.xv1.10.x建议使用最新稳定版
CephQuincy (v17) / Reef (v18)Pacific (v16)Reef 支持更多新特性
OS 内核5.15+5.4内核需支持 rbd 模块
版本对齐建议: 不要混用大版本。例如 Rook v1.14 搭配 Ceph Reef v18 是经过社区广泛验证的组合。升级时遵循 Operator → Ceph Daemon → CRD 的顺序。

3.2 部署 Rook Operator

Rook Operator 是整个集群的控制平面组件,负责管理 Ceph 守护进程的生命周期。部署步骤如下:

  1. 克隆官方部署清单(或使用 Helm Chart):
git clone --single-branch --branch v1.14.0 https://github.com/rook/rook.git
cd rook/deploy/examples
  1. 应用 CRD 与 Operator 资源:
kubectl create -f crds.yaml
kubectl create -f common.yaml
kubectl create -f operator.yaml
  1. 验证 Operator 运行状态:
kubectl -n rook-ceph get pod -l app=rook-ceph-operator
# 预期输出:rook-ceph-operator-xxxxx   1/1   Running
生产级 Operator 配置调整: 在 operator.yaml 中修改以下环境变量:
ROOK_CSI_ENABLE_CEPHFS: "true"
ROOK_CSI_ENABLE_RBD: "true"
ROOK_CSI_ALLOW_UNSUPPORTED_VERSION: "false"
ROOK_LOG_LEVEL: "INFO"

3.3 创建 CephCluster CR:生产级配置

CephCluster 自定义资源定义了集群的拓扑、存储、网络与监控配置。以下是一个面向生产环境的配置模板(关键部分):

apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: quay.io/ceph/ceph:v18.2.0
    allowUnsupported: false
  dataDirHostPath: /var/lib/rook
  mon:
    count: 3
    allowMultiplePerNode: false
  mgr:
    count: 2
    modules:
      - name: pg_autoscaler
        enabled: true
  dashboard:
    enabled: true
    ssl: true
  network:
    provider: host
    selectors:
      public: "public"
      cluster: "cluster"
  storage:
    useAllNodes: false
    useAllDevices: false
    config:
      databaseSizeMB: "10240"
      journalSizeMB: "5120"
    nodes:
      - name: "node-01"
        devices:
          - name: "sdb"
          - name: "sdc"
      - name: "node-02"
        devices:
          - name: "sdb"
          - name: "sdc"
      - name: "node-03"
        devices:
          - name: "sdb"
          - name: "sdc"
  healthCheck:
    daemonHealth:
      mon:
        interval: 45s
        timeout: 600s
关键避坑点:
- useAllDevices: true 会格式化所有未挂载磁盘,生产环境必须显式指定设备。
- mon.allowMultiplePerNode: false 避免单节点故障影响多数 MON。
- databaseSizeMB 和 journalSizeMB 应根据 OSD 容量按比例设置(通常为 OSD 容量的 1%~4%)。

3.4 集群部署流程与状态验证

应用 CephCluster CR 后,Rook Operator 会按以下顺序启动守护进程:

  1. 启动 MON 仲裁(3 个 MON 形成 quorum)
  2. 启动 MGR 主备对
  3. 基于节点设备自动发现并准备 OSD
  4. 启动 MDS(如果启用了 CephFS)
  5. 启动 RGW(如果启用了对象存储)

验证集群健康状态的命令:

# 查看所有 Pod 状态
kubectl -n rook-ceph get pod

# 进入工具箱 Pod 执行 Ceph 命令
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
ceph status
ceph osd tree
ceph df

预期输出中 ceph status 应显示 health: HEALTH_OK,且所有 OSD 处于 up 和 in 状态。

3.5 部署架构与组件交互关系

下图展示了 Rook 部署的 Ceph 集群在 Kubernetes 中的组件拓扑与交互关系:

Rook Ceph 集群部署组件拓扑 Kubernetes 集群 Rook Operator 控制面 · 管理 CRD MON 仲裁 (x3) 集群映射 · 选举 MGR (主/备) Dashboard · 均衡 OSD 节点组 (每节点多 OSD) node-01 node-02 node-03 sdb · sdc sdb · sdc sdb · sdc MDS (CephFS) 文件系统元数据 RGW (对象存储) S3/Swift 网关

3.6 存储类与 PVC 验证

集群就绪后,需要创建 StorageClass 并验证动态卷供应是否正常:

# 创建 RBD 存储类
kubectl create -f storageclass-rbd.yaml

# 创建测试 PVC
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  storageClassName: rook-ceph-block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
EOF

# 验证 PVC 状态
kubectl get pvc test-pvc
# 预期输出:Bound
生产级存储类参数建议:
- replicated.size: 3 保证三副本冗余
- csi.storage.k8s.io/fstype: ext4 或 xfs
- 启用 encrypted: "true" 开启 OSD 级加密
- 设置 mountOptions: ["discard"] 启用 TRIM 回收

3.7 部署后关键检查清单

检查项命令/方法预期结果
集群健康ceph statusHEALTH_OK
MON 仲裁ceph mon stat3 个 MON,quorum 正常
OSD 状态ceph osd tree所有 OSD up/in
PG 分布ceph pg statactive+clean,无 stale
Dashboard 可达kubectl -n rook-ceph get svc rook-ceph-mgr-dashboardExternal IP 或 NodePort 可访问
CSI 驱动kubectl -n rook-ceph get pod -l app=csi-rbdpluginDaemonSet 全部 Running

3.8 常见部署问题与快速修复

  • MON 无法形成 quorum: 检查节点间网络延迟与防火墙规则,确保 6789、3300 端口互通。使用 ceph mon dump 查看 MON 映射。
  • OSD 一直处于 down 状态: 检查磁盘是否被其他进程占用(如 lvm、parted),使用 ceph-volume lvm list 排查。
  • PVC 一直 Pending: 确认 StorageClass 名称正确,检查 kubectl describe pvc 中的事件信息,常见原因为存储类未关联或 OSD 空间不足。
  • Dashboard 证书错误: 使用自签名证书时,需在浏览器中信任 CA 或配置 ssl: false(仅测试环境)。
生产部署黄金法则:
1. 始终使用 useAllDevices: false 显式指定 OSD 设备。
2. 为 MON 和 MGR 设置 resources 请求与限制,避免被其他 Pod 抢占。
3. 启用 pg_autoscaler 模块,让 Ceph 自动管理 PG 数量。
4. 部署前使用 ceph-volume inventory 扫描所有节点磁盘,确认设备路径正确。