在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官方文档提供了详细的调优指南,但本教程不展开。
参考资料
延伸阅读
