CephFS + Rook 在香港机房 Kubernetes 中的弹性卷调度与 QoS 策略实战部署

CephFS + Rook 在香港机房 Kubernetes 中的弹性卷调度与 QoS 策略实战部署

我们在香港多机房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 最优调度。

未经允许不得转载:A5数据 » CephFS + Rook 在香港机房 Kubernetes 中的弹性卷调度与 QoS 策略实战部署

相关文章

contact