Skip to content

3. Rook:在 K8s 里运行 Ceph

本章目标

  • 用 Rook operator 部署 Ceph 集群并供给块/文件两种卷
  • 理解 Rook 的 CRD 声明式模型与第二篇技能的映射关系
  • 能论证 Rook vs 外部 Ceph + CSI 的架构取舍

3.1 Rook 是什么

Rook 是云原生存储编排器:operator 把第二篇你手动做的事(部署 MON/MGR/OSD、扩容、换盘)全部自动化,Ceph 的一切变成 K8s 里的 CRD 声明:

你在第二篇敲的Rook 里对应的 CRD
ceph orch apply mon: 3CephCluster.spec.mon.count: 3
ceph osd pool create / rbd poolCephBlockPool
ceph fs new + MDSCephFilesystem
radosgw-admin + RGWCephObjectStore
cephadm 容器化守护进程DaemonSet/Deployment 直接管 Pod

3.2 部署流程(对照 rook 手册实战版)

bash
# 0. 前置:≥3 台机器各至少 1 块本地盘;强烈建议双网络(public/cluster 分离,与第二篇同一条经验)
#    给存储节点打 label —— 只有这些节点跑 rook 集群:
kubectl label node sn-xx-1 node-role.kubernetes.io/storage=true   # 逐台

# 1. 部署 operator 并等就绪
kubectl apply -k operator/
kubectl wait -n rook-ceph --for=condition=ready pod -l app=rook-ceph-operator

# 2. 部署 CephCluster(按实际网络修改 cluster/patch.yaml 的 public/cluster 网段)
kubectl apply -k cluster/
kubectl get cephclusters && kubectl describe cephcluster rook-ceph

# 3. 运维通道:kubectl-rook-ceph 插件(推荐)或 toolbox
kubectl krew install rook-ceph
kubectl rook-ceph ceph -s            # 等价于 ssh 进集群敲 ceph -s!

3.3 块与文件供给(手册生产配置摘录)

RBD(块):复制 rbd/block-ceph.yaml 模板改名为租户名(每个租户独立 pool 部署),按介质改 deviceClass: hdd|ssd|nvme,apply 后 SC/PVC 直通。

CephFS(文件) 的生产参数浓缩了第二篇全部架构知识:

yaml
metadataPool:
  deviceClass: ssd            # 硬性要求(第 4 章讲过为什么)
  replicated: { size: 3 }     # 独立存储集群 3 副本;融合集群 4
dataPools:
- name: replicated            # 性能路径:副本
  replicated: { size: 3 }
- name: erasurecoded          # 默认路径:EC 4+2 提得盘率(要更高性能就切到 replicated pool)
  erasurecoded: { dataChunks: 4, codingChunks: 2 }
metadataServer:
  resources: { memory: "32Gi" }   # 生产至少 32Gi(每元数据 ~3KB,不足会断崖)

生产必做的两个修复(手册"重要配置"原版):

bash
# ① pg-autoscaler 失效会让所有 pool PG 数停在 1 —— 性能出不来:
kubectl rook-ceph ceph osd pool autoscale-status     # 每池 PG 至少 32
# 修复:给 .mgr 等池设置正确 crush rule 后让 autoscaler 重算

# ② Ceph ≥20.2 开 Fast EC 提升性能:
kubectl rook-ceph ceph config set global osd_pool_default_flag_ec_optimizations true
kubectl rook-ceph ceph config set global osd_pool_erasure_code_stripe_unit 16384

# 数据均衡优先(扩容/换盘期间加速自愈,与第二篇 6.2 同一条):
kubectl rook-ceph ceph config set osd osd_mclock_override_recovery_settings true
kubectl rook-ceph ceph config set osd osd_max_backfills 16

OSD 没上线?手册标准排查:kubectl rook-ceph ceph osd tree 对比盘数 → 看 osd-prepare Pod 的 provision 日志 → 多数是盘残留(销毁段三件套:sgdisk --zap-all / blkdiscard / ceph-volume lvm zap)→ 仍不行重启 operator 触发重新发现。

3.4 架构取舍

Rook(存算融合/平台内)外部 Ceph + CSI(下一章)
部署一套 K8s 搞定两套系统(K8s + 裸 Ceph)
扩容与 K8s 节点绑定存储独立扩容,自由
故障域存算同池互相挤兑天然隔离
运维技能kubectl 为主第二篇的集群技能为主
适用中小规模、平台一体化生产大集群、多 K8s 共享存储

rook 手册的隐含答案值得注意:其租户模板(独立 pool per 租户)、Fast EC、recovery 调优等配置密度说明 —— Rook 简化的是部署,不简化 Ceph 本身。第二篇的架构与运维知识在 Rook 里一项都少不了。

本章小结

  • Rook = operator + CRD:第二篇的一切操作声明化,kubectl-rook-ceph 让 ceph 命令无缝进 K8s
  • 生产三件事:metadataPool=ssd、MDS 内存 32Gi、检查 pg-autoscaler + Fast EC
  • 部署简化 ≠ 架构简化;Rook 与外部 Ceph 的取舍本质是"平台一体化 vs 存算分离"

自测

QuizRook 集群所有 pool 的 PG 数显示为 1、性能远低于预期。最可能关联的问题是?
多选关于 Rook 与外部 Ceph 的选择,合理的考量包括?(多选)
🧪Lab · Rook 部署 + 块/文件双供给挑战
⏱ 3 小时🖥 K8s 集群(≥3 节点,每节点 ≥1 空盘)
1. 按手册:label 存储节点 → 部署 operator → CephCluster(配好 public/cluster 网段)至 `kubectl rook-ceph ceph -s` HEALTH_OK。 2. 按 3.3 的生产参数部署 `CephBlockPool` 与 `CephFilesystem`(metadataPool=ssd、MDS 内存给足),各起一个 Pod 消费验证。 3. 执行手册"重要配置"两节(Fast EC + autoscale 检查 + 恢复优先),`ceph config dump` 留证。 4. 重启一个存储节点,观察 MON/OSD 自愈与 Pod 恢复时间;对照第二篇 6.5 演练剧本 6。 5. **验收标准**:回答"如果生产上马,你会选 Rook 还是外部 Ceph?给出三条理由",其中至少一条有本次实验数据支撑。
📎 参考手册 ↗

上一章 · 下一章:4. Ceph CSI 集成 →