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 描述期望集群状态的声明式配置。
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 仓库。以下是标准部署步骤:
- 添加 Helm 仓库
helm repo add rook-release https://charts.rook.io/release
helm repo update
- 创建命名空间
kubectl create namespace rook-ceph
- 安装 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 状态。
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 在测试环境验证设备兼容性,避免生产环境出现意外。