
我们在香港多机房Kubernetes集群中陆续上线了多个业务模块,从媒体转码、AI训练、Web服务,到数据处理任务。最初使用的是 hostPath 本地挂载和 NFS 方式提供 PV,但随着 Pod 调度频繁、节点漂移、存储资源隔离等问题暴露,这种方式在动态扩容、QoS 限流、IO 隔离层面显得无能为力。
在数次业务中断后,我们决定彻底替换底层存储方案。最终我们选择在 CephFS 之上,借助 Rook Operator 完整接入 K8s 的存储调度体系。这个决策不仅让我们实现了多租户隔离、弹性卷动态创建、跨节点挂载恢复,更为后续接入 QoS 策略打下了扎实基础。
本文是我在香港数据中心中,基于实际部署经验撰写的 CephFS + Rook 的完整落地实战笔记。
一、整体架构与部署目标
核心目标
- 基于现有 Ceph 存储集群,提供 K8s 动态 PV/PVC;
- 实现可调度、可扩展、可配 QoS 的持久化卷;
- 支持 Pod 故障漂移时,数据自动挂载恢复;
- 区分低优先级(缓存型)与高优先级(业务核心)存储策略。
架构设计
[ Kubernetes Cluster (Telehouse + MEGA-i) ]
| |
[ Rook Operator ] [ Ceph MDS + MON + OSD ]
| |
[ StorageClass -> CephFS PVC -> RBD/FS Backends ]
二、CephFS + Rook 的部署步骤
1. 环境准备
- K8s版本:v1.28+
- Rook版本:v1.13.x
- 网络要求:容器网络需能访问 MON/OSD 端口(6789,6800+),建议搭建专用存储网桥或 overlay 网络。
2. 部署 Rook Operator
git clone --single-branch --branch v1.13.5 https://github.com/rook/rook.git
cd rook/deploy/examples
# 创建 CRDs + Operator
kubectl apply -f crds.yaml
kubectl apply -f common.yaml
kubectl apply -f operator.yaml
3. 配置 CephCluster 对象(自定义集群拓扑)
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
cephVersion:
image: quay.io/ceph/ceph:v18.2.2
dataDirHostPath: /var/lib/rook
mon:
count: 3
allowMultiplePerNode: false
storage:
useAllNodes: true
useAllDevices: false
nodes:
- name: "node1"
devices: [{name: "/dev/sdb"}]
- name: "node2"
devices: [{name: "/dev/sdb"}]
mgr:
modules:
- name: pg_autoscaler
enabled: true
节点必须具备SSD或高IO磁盘作为OSD数据盘,推荐配套NVMe做WAL区。
4. 启用 CephFilesystem(创建 CephFS)
apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
name: ceph-fs
namespace: rook-ceph
spec:
metadataPool:
replicated:
size: 3
dataPools:
- replicated:
size: 3
metadataServer:
activeCount: 2
activeStandby: true
5. 创建 StorageClass + Provisioner
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: cephfs-storage
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:
clusterID: rook-ceph
fsName: ceph-fs
pool: ceph-fs-data0
csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Retain
allowVolumeExpansion: true
StorageClass 配置允许弹性扩容,可结合 PVC 动态调整大小。
三、弹性卷与 QoS 策略实战
1. 动态 PVC 创建示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ai-cache-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: cephfs-storage
resources:
requests:
storage: 100Gi
CephFS 支持 RWX(多节点读写共享),适合缓存、模型存储。
2. QoS 策略应用(通过 K8s Pod 限制 IO)
apiVersion: v1
kind: Pod
metadata:
name: io-test-pod
spec:
containers:
- name: app
image: ubuntu
command: ["/bin/bash", "-c", "while true; do dd if=/dev/zero of=/mnt/data/testfile bs=1M count=100; sleep 1; done"]
volumeMounts:
- name: data
mountPath: /mnt/data
resources:
limits:
cpu: "2"
memory: "2Gi"
volumes:
- name: data
persistentVolumeClaim:
claimName: ai-cache-pvc
若使用 K8s QoS 类别 Guaranteed + cgroups blkio 限制策略,可进一步结合容器运行时(如 containerd)的 blkio.weight 实现 IOPS/QPS 隔离。
3. 多租户隔离方案
- 每个 namespace 使用独立的 StorageClass 与 Secret;
- 启用 VolumeQuota 限制每个租户的总存储使用量;
- 可选部署 KubeSlice 做存储与网络统一隔离。
四、运维优化与故障处理建议
| 操作 | 命令/方法 |
|---|---|
| 查看集群健康状态 | kubectl -n rook-ceph exec deploy/rook-ceph-tools -- ceph status |
| 扩容 OSD | 编辑 CephCluster,添加新节点 |
| 查看 MDS 状态 | ceph fs status |
| 清理未释放 PVC | 确保 ReclaimPolicy 为 Delete 且对应 Volume 已解绑 |
故障处理实战
| 故障类型 | 解决方法 |
|---|---|
| PVC Pending | 检查 provisioner pod 状态与权限配置 |
| MDS 崩溃 | 检查 mgr logs,重启 MDS deployment |
| 节点磁盘挂载失败 | 检查 hostPath 权限与节点 label 匹配 |
五、后续优化与建议
- 引入 Prometheus + CephExporter 进行 IO 时延、吞吐监控;
- 针对模型训练等突发性 I/O,结合 QoS class 动态调整 PVC 配额;
- 部署多副本 CephCluster 支持跨地域冗余(如新加坡 Region);
- 若业务对元数据一致性要求极高,可启用 CephFS journaling 模式。
六、从存储“周边设施”到调度“核心能力”,Rook+CephFS 已成主流之选
Kubernetes 的存储问题,不能只靠临时卷与共享 NFS 靠山吃山。真正稳定、可运维、支持多机房部署的持久化方案,需要从底层架构开始构建。CephFS 提供了可靠的文件系统基础,而 Rook 则让它彻底融入了 Kubernetes 的生态。
这套方案已在我司多个香港业务系统中稳定运行超过 6 个月,支撑了近 100TB 的数据写入与多租户应用切换。
明年,我计划落地基于 Ceph RBD + Topolvm 的精细块存储调度策略,结合 NUMA-Aware 与边缘节点能力实现 AI 训练 IOPS 最优调度。











