首页   关于我们   服务项目   新闻动态   诚聘英才   资料文案   客户须知   联系我们
科研立项
普通科研立项/部省市级/项目申报书/标书/计划书/评职称科研等
结题报告
结题报告/研究报告/阶段报告/成果报告/调研报告/开题报告等
科学基金
自然/社会科学基金/产学研/青年/教育/软科学/863/学科点等
论文成果
期刊论文/毕业论文/应用文/代写/发表/翻译/成果编撰/出版等
 
基于Ceph的容器云存储的应用研究
添加时间: 2022/5/14 15:00:47 文章来源: 文章作者: 点击数:109

谢超群

(福建中医药大学 现代教育技术中心,福建 福州 350000)

 :  随着高校信息化的发展,高校数据中心采用微服务架构的应用越来越多,传统docker容器的存储技术面临着数据可靠性低,数据不能持久化,动态扩展性差等问题。面对上述高校微服务容器存储所面临的问题,本文提出一种基于Ceph存储集群平台和Kubernetes后端存储技术的高校容器云存储的解决方案,该方案利用Ceph构建底层云存储集群,解决了存储数据的可靠性差的问题,并利用KubernetesPersistent VolumeDynamic provisioning存储技术实现了容器应用存储的持久化和动态置备,解决了数据持久化和动态扩展的问题

 

关键词: Ceph;Kubernetes;Persistent Volume;数据中心

中图分类号: TP391.1        文献标识码: A       doi:10.3969/j.issn.1006-2475.

Application Research of Container Cloud Storage based on Ceph

XIE CHAO QUN

( Modern Educational Technology Center,Fujian University of Traditional Chinese Medicine , FuZhou 350000 , China)

Abstract: With the development of information technology in Colleges and universities, the application of micro-service architecture in university data center is more and more. The storage technology of traditional docker container is faced with the problems of low data reliability, poor data persistence and poor dynamic scalability. Faced with the above problems, this paper proposes a solution of University container cloud storage based on Ceph storage cluster platform and Kubernetes back-end storage technology. This solution uses Ceph to build a low-level cloud storage cluster, which solves the problem of storage datas poor reliability .And the persistent Volume and dynamic provisioning storage technology of Kubernetes are used to realize the persistence and dynamic provisioning of container application storage, which solves the problem of data persistence and dynamic expansion.

Key words: Ceph;Kubernetes;Persistent Volume;Data Center


1   引言

  随着高校数据中心微服务架构应用的不断普及,高校数据中心的docker容器化部署的应用日渐增多,docker容器技术面临着以下的一些问题:

1.有些关键容器应用的数据非常重要,Docker容器技术只能默认挂载本地节点存储空间,一旦容器所在发生故障,存在数据丢失的安全风险。

2.很多容器应用需要持久化保持数据如WEB应用,数据库应用等,然而由于容器技术自身的局限性,当容器重启或删除之后,容器中挂载的数据会丢失,无法保留持久性数据。

3.Docker容器技术只能在本地划分相应的存储空间挂载到容器中,无法划分出让多个服务器上的容器应用动态扩展共享使用的存储空间。

  面对上述docker容器技术在高校数据中心应用所存在的问题,利用CEPH分布式存储技术来搭建多节点高可靠性存储集群作为容器数据的后端存储平台,同时构建Kubernetes云容器平台作为前端的容器云存储管理平台,来实现容器应用数据存储的持久化和动态扩展。  

2  Ceph分布式存储简介

Ceph是加州大学Santa Cruz分校的Sage Weil博士开发的一个开源分布式存储平台,Ceph可以提供高可扩展性和高可靠性的存储平台,并满足对象存储、块存储和文件系统存储等多种存储类型的需求,可以处理所有类型的数据存储包括对象、块和文件存储类型。Ceph的存储集群底层基于 RADOS来开发。由于 RADOS的高扩展性存储容量可以动态扩展到PB级。Ceph还采用CRUSH 算法动态地重分布和调整数据。该算法拥有高容错性和高一致性数据冗余机制,保证了数据的高可靠性[1]Ceph的体系架构图如下图1所示

图一:Ceph的体系架构图

 Ceph的底层是RADOS,他是一种稳定的,独立和完全分布式的面向对象的存储,具备自主健康检查,自主恢复,自主管理和高级智能等特点。Ceph中RADOS存储集群是所有其他客户端接口使用和部署的基础,RADOS负责执行数据的复制、故障检测和恢复,同时利用CRUSH 算法在集群节点之间的迁移和再平衡数据确保数据的一致性和可靠性。所有的Ceph存储类型包括对象存储、块存储和文件系统存储都从底层的RADOS来读写数据。RADOS存储集群主要由OSD节点集群和Monitor节点集群及MDS元数据节点所组成,OSD节点与服务器的磁盘绑定,支持xfs,btrfs,ext4等多种文件系统。OSD节点还负责存储对象数据,并与其他OSD节点通过心跳通讯共同协作完成复制数据、恢复数据、重平衡数据等功能。Monitor节点负责监控整个Ceph集群,维护整个Ceph集群的健康状态及整个集群的状态更改的历史信息。同时维护Ceph集群中各种Cluster map,如OSD Map、Monitor Map、PG Map和CRUSH Map,Cluster map是RADOS的关键数据结构,当要存储数据时,OSD要先根据从Monitor节点获取的最新的Map图,然后通过Object id和Map图计算出数据存储的位置[2]MDS元数据节点主要负责为Ceph的文件系统CephFS提供元数据服务,MDS元数据节点的主要负责将所有的文件系统元数据存储在高速内存中,客户端对文件系统的操作将由MDS元数据节点快速反馈,而不用直接消耗OSD设备的I/O,为CephFS提供了高性能保证。LIBRADOS模块是客户端用来访问RADOS对象存储设备的函数库。Ceph客户端可以用LIBRADOS里封装的功能和对象存储交互,所有Ceph存储类型都利用LIBRADOS来访问底层的OSD存储的数据。RADOSGW负责为客户端提供面向对象的存储服务,它是一个基于LIBRADOS向客户端提供RESTful接口的对象存储接口,兼容Amazon S3和OpenStack Swift的大部分API接口,RADOSGW在实际应用中是一个监听RESTfulAPI访问的后台进程,它负责与客户端交互同时将读写数据的操作发送到Ceph底层的RADOS[3]Ceph的块存储服务RBD支持常用存储介质如硬盘,光盘等,可以为Ceph客户端提供虚拟块存储服务,挂载在服务器的文件系统内部,该块设备还支持精简制备和快照等常用存储特性。CephFS为Ceph客户端提供兼容POSIX的分布式文件系统,通过配置MDS元数据管理节点,配合客户端安装对应的Linux内核模块CephFS KernelObject组件,来实现操作系统对Ceph分布式文件系统的无缝访问[4]

3  Kubernetes后端存储技术简介

    Kubernetes根据容器pod的应用场景将提供的容器服务分为了三类:无状态服务、有状态服务和有状态集群服务。无状态服务不需要保存数据,只需要要对外提供服务就可以,状态数据的丢失不影响服务的正常运行。有状态服务需要保存程序运行中的状态数据,例如Redis服务的应用容器需保留运行中状态数据,Kubernetes为有状态服务提供了Volume和Persistent Volume存储服务来保存数据。有状态集群服务在有状态服务的基础上不仅需要保存状态数据,还需要对集群进行管理,需要动态地扩展和收缩服务所需要的存储容量,Kubernetes采用StorageClass来进行Persistent Volume的动态存储置备达到动态伸缩集群存储容量的目的[5]

   根据上述Kubernetes的应用场景,Kubernetes的存储系统从低到高可以分为三个层次: Volume、Persistent Volume 和动态存储置备(Dynamic Provisioning)。Volume是与Kubernetes的容器POD绑定的存储,分为二种子类型:emptyDir是挂载在容器POD里面的匿名的空目录,当POD删除时emptyDir将被删除,主要用来POD之间共享状态数据。另外一种Volume类型是 hostPath,它可以映射挂载宿主机中的存储路径到POD,独立于POD的生命周期,当POD删除时数据并不会丢失,但POD迁移到Kubernetes集群的另外一个节点时POD挂载的数据会丢失,因此这种存储类型只能在POD位于某个固定Kubernetes集群节点时临时存储数据[6]

   Persistent Volume是Kubernetes定义的独立于POD的存储资源对象,Persistent Volume底层可以支持NFS,CephFS,AWS等各类存储。管理员可以根据业务所需要的存储容量和访问模式来创建Persistent Volume,POD可以通过申明 PersistentVolumeClaim来挂载Persistent Volume, PersistentVolumeClaim类似于POD的存储请求,可以设置PersistentVolumeClaim来静态或者动态挂载Persistent Volume。Persistent Volume里存储的数据不会随着POD的删除而删除,也独立于Kubernetes集群的节点,Persistent Volume是集群定义的存储,当POD迁移到其他的Kubernetes集群节点时,不影响容器POD继续挂载Persistent Volume里面的数据,可以达到POD无缝迁移不影响业务正常运行的效果[7]Persistent Volume的定义方式如下图2所示

2:Persistent Volume存储卷的定义

    Capacity用于定义PV的所使用的存储大小。accessModes定义资源的访问模式,包含三种访问模式:ReadWriteOnce 指该Persistent Volume能被Kubernetes集群里的单个节点以读写方式挂载使用,ReadOnlyMany指该Persistent Volume能被Kubernetes集群里的多个节点以只读方式挂载使用, ReadWriteMany指该Persistent Volume 能被Kubernetes集群里的多个节点以读写方式挂载使用。PersistentVolumeReclaimPolicy用来定义Persistent Volume使用完成之后的处理策略,包含Retain,Cycle,Delete三种方式,Retain模式是当Persistent Volume使用完成之后保留,等待管理员手动来处理该存储资源。Cycle模式将会使用数据擦除命令清空Persistent Volume上的数据提供给新的POD所使用。Delete模式删除Persistent Volume,同时也会删除底层存储中的存储卷。mountOptions可以指定挂载的底层存储的选项,支持NFS,RBD,CephFS等存储类型。StorageClassName用来定义设置存储资源的级别,当PersistentVolumeClaim请求相应级别的存储时,该Persistent Volume将被这个PersistentVolumeClaim所绑定。

    动态存储置备是指可以根据容器POD的请求动态创建Persistent Volume,不需要管理员预先创建Persistent Volume来满足存储资源的需求。Kubernetes集群通过定义StorageClass资源对象来实现,然后用户在 PersistentVolumeClaim 中添加StorageClass参数就可以申请动态提供存储,StorageClass资源对象主要来描述存储类型,并提供动态存储容量供给的功能[8]。动态存储置备的方式一般应用在有状态集群服务,需要动态伸缩存储资源的应用场景下。

4 校园容器云存储应用研究

 随着高校数据中心微服务架构的增多,很多服务类似Nginx Web服务,Redis缓存服务,Mysql服务都迁移到了Docker容器架构上,然而这些传统的服务迁移到Docker容器中遇到了很多问题,如存储数据和容器绑定,只能挂载本地宿主服务器的存储,无法实现容器内数据的共享以及容器存储在服务器集群的无缝迁移。面对传统Docker容器技术存在的问题,利用CephFS搭建底层存储集群,然后利用Kubernetes后端存储技术可以解决上述问题。

整个校园容器云存储从上到下分为三个层次:底层存储层,Persistent Volume层,动态存储置备层。底层存储层采用三台服务器搭建Ceph FS存储集群来实现,一台服务器作为管理节点和元数据节点安装Ceph Monitor和Ceph MDS,另外二台服务器数据存储节点安装Ceph OSD作为存储节点。该Ceph存储集群将采用CephFS文件系统存储的方式为上层提供底层存储服务。CephFS满足多个集群节点挂载可读写存储的需要,可以解决容器POD跨节点迁移的存储问题。由于Ceph存储系统当写入数据时,都会先写入到一个日志盘,当写满日志盘后才会写入到数据盘中,因此这三台服务器都配置了固态硬盘来作为日志盘,来提高整个Ceph存储集群的读写性能。Persistent Volume层作为对接底层存储的服务层为Kubernetes集群的Pod提供存储服务。Persistent Volume是Kubernetes集群中独立的资源对象,可以编写yaml文件来生成对应的Persistent Volume,yaml文件的编写如下图3所示:

3:基于CephFS的Persistent Volume存储卷定义

该文件创建了一个300G的Persistent Volume,这个PV采用多节点可读写的挂载方式可以被Kubernetes集群里的多个节点读写,可以满足容器POD迁移到其他节点时存储无缝迁移挂载的需要,同时该Persistent Volume还可以被多个容器POD挂载来共享读写数据。 Monitors参数指定Persistent Volume底层对接的Ceph的管理节点来使用Ceph的底层存储服务。User和 SecretRef定义访问ceph存储集群的用户名和访问认证密钥。StorageClassName指定存储的类别名称,当动态存储置备存储时PersistentVolumeClaim可以直接绑定到相应存储类型的Persistent Volume上。

动态存储置备层可以利用PersistentVolumeClaim和StorageClass 资源对象定义所需要的存储容量和存储的类别来动态申请容器Pod所需要的存储,可以满足有状态集群服务对所需存储动态扩展的需求。动态存储置备层要实现对Ceph FS存储的动态划分需要在Kubernetes集群中部署Cephfs Provisoner 存储动态置备的插件。Cephfs Provisoner由cephfs provisoner.go和cephfs provisoner.py等脚本组成。Cephfs provisoner.go是Cephfs Provisoner的核心组件,主要是监控 Kubernetes集群中 PersistentVolumeClaim的存储资源请求事件,然后调用 cephfs provisoner.py的脚本创建Persistent Volume。cephfs provisoner.py是用python语言编写的与Cephfs交互的命令行脚本,里面封装了对Cephfs的volume增删改查的各种操作。安装完成Cephfs Provisoner后需要创建StorageClass 和PersistentVolumeClaim资源对象,才能实现动态存储的置备。StorageClass 和PersistentVolumeClaim编写的Yaml文件如下图4所示:

4:基于CephFS的StorageClass 和PersistentVolumeClaim的定义

StorageClass 的yaml文件创建了一个名称为 Cephfs的存储类别,namespace参数定义命名空间为cephfs,该参数必须与PersistentVolumeClaim的命名空间名称一致。provisioner参数定义了Cephfs存储动态置备的支持驱动。Parameters参数定义要连接的Cephfs的管理节点地址和认证账号密钥。PersistentVolumeClaim的yaml文件创建了名称为claimngnix的存储请求, namespace参数定义了和 StorageClass一致的命名空间。annotations参数引用了要动态创建的存储资源类别名称cephfs,与之前定义好的StorageClass实现关联。accessModes参数定义了请求的存储资源可被Kubernetes集群里的多个节点读写。resources参数定义需要动态给容器POD配置的存储容量。通过上述的配置动态存储置备层就可以正常运行了,该层无需手动再创建Persistent Volume。只需要创建PersistentVolumeClaim,Cephfs Provisoner会自动根据PersistentVolumeClaim的请求来在后端的cephfs存储集群上创建相应的Persistent Volume。

5结束语

    随着高校数据中心业务的不断增多,目前很多业务都是微服务架构的容器部署模式,通过部署 Kubernetes容器集群,配合利用 Kubernetes后端存储组件连接Cephfs存储集群构建容器云存储平台,可以满足数据中心应用容器数据存储高可靠性和容器应用数据的持久化的需求,同时实现了容器应用集群的存储共享和动态扩展,解决了高校数据中心传统Docker容器应用所面临的存储问题。

参考文献: 

[1] 基于Ceph的云存储系统设计与实现[D]. 程靓坤.中山大学.2014

[2] Ceph:a scalable, high-performance distributed file system.Weil S A,Brandt S A,Miller E L, et al. Proceedings of the 7th symposium on Operating systems design and implementation (OSDI 06). 2006

[3] Ceph Documentation.http://docs.ceph.com/docs/master/radosgw/ .2018

[4] Ceph Documentation.http://docs.ceph.com/docs/master/cephfs/ . 2018

[5] 基于Kubernetes的容器云平台实战 [M].机械工业出版社.陆平,左奇.2018:145-146

[6] Kubernetes权威指南[M].电子工业出版社.龚正. 2017:37-41

[7] Kubernetes Documentation . https://Kubernetes.io/docs/concepts/storage/persistent-volumes/ .2018

[8] Kubernetes Documentation . https://Kubernetes.io/docs/concepts/storage/dynamic-provisioning/ .2018

参考文献英文:

[1] Design and implementation of cloud storage system based on Ceph[D].Liangkun  Cheng.Sun Yat-sen University. 2014

[2] Ceph:a scalable, high-performance distributed file system.Weil S A,Brandt S A,Miller E L, et al. Proceedings of the 7th symposium on Operating systems design and implementation (OSDI 06). 2006

[3] Ceph Documentation.http://docs.ceph.com/docs/master/radosgw/ .2018

[4] Ceph Documentation.http://docs.ceph.com/docs/master/cephfs/ . 2018

[5] Container Cloud Platform actual Combat based on Kubernetes  [M]. China Machine Press. Lu Ping, Zuo Qi.2018:145-146

[6] Kubernetes Authoritative Guide [M]. Electronic Industry Press.Gong Zheng.  2017:37-41

[7] Kubernetes Documentation . https://Kubernetes.io/docs/concepts/storage/persistent-volumes/ .2018

[8] Kubernetes Documentation . https://Kubernetes.io/docs/concepts/storage/dynamic-provisioning/ .2018

 
@Kcpaper 工作室 2009-2021 版权所有:科创工作室 1024*768显示最佳 皖ICP备12010335号-9 点击这里给我发消息