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: 3 | CephCluster.spec.mon.count: 3 |
ceph osd pool create / rbd pool | CephBlockPool |
ceph fs new + MDS | CephFilesystem |
radosgw-admin + RGW | CephObjectStore |
| 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 16OSD 没上线?手册标准排查: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 部署 + 块/文件双供给挑战
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?给出三条理由",其中至少一条有本次实验数据支撑。
📎 参考手册 ↗