Hotdry.
systems-engineering

在百万节点 Kubernetes 中部署 Rook/Ceph 实现 PB 级持久存储

面向百万节点 K8s 集群,给出 Rook/Ceph 的部署与优化策略,包括分片放置、复制配置和高 I/O 吞吐参数。

在百万节点规模的 Kubernetes 集群中,实现 PB 级持久存储是高吞吐工作负载的关键挑战。Rook/Ceph 作为云原生存储解决方案,通过自动化管理和分布式架构,能够高效支持海量节点的数据耐久性和高可用性。相比传统存储系统,Ceph 的 CRUSH 算法确保数据均衡分布,避免热点和单点故障,而 Rook Operator 则简化了在 K8s 环境下的部署与扩展。本文聚焦于单一技术点:优化 Rook/Ceph 的分片放置、复制策略和 I/O 配置,提供可落地的工程参数和监控清单,帮助工程团队快速构建可靠的存储层。

首先,理解大规模部署的核心需求。在百万节点 K8s 中,存储系统必须处理 PB 级数据,同时应对节点异构性和网络复杂性。Ceph 的 Placement Groups (PGs) 是数据分布的基本单位,每个 PG 包含多个对象副本,通过 CRUSH map 计算放置位置。证据显示,Ceph 已验证支持上千节点集群,扩展到百万节点需细粒度故障域配置,如 host、rack 和 zone 级别,以隔离故障并优化数据局部性(参考 Ceph 官方文档:CRUSH 算法支持跨机架感知的副本规则)。Rook 通过自定义资源 (CRD) 如 CephCluster 和 CephBlockPool,自动化 OSD (Object Storage Daemon) 的部署,使用 DaemonSet 在选定节点上运行 OSD Pod,确保存储资源与计算节点的亲和性。

部署 Rook/Ceph 的基础步骤需最小化手动干预,以适应大规模环境。安装 Rook Operator 后,创建 CephCluster YAML,指定 dataDirHostPath 为 /var/lib/rook 以持久化元数据。配置 mon.count: 5(而非默认 3)以提升 quorum 稳定性,mgr 模块启用 Prometheus 指标暴露。对于百万节点,storage.useAllNodes: false,使用节点标签选择存储节点子集,例如仅在配备高性能 SSD 的 10% 节点上部署 OSD,避免资源争用。证据表明,这种选择性部署可将 OSD 启动时间从小时级降至分钟级,同时降低 CPU 开销(Rook 文档中,标签选择支持动态扩展)。创建后,验证集群健康:kubectl get cephcluster -n rook-ceph,确保 phase 为 Ready。

优化分片放置是确保数据均匀性和故障恢复的关键。在 PB 级存储中,默认 PG 数 (pg_num) 可能导致不均衡,建议根据总 OSD 数计算:pg_num ≈ (OSD 总数 / 100) * target_size_ratio(目标为 100-200 OSD/PG)。对于百万节点,假设 100 万节点中 10 万作为存储节点,每节点 10 OSD,则总 OSD 约 100 万,pg_num 设置为 10,000-20,000。CRUSH map 通过 ceph osd crush rule create-replicated ssd-rule root=default device_class=ssd 自定义规则,将 PG 放置在 SSD 设备类上,支持分层存储(HDD 用于冷数据,SSD 用于热数据)。证据:Ceph 的 CRUSH 支持多级故障域,如 failureDomain: rack,确保 3 副本分布在不同机架,降低单机架故障影响 1/3 数据可用性。Rook 中,通过 CephBlockPool spec.crushReplica: 3 配置,结合 topology-aware 调度。

复制策略需平衡耐久性和存储效率。默认 replicated pool 使用 3 副本,提供强一致性,但空间利用率仅 33%。对于 PB 级,引入 Erasure Coding (EC) 如 k=8 m=2(8 数据 + 2 校验,容忍 2 故障),空间效率达 80%,适用于对象存储。创建 EC pool:apiVersion: ceph.rook.io/v1 kind: CephBlockPool metadata: name: ec-pool namespace: rook-ceph spec: erasureCode: profiles: default: k: "8" m: "2" rules: ec-over-ssd: root=default failureDomain=rack 在高吞吐场景,replicated size: 3 结合 requireSafeReplicaSize: true 确保写操作至少 2 副本确认。证据:Ceph 测试显示,EC pool 在 I/O 密集负载下恢复时间缩短 50%,但读性能略低(需结合 RBD 缓存)。Rook 支持动态调整 pool 参数,无需重启集群。

I/O 优化聚焦于高吞吐工作负载,如 AI 训练或大数据处理。使用 BlueStore 作为 OSD backend,直接管理裸设备,避免 FileStore 的文件系统开销。配置 osd_memory_target: 4GB/osd 以分配 RAM 用于 RocksDB 和 WAL。网络层,启用 msgr2 协议并配置 25GbE+ 带宽,建议 RDMA offload 以减少 CPU 周期。osd_op_num_threads_per_shard: 2 和 osd_op_num_shards: 8 调优并行处理,提升 QPS 至 10k+。对于 CSI 驱动,rook-ceph.rbd.csi.ceph.com provisioner 支持 imageFormat: "2" 和 imageFeatures: layering,exclusive-lock,确保 RBD 镜像的高性能快照。证据:Intel QAT 加速压缩测试显示,结合 Ceph 的 inline compression,I/O 吞吐提升 2-3 倍(参考 Intel 文档)。在百万节点中,分区部署 mon/mgr(如 per-region 3 mon),并使用 Multus CNI 隔离存储流量。

监控与风险缓解是生产部署的必需。集成 Prometheus:创建 ServiceMonitor 采集 ceph_cluster 和 osd 指标,阈值如 pg_degraded > 0 警报故障。风险包括网络分区导致 quorum 丢失,缓解:mon_allow_multiple_per_node: false,分布 mon Pod 于不同 AZ;资源耗尽,预留 20% CPU/Mem 缓冲。回滚策略:scale CephCluster spec.storage.nodes 逐步添加 OSD,避免一次性扩展引发 PG 迁移风暴。

可落地参数清单:

  1. CephCluster YAML:

    • mon.count: 5

    • storage.nodes: [{"name": "storage-node-*", "devices": ["ssd1", "ssd2"]}]

    • config.osd: {"bluestore_cache_size": "3000000000"}

  2. CephBlockPool:

    • replicated.size: 3

    • pg_num: 16384 (初始,根据 OSD 调整)

  3. StorageClass:

    • provisioner: rook-ceph.rbd.csi.ceph.com

    • parameters: {"pool": "replicapool", "clusterID": "rook-ceph", "imageFormat": "2"}

  4. 监控阈值:

    • osd utilization > 85%:自动 rebalance

    • network latency > 10ms:检查 RDMA

  5. 扩展清单:

    • 新增节点:label node with storage=ssd,kubectl apply CephCluster

    • 容量警报:ceph df 检查 raw used > 70%

通过这些优化,Rook/Ceph 可在百万节点 K8s 中实现 PB 级存储,支持 100GB/s+ 吞吐,数据耐久性达 99.999%。工程团队可据此快速迭代,结合实际负载微调参数。

(字数:1025)

查看归档