分布式存储 | 北京大道云行科技有限公司
随着容器云业务的快速发展,功能不断迭代以适应更多应用场景,满足更多业务需求。其对存储也提出了更高的要求,包括功能、性能、稳定性、兼容性等。CSI作为K8S容器云平台的标准存储接口,支持快照、克隆、扩容等高级功能。
GlusterD2作为Gluster的下一代管理引擎,有效扩展了Gluster的集群规模。增加更多功能以支持CSI访问,较好地兼容K8S容器云平台,被公认为K8S原生存储。
GlusterD2是Gluster的组成部分,Gluster是软件定义的分布式存储,一种开源可扩展的网络文件系统,容量可达数PB,支持对象、块和文件存储访问接口。Gluster的设计可满足各种规模的环境需求,拥有灵活的部署模式,适用于各种环境和基础架构。
GlusterD2是下一代Gluster管理引擎,以提供对devops的友好支撑。GlusterD2可以更好地扩展存储池中节点数量,为存储节点、共享卷、资源设备、服务管理操作提供高级管理接口。通过集成etcd存储,为受信任存储池内的状态管理提供强一致性。GlusterD2由Go语言开发,是一种引入了多项改进的架构重写模式,增强Gluster可扩展性,同时更易于配置、使用、集成和维护,尤其适用于大规模部署。GlusterD2还提供了更加灵活的插件框架,以提供一个完整的面向容器平台服务的体系结构。
GlusterD2有效增强Gluster的集群管理能力,将Gluster的集群推向数千节点的云级规模。GlusterD2致力于提供管理存储设备的功能,同时支持共享卷的高级API接口和常规CLI命令管理,使得监视和管理存储更加简单完善。
GlusterD2会将群集配置数据维护在集中存储中,而不是在每个集群节点。集中存储通过etcd实现,etcd只运行在集群中部分节点,只有运行etcd的节点参与RAFT共识机制,其它节点作为etcd代理或客户端。GlusterD2也是原生ReST服务,通过HTTP ReST API公开群集管理接口,CLI将被重写为使用该API的ReST客户端。
GlusterD2特点
完善的管理机制
GlusterD2支持高级API接口管理,GlusterD2将提供高级接口用于节点管理、卷管理、服务管理、设备管理、监视事件和长时间运行的异步操作。GlusterD2支持CLI命令管理,兼容Gluster中的所有CLI命令。通过API与CLI两种管理方式,使Gluster管理更加健全完善。
高效的集群交互
etcd集中存储是GlusterD2最重要的部分。etcd为GlusterD2提供集中的位置保存集群数据,供整个集群访问。选择etcd集中存储作为外部分布式复制的键值存储,而不是在GlusterD2中实现,有助于避免现阶段使用的复杂的交互。
简捷的交互框架
新的交互框架围绕etcd集中存储构建,相关操作仅在需要的地方执行,而不是在整个集群,并将结果最终提交到存储区将仅由启动事务的节点完成。有助于保持交互框架的简单和快速。
强大的集群规模
GlusterD2将Gluster的集群推向数千节点的云级规模,实现存储集群容量与性能的线性增长,为大容量、高性能业务提供强有力的存储支撑。
友好的日志记录
GlusterD2使用结构化日志记录,以提高日志的可读性和机器解析能力。结构化日志使用固定字符串以及附加的元数据,通常是键值对的形式,而不是可变日志字符串。结构化日志允许创建日志上下文,使特定的元数据可附加到上下文中的所有日志。有助于识别和截取与特定交互或请求相关的日志。
健全的功能体系
GlusterD2支持K8S容器云平台通过CSI存储接口进行访问,通过驱动程序实现与CSI的良好对接。支持容器卷的动态创建和扩容等自动化管理功能,支持容器卷的在线快照和在线克隆等高级特性功能。
支持容器化部署
将GlusterD2直接部署在K8S容器中,实现K8S计算与存储资源的自我管理。利用容器的部署方式使Gluster安装更加快速高效,降低了使用过程中的管理难度,良好的兼容性和轻量特性易于实现负载的动态管理,方便后期的快速扩容。
K8S(Kubernetes)是用于自动化部署、扩展、管理容器应用的开源系统。K8S消除编排物理与虚拟计算、网络和存储基础设施的负担,使管理员将重点放在以容器为中心的原语上进行自助运营。K8S提供稳定、兼容的基础,用于构建定制化的工作流和更高级的自动化任务。K8S具有高度自动化管理特性,能够自动部署、自动重启、自动复制、自动伸缩扩展。具有较强的快速部署和快速扩展特性,支持无缝对接新的应用功能,节省资源,优化硬件资源的使用。
存储系统是K8S最重要的组成部分,存放着容器运行的所有数据。K8S存储系统的核心内容有:Volume、PV、PVC、StorageClass。K8S存储系统根据业务需求,可归纳为无状态服务、有状态服务及有状态的集群服务。无状态服务无法保存状态数据,Pod(一个或多个容器的组合)重启后会造成原有数据丢失。而有状态服务和有状态集群服务可以保持容器状态数据,确保Pod重启后能够保存原有数据信息。
Volumes是最基础的存储抽象,本质上是容器挂载的目录。支持本地存储和网络存储,也支持特定存储的自定义插件。本地存储使用简便,但移植性、扩展能力、安全性较弱。相比之下,网络存储具有更出色的性能表现、且易于扩展,支持副本和纠删码等多种冗余方式保护数据安全,常用于生产环境。Volume属于Pod内部共享资源,生命周期与Pod相同,Pod终止将导致Volume的生命周期结束。
PersistentVolume(PV)是K8S集群中管理员配置的存储,是集群中的存储资源对象,PV生命周期独立于pod,能够实现数据持久化。PV与Volume区别在于PV是K8S中的资源对象,存放Pod数据且保证Pod重启后数据不丢失的持久卷,可单独存活,管理员无需创建Pod就可以创建独立的PV,PV资源的使用通过PVC来请求。
PersistentVolumeClaim(PVC)是用户对存储资源PV的请求,PV与PVC有静态和动态两种绑定模式。默认为静态模式,即用户发出PVC请求后,需管理员手动创建PV以响应PVC请求。否则PVC一直处于等待状态,直到管理员手动创建PV后请求完成。动态模式需要借助StorageClass实现,在PVC绑定PV时通常根据存储大小和访问模式两个条件来绑定。
StorageClass为管理员提供描述存储类型的方法。默认情况下,管理员需要手工创建用户所需的存储资源PV以响应PVC请求。利用StorageClass动态容量供给的功能,可实现自动创建PV的能力。即用户PVC发出请求后,由StorageClass自动创建PV响应PVC请求,减少管理员手动创建的复杂性和存储资源响应的繁琐流程。
CSI(Container StorageInterface)旨在能为容器编排引擎和存储系统间建立一套标准的存储调用接口,通过该接口能为容器编排引擎提供存储服务。借助CSI容器编排系统(CO)可以将任意存储系统(块或文件存储)提供给容器化应用。CSI标准可使存储厂商能够自行开发、维护和部署自定义的存储插件,为容器平台提供稳定的存储服务。
由于K8S核心代码中只支持较少的主流网络存储。存储插件与核心K8S二进制文件一起进行编译、构建、发布。在K8S中添加对新存储系统的支持,需要在核心K8S存储库提交代码,导致存储插件很难合并到K8S中。不仅如此,如果存储插件存在问题,有可能会影响K8S的其它组件正常运行,风险较大。因此,将容器存储进行抽象,通过标准接口的形式把存储部分移到容器编排系统外部。
CSI作为K8S容器存储的标准接口,可兼容不同类型的存储,有效解决了K8S平台的存储难题,支持容器卷自动创建挂载和删除功能。CSI使K8S添加存储更加简单,允许第三方存储提供商在不需要修改 K8S核心代码的情况下,依然可以开发存储插件。
K8S Core是K8S集群的核心内容,包含管理与计算节点。External Components是K8S支持CSI的扩展组件,由K8S社区维护。CustomComponents是由第三方存储厂商开发适配CSI的驱动程序。
External Component中的Driver registrar负责向K8S注册驱动程序的相关信息。External provisioner 负责监控K8S系统里的PVC请求,调用对应CSI接口创建或删除PV。External attacher 是可监听K8S系统里VolumeAttachment 对象,通过调用CSI接口完成相关请求。
Custom Components中的CSI Identity负责认证插件的状态信息,CSIController负责实际创建和管理容器卷,CSI Node负责在K8S节点上容器卷的相关功能
CSI特点
良好的兼容性
CSI是标准的存储接口规范,兼容所有主流的文件和块存储。且支持第三方厂商开发驱动程序与CSI进行对接,降低管理和维护的复杂度。
安全高效
存储厂商无需修改K8S核心代码,只需开发CSI驱动程序,就可以使K8S通过CSI接口访问自定义存储,有效简化存储对接K8S的工作流程,在保证安全的前提下有效提高效率。
高级功能特性
CSI支持容器卷的快照拍摄、在线克隆、动态扩容等高级功能。支持持久卷的动态自动化管理。
环境信息
集群信息:4节点集群环境,包含1 个管理节点和3 个计算节点
K8S版本:v1.15.2
Docker版本:18.06.1-ce
环境架构
K8S+GlusterD2部署环境中,GlusterD2以容器方式运行在所有K8S计算节点,并负责管理本地磁盘用于提供持久化共享存储。CSI驱动插件CSI Node需要部署在所有计算节点中,CSI Identity和CSI Controller只需要在集群的任意节点上部署一次即可。
部署过程
(1)准备K8S集群环境,该环境推荐最低配置为1个管理节点和3个计算节点,建议K8S版本为1.16以下。本次演示环境的配置信息如下:
(2)在K8S集群中,以容器化方式部署GlusterD2存储服务软件,部署过程中镜像下载较慢需要耐心等待。
GLusterD2部署完成后,通过 kubectl getpods -o wide命令可查看到状态为Running。
所有GlusterD2容器为Running后,需要进入容器中,执行命令:glusterclipeer add 创建Gluster集群。集群创建完成后通过glustercli peer list 命令可查看集群状态。
通过 glustercli device add 命令,可完成磁盘设备的添加。
(3)配置完成K8S集群环境与GlusterD2集群环境后,开始在K8S中部署GlusterD2的CSI驱动程序。
首先在GlusterD2容器的任意节点中,获取/usr/local/var/lib/glusterd2/auth文件的安全认证信息。并用获取的GlusterD2安全认证信息更新配置文件csi-attacher-glusterfsplugin.yaml、csi-nodeplugin-glusterfsplugin.yaml和csi-provisioner-glusterfsplugin.yaml中的–secret和–glusterurl内容。
信息更新正确后,开始配置CSI扩展组件。
配置好具备GlusterD2容器和CSI扩展组件的K8S集群后, 检查所有配置信息是否正确,要求所有pod为Running状态。
确定环境运行正常,之后创建storageclass实现动态管理,并创建pvc与app开始测试。
部署完成后, 查看pv与pvc绑定状态。
通过查看pod状态详情,以确定gluster存储卷被挂载成功,并可进行读写访问。
实践小结
通过CSI实现K8S与GlusterD2的完美结合,突破了K8S存储性能瓶颈,并实现数据持久化。K8S平台有效发挥了GlusterD2的亮点功能,GlusterD2作为文件存储支持多客户端同时读写,使Pod可以共享持久卷数据且支持RWX访问。GlusterD2支持容器卷的动态管理功能,通过StorageClass可自动创建PV以响应PVC请求。
GlusterD2支持容器卷的动态扩容功能,对于已被Pod访问的PV,直接修改PVC请求中容器卷的大小,可实现容器卷的在线扩容,扩容过程不影响Pod中业务的读写访问。GlusterD2支持容器卷快照功能,快照作为数据的保护方式,有效降低了误删除操作所带来数据丢失的风险,同时为其它环境异常时的数据恢复提供了快捷方式。GlusterD2支持容器卷克隆功能,克隆作为数据快速复制和多层保护的一种实现机制,有效提升了数据安全和工作效率。
GlusterD2支持CSI与Heketi工具实现自动化管理。Heketi通过高级接口管理gluster存储服务,实现多个gluster存储集群动态提供存储。只需指定容器卷容量和副本便能创建新卷,heketi在创建卷时可定位brick所在的节点。Heketi既可以提供GlusterFS卷的文件生命周期接口管理,也能提供gluster-block创建块设备的生命周期管理。不仅如此,heketi还可以提供卷扩容、磁盘替换、节点替换等高级操作接口。
06
总结展望
GlusterD2作为下一代Gluster分布式存储管理引擎,极大程度的扩展了Gluster集群规模,又实现Gluster与K8S容器云平台的良好对接。GlusterD2支持高级API接口与CLI命令等管理方式,在保证Gluster原有功能的同时,提供了更加健全精准的监控和管理,以及对devops的友好支撑。
K8S可通过Gluster平台实现容器卷数据永久存放,在降低对接与维护成本的同时,提供足够性能满足前端业务需求。Gluster支持K8S存储的所有功能,解决了K8S存储长期面临的痛点问题,被公认为K8S的原生存储。
参考链接:
Gluster博客关于Gluster 4.0和Kubernetes的文章
https://kubernetes-csi.github.io/docs/
GlusterD2源码
GlusterD2设计文档
CSI文档(kubernetes社区)
CSI spec
CSI中文指南