使用Rook部署Ceph提供Kubernetes持久化存储

本文介绍如何通过Rook在Kubernetes集群中部署Ceph,提供持久化存储。涵盖架构原理、安装步骤、StorageClass配置、动态供给及故障排查,帮助您快速实现云原生存储。

使用Rook部署Ceph提供Kubernetes持久化存储
封面图:ZuCDN · ZuCDN 原创

在Kubernetes中实现持久化存储,Rook部署Ceph是当前生产环境最常用的方案之一。Rook将Ceph的部署、配置和管理自动化,通过Kubernetes原生的方式提供块存储(RBD)、文件存储(CephFS)和对象存储(RGW)。本教程直接给出判断路径:先理解Rook与Ceph的协作机制,再按步骤部署Operator、创建CephCluster、配置StorageClass,最后验证动态供给。整个过程约需15分钟,前提是你有一个健康的Kubernetes集群(v1.16+)和足够的资源(至少3个节点,每个节点有未使用的块设备)。

判断路径:Rook与Ceph如何协作

Rook是一个开源编排器,它将Ceph的复杂运维封装为Kubernetes自定义资源(CRD)。部署Rook后,你会得到两个核心组件:Rook Operator和CephCluster CRD。Operator负责监听CephCluster资源的变化,并自动创建Ceph的Mon(监控)、OSD(对象存储守护进程)、MGR(管理)等Pod。Ceph本身是一个分布式存储系统,提供统一存储平台,而Rook只是它的“安装器”。这种分离意味着:Rook简化了Ceph的部署,但存储引擎仍然是Ceph,因此你需要了解Ceph的基本概念(如Pool、PG)来优化性能。

选择Rook的前提是:你的Kubernetes集群需要支持CSI(Container Storage Interface),因为Rook v1.7+默认使用CSI驱动。你可以通过kubectl get csidrivers检查是否已有CSI驱动(如rbd.csi.ceph.com)。如果没有,Rook的部署过程会自动注册。

部署Rook Operator

首先,克隆Rook仓库并切换到稳定版本(如v1.14):

git clone --single-branch --branch v1.14 https://github.com/rook/rook.git
cd rook/deploy/examples

然后创建CRD和Operator:

kubectl create -f crds.yaml -f common.yaml -f operator.yaml

验证Operator是否运行:kubectl -n rook-ceph get pod,等待rook-ceph-operator状态为Running。常见误区:如果你使用kind或minikube,需要额外配置,因为Rook要求节点有原始块设备,虚拟环境需要模拟。

创建CephCluster

编辑cluster.yaml文件,配置你的存储节点。关键参数包括:dataDirHostPath(存储元数据的宿主机路径,如/var/lib/rook)、storage.nodes列表(指定每个节点上可用的设备,如name: "sdb")。如果你想让Rook自动发现所有未使用设备,可以设置useAllDevices: true,但生产环境建议明确指定设备,避免误用系统盘。

kubectl create -f cluster.yaml

创建后,Rook会启动Mon和OSD Pod。监控状态:kubectl -n rook-ceph get pod,等待所有Pod Running。你可以通过kubectl -n rook-ceph get cephcluster查看集群状态,当PHASE变为Ready时表示Ceph集群已就绪。注意:OSD Pod需要至少3个节点才能达到高可用,如果只有1个节点,Ceph集群仍可运行但存在单点故障。

配置StorageClass实现动态供给

Ceph集群就绪后,你需要创建StorageClass来动态供给持久化卷。Rook提供了示例文件storageclass.yaml。对于块存储,使用RBD CSI驱动:

kubectl create -f csi/rbd/storageclass.yaml

默认的StorageClass名为rook-ceph-block。如果你希望它成为默认存储类,添加注解storageclass.kubernetes.io/is-default-class: "true"。验证:kubectl get sc。此外,Rook还提供CephFS文件存储的StorageClass(csi/cephfs/storageclass.yaml),适合ReadWriteMany场景。

验证持久化存储

创建一个PVC并部署测试应用:

kubectl create -f csi/rbd/pvc.yaml
kubectl create -f csi/rbd/pod.yaml

检查PVC是否绑定:kubectl get pvc。如果状态为Bound,说明动态供给成功。你可以在Pod内写入数据,然后删除Pod并重新创建,数据依然存在。常见失败条件:如果PVC一直Pending,检查StorageClass是否存在、Ceph集群是否健康(kubectl -n rook-ceph get cephcluster),以及CSI插件是否正常运行。

常见误区与故障排查

  • 设备选择错误:使用useAllDevices: true时,可能导致OSD创建在包含文件系统的设备上,引发数据丢失。务必明确指定设备或使用过滤器。
  • 资源不足:Ceph Mon建议至少1GB内存,OSD需要额外内存,如果节点规格过小,Pod可能反复重启。
  • 网络问题:Ceph集群内部通信需要稳定的网络,跨节点延迟过高会导致性能下降。
  • 删除集群:直接删除CephCluster CRD不会清理OSD数据,需要先修改cluster.yaml设置cleanupPolicy,否则会残留数据。

如果遇到Pod启动失败,查看日志:kubectl logs -n rook-ceph <pod-name>。Rook社区提供了丰富的故障排查文档,但本教程只覆盖最常见问题。

生产环境建议

在将Rook-Ceph用于生产前,请考虑:使用专用存储节点,确保OSD使用独立磁盘;配置监控(Prometheus)和告警;定期备份Ceph配置(Rook会自动备份)。另外,Ceph的性能调优涉及Pool的副本数、PG数量等,需要根据工作负载调整。Rook官方文档提供了详细的调优指南,但本教程不展开。

参考资料

延伸阅读