Rook #
Rook是开源、云原生的Kubernetes存储系统。生产级别文件存储、块存储和对象存储管理。
Rook是什么 #
Rook是用于Kubernetes的存储运维工具。
Rook将分布式存储系统转化为具备自管理、自扩展、自修复能力的存储服务。它自动化了存储管理员的任务,包括:部署、引导、配置、供应、扩展、升级、迁移、灾难恢复、监控以及资源管理。
Rook利用Kubernetes平台的强大功能,通过Kubernetes Operator提供对Ceph的支持。
Rook Operator已在多个行业的生产环境中部署。它帮助企业存储、分发和保护驱动业务的数据,为各行业提供强有力的支持。
Rook的特点:
- 简单可靠的自动化存储管理
- 支持超大规模或超融合架构的存储集群
- 通过高效分发和复制数据,最大限度减少数据丢失
- 提供和管理文件存储、块存储及对象存储
- 管理开源Ceph存储系统
- 轻松在数据中心启用弹性存储
- 基于 Apache 2.0 许可证发布的开源软件
- 在通用硬件上优化并高效运行工作负载
部署 #
Rook v1.16支持以下Ceph版本:
- Ceph Squid v19.2.0或更新版本
- Ceph Reef v18.2.0或更新版本
Rook v1.15支持以下Ceph版本:
- Ceph Squid v19.2.0或更新版本
- Ceph Reef v18.2.0或更新版本
- Ceph Quincy v17.2.0或更新版本
Rook 1.15部署指南: 使用Rook 1.15部署和管理Ceph(Squid) 19.2.0
存储架构 #
Ceph 是一种高度可扩展的分布式存储解决方案,支持块存储、对象存储和共享文件系统,并已在多年的生产环境中广泛部署验证。
设计 #
Rook 使用 Kubernetes 原生组件使 Ceph 存储能够运行在 Kubernetes 上。当 Ceph 在 Kubernetes 集群中运行后,Kubernetes 应用程序可以挂载由 Rook 管理的块设备和文件系统,也可以通过 S3/Swift API 访问对象存储。Rook Operator实现了存储组件的自动化配置,并持续监控集群以确保存储始终可用且运行良好。
Rook Operator是一个简单的容器,内含引导和监控存储集群所需的所有功能。Operator会启动并监控 Ceph 的监控器(Monitor)Pod,以及提供 RADOS 存储系统的 Ceph OSD 守护进程,并管理其他 Ceph 守护进程。通过初始化运行服务所需的 Pod 和其他资源,Operator能够管理池、对象存储(S3/Swift)和文件系统的自定义资源(CRD)。
Operator持续监控存储守护进程以确保集群的健康运行。当需要时,它会启动或迁移 Ceph Monitor,并在集群扩展或缩减时自动调整配置。Operator还会根据 Ceph 自定义资源(CR)中指定的目标状态变化,应用对应的调整。
Rook 自动配置 Ceph-CSI 驱动程序,将存储挂载到 Pod 中。rook/ceph 镜像包含管理集群所需的全部工具。Rook 不会直接进入 Ceph 的数据路径。它隐藏了许多 Ceph 的复杂概念,例如放置组(placement groups)和 CRUSH 映射(crush maps),使管理员无需操心这些细节。相反,Rook 提供了一个更加直观的用户体验,主要围绕物理资源、池、卷、文件系统和存储桶展开。当需要时,还可以通过 Ceph 工具进行高级配置。
Rook 使用 Golang 实现,而 Ceph 则使用 C++ 实现,其数据路径经过高度优化。这种技术组合能够实现两者的最佳性能。
架构 #
上图展示了支持的三种存储类型的典型应用场景:
- 块存储:蓝色应用程序表示块存储,挂载了一个 ReadWriteOnce (RWO) 卷。该应用程序可以对 RWO 卷进行读写操作,同时由 Ceph 管理输入/输出操作(IO)。
- 共享文件系统:两个紫色应用程序表示共享文件系统,它们共用一个 ReadWriteMany (RWX) 卷。这两个应用程序可以同时对该卷进行读写操作。Ceph 借助 MDS 守护进程,确保多个写入者的数据安全。
- 对象存储:橙色应用程序表示对象存储,可以通过标准 S3 客户端对一个存储桶进行读写操作。
在上述内容的虚线以下,组件分为以下三个层次:
- Rook Operator(蓝色层):自动化 Ceph 的配置管理。
- CSI 插件和provisioners(橙色层):由 Ceph-CSI 驱动程序提供卷的供应和挂载功能。
- Ceph 守护进程(红色层):运行核心存储架构的守护进程。可以查看术语表,以了解每种守护进程的详细信息。
为确保存储平台的高弹性,生产集群必须至少包含三个或更多节点。
块存储 #
在上图中,创建一个具有 ReadWriteOnce (RWO) 卷的应用程序的具体流程如下:
- 蓝色应用程序创建一个 PVC(持久卷声明)以请求存储资源。
- PVC 指定 Ceph RBD 存储类(storage class, SC)以供应所需的存储。
- Kubernetes 调用 Ceph-CSI RBD 供应器,生成一个对应的 Ceph RBD 镜像。
- 通过 Kubelet,CSI RBD 卷插件负责将该卷挂载到应用程序中。
- 卷完成挂载后,应用程序即可对其进行读写操作。
- 需要注意的是,ReadWriteOnce 卷在任意时刻只能挂载到一个节点上。
共享文件系统 #
在上图中,创建一个具有 ReadWriteMany (RWX) 卷的应用程序的具体流程如下:
- 紫色应用程序创建一个 PVC(持久卷声明)以请求共享存储资源。
- PVC 指定 CephFS 存储类(storage class, SC)以供应所需的共享存储。
- Kubernetes 调用 Ceph-CSI CephFS 供应器,生成一个 CephFS 子卷。
- 通过 Kubelet,CSI CephFS 卷插件负责将该卷挂载到应用程序中。
- 卷完成挂载后,多个应用程序即可同时对其进行读写操作。
- ReadWriteMany 卷可以挂载到多个节点上,支持多个应用程序同时使用。
对象存储S3 #
在上图中,创建一个具有 S3 存储桶访问权限的应用程序的具体流程如下:
- 橙色应用程序创建一个 OBC(对象桶声明)以请求一个存储桶。
- Rook Operator通过 lib-bucket-provisioner 生成一个 Ceph RGW 存储桶。
- Rook Operator生成以下资源:
- 一个 Secret,其中包含访问存储桶的凭据;
- 一个 ConfigMap,其中包含存储桶的相关信息。
- 应用程序从 Secret 中提取访问存储桶所需的凭据。
- 应用程序通过 S3 客户端,即可对存储桶进行读写操作。
- 使用兼容 S3 的客户端,结合存储桶信息(ConfigMap)和访问凭据(Secret),可以立即开始使用该 S3 存储桶。