4. 部署 Rook Ceph 集群:使用 Helm 部署 Rook Operator、创建 CephCluster CR

本章将指导你使用 Helm 包管理器部署 Rook Operator,并通过创建 CephCluster 自定义资源(CR)来实例化一个生产就绪的 Ceph 存储集群。这是将 Rook Ceph 引入 Kubernetes 环境的标准路径,也是后续配置存储类与安全策略的基础。

4.1 部署架构概览

在开始操作之前,理解 Rook Operator 与 CephCluster CR 之间的关系至关重要。Rook Operator 是一个 Kubernetes 控制器,它负责管理 Ceph 集群的生命周期;而 CephCluster CR 则是用户向 Operator 描述期望集群状态的声明式配置。

Rook Operator 与 CephCluster CR 交互架构 Rook Operator 与 CephCluster CR 交互架构 Kubernetes API Server Rook Operator CephCluster CR Ceph DaemonSet 用户创建/更新 监听 编排 状态同步 说明:用户通过 kubectl apply 提交 CephCluster CR 至 API Server;Rook Operator 监听 CR 变化, 自动创建或更新 Ceph 守护进程(MON、OSD、MGR、MDS、RGW)的 DaemonSet 与 Deployment。

4.2 前提条件

在部署 Rook Operator 之前,请确保你的 Kubernetes 集群满足以下要求:

条件 最低版本/规格 说明
Kubernetes 版本 v1.21+ 推荐 v1.25+ 以获得最佳 CRD 支持
Helm 版本 v3.8+ 支持 OCI 仓库与 Values 覆盖
节点数量 ≥ 3 个 worker 节点 保证 MON 与 OSD 的高可用
裸盘(OSD 专用) 每节点 ≥ 1 块 未被分区或格式化,推荐 SSD/NVMe
内核版本 Linux 5.4+ 支持 RBD 与 CephFS 内核客户端
提示:如果使用云环境(如 AWS EBS、GCP PD),建议为 OSD 节点挂载额外数据盘,并确保 lvm2 软件包已安装。

4.3 使用 Helm 部署 Rook Operator

Rook 官方维护的 Helm Chart 位于 rook-release 仓库。以下是标准部署步骤:

  1. 添加 Helm 仓库
helm repo add rook-release https://charts.rook.io/release
helm repo update
  1. 创建命名空间
kubectl create namespace rook-ceph
  1. 安装 Rook Operator
helm install --namespace rook-ceph rook-ceph rook-release/rook-ceph \
  --set operatorNamespace=rook-ceph \
  --set csi.enableRbdDriver=true \
  --set csi.enableCephfsDriver=true

安装完成后,验证 Operator Pod 是否正常运行:

kubectl -n rook-ceph get pods -l app=rook-ceph-operator
NAME                                  READY   STATUS    RESTARTS   AGE
rook-ceph-operator-7f8b9c6d9-abcde   1/1     Running   0          2m
关键参数说明:
  • operatorNamespace:指定 Operator 的运行命名空间,必须与安装命名空间一致。
  • csi.enableRbdDriver / csi.enableCephfsDriver:启用 CSI 驱动,使 Kubernetes 能够通过 StorageClass 动态挂载 RBD 块存储与 CephFS 文件存储。

4.4 创建 CephCluster CR

Operator 启动后,需要提交一个 CephCluster 自定义资源来定义集群拓扑与存储配置。以下是一个面向生产环境的示例 YAML:

cat <<EOF | kubectl apply -n rook-ceph -f -
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
spec:
  dataDirHostPath: /var/lib/rook
  mon:
    count: 3
    allowMultiplePerNode: false
  mgr:
    count: 2
    modules:
      - name: pg_autoscaler
        enabled: true
  dashboard:
    enabled: true
    ssl: true
  storage:
    useAllNodes: false
    useAllDevices: false
    config:
      databaseSizeMB: "1024"
      journalSizeMB: "1024"
    nodes:
      - name: "node-1"
        devices:
          - name: "sdb"
      - name: "node-2"
        devices:
          - name: "sdb"
      - name: "node-3"
        devices:
          - name: "sdb"
EOF

CR 提交后,Operator 会自动开始编排 Ceph 守护进程。可以通过以下命令观察集群状态:

kubectl -n rook-ceph get pods -l app=rook-ceph-mon
kubectl -n rook-ceph get pods -l app=rook-ceph-osd
kubectl -n rook-ceph get cephcluster rook-ceph -o jsonpath='{.status.phase}'

当 status.phase 变为 Ready 时,表示集群已成功建立。

4.5 CephCluster CR 关键字段解析

字段路径 类型 说明 推荐值
spec.mon.count int MON 守护进程数量,必须为奇数 3(生产) / 1(测试)
spec.mgr.count int MGR 守护进程数量,≥ 2 实现高可用 2
spec.dashboard.enabled bool 启用 Ceph Dashboard(Web UI) true
spec.storage.useAllNodes bool 是否使用集群中所有节点作为 OSD 节点 false(推荐显式指定)
spec.storage.nodes[].devices[].name string 指定节点上用于 OSD 的块设备名称 如 sdb、nvme0n1
spec.dataDirHostPath string 宿主机上存储 Ceph 配置与数据的目录 /var/lib/rook
警告:useAllDevices: true 会使用节点上所有未分区的裸盘,可能导致系统盘被意外占用。生产环境务必显式指定 nodes 与 devices。

4.6 验证集群健康状态

集群就绪后,可以通过 Rook 提供的工具箱 Pod 执行 Ceph 原生命令:

# 部署工具箱
kubectl apply -n rook-ceph -f https://raw.githubusercontent.com/rook/rook/master/deploy/examples/toolbox.yaml

# 进入工具箱
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash

# 在工具箱内执行
ceph status
ceph osd status
ceph df

一个健康的集群输出应包含 HEALTH_OK 状态,且所有 MON 与 OSD 均为 up 状态。

CephCluster CR 创建后的组件部署拓扑 CephCluster CR 创建后的组件部署拓扑 MON (3 Pods) MGR (2 Pods) OSD (N Pods) 选举 管理 Kubernetes Worker Nodes (裸盘 /dev/sdb) 写入 说明:MON 通过选举形成 quorum(多数派),MGR 负责集群指标收集与 Dashboard, OSD 直接管理节点上的裸盘。所有组件均以 Kubernetes Pod 形式运行, 由 Rook Operator 统一调度与健康检查。

4.7 常见问题与排错

  • Operator Pod 反复 CrashLoopBackOff:检查 rook-ceph-operator 日志,确认是否因 RBAC 权限不足导致无法创建资源。重新应用 clusterrole.yaml 与 clusterrolebinding.yaml。
  • OSD Pod 无法启动:确认节点上指定的设备(如 /dev/sdb)存在且未被挂载。使用 lsblk 检查设备状态,必要时执行 wipefs -a /dev/sdb 清除文件系统签名。
  • 集群状态为 HEALTH_WARN:常见原因为 PG 数量不均衡或 OSD 空间使用率超过阈值。可通过 ceph balancer mode upmap 启用均衡器,或调整 mon_osd_full_ratio 参数。
最佳实践:建议在部署前使用 ceph-volume lvm batch --prepare 在测试环境验证设备兼容性,避免生产环境出现意外。