分布式存储|北京大道云行科技有限公司

1 FASS-CSI背景

随着Kubernetes容器编排系统的持续发展,应用程序的开发与部署方式经历了巨大的变革。微服务结构体系的兴起,促使基础架构与应用程序逻辑之间相互解耦。

kubernetes容器系统为容器化应用提供了可移植性、可伸缩性、快速部署、共享资源等特性,几乎所有的容器应用都是有状态的,然而kubernetes并不支持状态存储,因此kuernetes需要依靠外部存储为容器化应用提供存储资源。

FASS是大道云行(Taocloud)自主研发的分布式全闪块存储系统,拥有业内领先的性能,可以提供高IOPS的存储卷,供应用使用。

本文介绍了FASS-CSI插件,它作为Kubernetes pod容器应用和FASS Volume的桥梁,实现了容器的有状态存储,实现了存储的创建、删除、重连接等功能的接口。

01 FASS全闪存系统

FASS是大道云行(TaoCloud)面向高IO密集型应用场景,完全自主研发的分布式全闪存存储系统。基于高效的分布式存储软件设计和高性能的全闪存硬件平台,FASS可将多个节点的SSD资源通过高速以太网或Infiniband网络组成一个高性能、高可用、易扩展块存储资源池,支持iSCSI, iSER, NVMEoF访问协议,可广泛应用于如下各类高IO、高性能要求的业务场景:

01

|强大的性能:FASS采用主流的服务器硬件和全NVMe硬盘配置,通过软件层面先进的体系结构设计、微控制器并行流水线设计、多级元数据索引管理,实现了三节点千万级IOPS、100us级延迟的强大性能;

02

|极高的可靠性:FASS采用全对称分布式架构,可实现多节点的IO均衡与叠加,结合多副本、纠删码、快照等冗余与数据备份机制,消除了存储系统的单点故障,也保证了可靠的存储服务输出。

03

|大规模扩展:FASS的分布式集群支持3-512 scale out扩展,单卷可达32PB容量。通过数据分布与元数据管理的自动负载均衡,实现按需扩展,满足业务动态发展的苛刻要求。

02 Kubernetes持久化存储

Kuberbetes作为容器编排工具,提供了管理存储的解决方案:存储卷(Volume)、持久卷(PersistenVolume)、持久卷声明(PersistenVolumeClaim)、存储类(StorageClass)和动态供应(Dynamic Provisioning)等,具体存储概念为: 01

|Pod:Kubernetes中创建和部署的最小单元,Pod中开启一个或多个容器,提供容器存储、网络等共享资源。

02

|Volume:Pod内部共享存储资源,生命周期和Pod相同。

03

|PersistenVolume (PV):独立于Pod的数据持久化存储资源,管理员创建PV,提供给Pod使用,生命周期不会随着pod终止与删除而消失。

04

|PersistenVolumeClaim (PVC): 持久卷声明,表示计算任务对存储资源的需求,Kubernetes中Pod通过PVC来使用PV,使Pod和PV解耦,将底层存储细节与pod隔离。

05

|StorageClass (SC):存储类,实现动态创建 PV 的模板,Kubernetes 将 StorageClass 相同的 PVC 和 PV 进行绑定。

06

|Dynamic Provisioning(动态供应):通过StorageClass定义存储资源,Kubernetes在使用存储资源时动态创建。

在生产环境中,开发人员通常依赖外部存储,传统的分布式存储和网络存储如Ceph、NFS可以运行在kubernetes系统中,为Kubernetes中运行的其它容器应用提供内置的分布式存储访问能力。kubernetes连接外部存储的解决方案称为存储插件,存储插件支持抽象存储,并赋予存储可移植性。上图为kubernetes使用外部存储的具体流程:

▲Pod中容器应用加载Volume,请求PVC;

▲静态供应:PVC找到对应的外部存储已创建持久卷PV;动态供应:PVC找到存储类StorageClass,通过存储插件动态生成外部存储持久卷PV;

▲持久卷PV和PVC最终形成绑定关系;

▲持久卷PV开始提供给Pod使用。

这种外部存储依靠存储插件为kubernetes容器提供持久存储的结构优势表现:

▲为有状态的容器应用提供持久化卷;

▲为容器应用动态提供新卷;

▲解耦计算资源和存储资源;

▲提供不同模式的外部存储卷。

03 存储插件

Kubernetes中存储插件分为In-tree、Out-of-Tree两类,其中Out-of-tree插件中的CSI被多数存储厂商认可和使用。

CSI是Container Storage Interface的简称,目的是定义行业标准的“容器储存接口”,使存储供应商能够开发一个符合CSI标准的插件并使其可以在多个容器编排(CloudFoundry, Kubernetes, Mesos)系统中工作,旨在为容器编排引擎和存储系统间建立一套标准的存储调用接口,能为容器编排引擎提供存储服务。

CSI存储插件具备易部署、易维护、兼容性好、高级功能等特点,同时CSI存储插件能够实现FASS全闪存存储系统与Kubernetes系统的彻底解耦,下文将对FASS全闪存系统的CSI存储插件(简称FASS-CSI)作详细介绍。

2 FASS-CSI架构设计

FASS-CSI存储插件在Kubernetes系统与FASS全闪存系统中间起到承上启下的作用。

承上:对接kubernetes容器平台,允许其通过gRPC调用FASS-CSI插件,支撑容器平台对于FASS存储卷管理功能,如创建、挂载、删除等。

启下:FASS-CSI 插件需要调用FASS存储集群的API接口,实现相关业务逻辑,实际操作存储资源。

FASS-CSI存储插件由FASS-CSI核心组件与Kubernetes-CSI扩展组件(External provisioner、Externalattacher、Driver registrar)构成。

FASS-CSI核心组件为具体实现创建、删除、挂载、卸载功能的镜像,Kubernetes-CSI扩展组件实现FASS-CSI存储插件与Kubernetes系统通信。

Kubernetes-CSI扩展组件概念: Kubernetes系统作为顶层容器应用载体,FASS全闪存系统通过中间层FASS-CSI存储插件向容器应用提供存储资源。FASS-CSI存储插件依赖于kubernetes系统部署,FASS全闪存系统独立于Kubernetes系统部署,只需要将FASS-http-API地址暴露给FASS-CSI存储插件,用于FASS-CSI与FASS全闪存系统通信。

01

|Kubernetes系统管理容器应用,将存储资源需求通过API-Server下发给集群中FASS-CSI存储插件。

02

|Kubernetes-CSI扩展组件监听Kubernetes集群的PVC、VolumeAttachment对象,通过FASS-CSI的ControllerServer请求FASS-API实现FASS存储卷创建、删除、映射、取消映射。

03

| FASS-CSI存储插件注册在所有节点上,节点上Pod通过PVC请求PV存储资源时,FASS-CSI的NodeServer通过ISCSI协议将FASS卷进行挂载,供给存储资源。

3 FASS-CSI工作流程

FASS-CSI存储插件的通信规则是彻底解耦Kubernetes系统与FASS全闪存系统的关键。

FASS-CSI存储插件通过Kubernetes-CSI扩展组件监听Kubernetes指令,FASS-CSI核心组件通过FASS提供的RESTful API创建FASS存储资源供给容器应用使用,具体工作流程如下:

01

|Kubernetes-CSI监听Kubernetes中PVC、VolumeAttachment对象,通过UDS(Unix Domain Socket)传给FASS-CSI核心组件。

02

|调用ControllerServer的 CreateVolume 方法创建FASS卷,PV为Create 状态。

03

|调用ControllerServer的ControllerPublishVolume方法将FASS卷映射到主机,PV为Node_ready为状态。

04

|FASS卷在主机内可见,调用NodeServer的NodeStageVolume接口对FASS卷进行分区格式化操作,PV为Volume Ready 状态。

05

|调用NodeServer的NodePublishVolume 接口将FASS卷挂载至指定目录,PV为 Published 状态。

06

|挂载的FASS卷供给存储资源给容器应用使用。

卸载FASS存储卷过程为挂载的逆过程,卸载后PV状态回到 Created 状态,此时FASS卷是一个没有挂载到任何容器的存储卷资源,Created状态的存储卷,可以对其再进行一次挂载到容器中的操作,也可以对它进行删除操作。

4 实践和效果

Kubernetes版本:1.15.9

FASS-CSI版本:1.0.0

FASS版本:1.0.0

Kubernetes集群双节点: 实践过程

01

|开启controller服务与node服务,controller服务采用StatefulSet模式部署,开启csi-provisioner、csi-attacher、FASS-CSI插件,其中FASS-CSI插件(fass-driver)的启动参数中指定调用FASS-HTTP-API的IP地址。

02

|node服务采用DaemonSet方式部署,pod会在每一个节点上运行,两个fasscsi-node-*的pod。

03

|创建动态storageClass,在StorageClass.parameters将需要创建卷信息传给FASS-CSI插件,当csi-provisioner监控到PVC对象创建,FASS-CSI插件会通过FASS-API创建FASS卷。

04

|创建pvc,指定pod加载存储资源时通过pvc绑定PV的StorageClass,以及PVC的访问权限(accessModes)ReadWriteMany。

05

|创建pod,开启nginx容器应用,声明pod加载存储资源所指定的pvc,通过pvc找到绑定PV存储资源供pod使用。

06

|在kubernetes的node节点查看挂载的卷

07

|FASS管理界面查看创建的卷

08

|验证挂载卷读写

进入nginx8容器,在挂载目录下写入“Taocloud”内容到index.html文件。 在同一个节点另起一个nginx9、nginx10两个pod,进入nginx9容器追加输入“2020-07-03”内容到index.html文件。进入nginx10容器追加输入“fass-csi-iscsi”内容到index.html文件。

访问本地挂载目录下的index.html

小结:

▲FASS-CSI存储插件实现了通过ISCSI驱动挂载FASS存储卷,供给容器应用使用存储资源。

▲同节点不同Pod中容器应用共用一个FASS存储卷进行读写操作,共享存储资源。

▲容器应用删除,FASS存储卷在节点挂载目录下数据不丢失,开启新容器可实现数据复用,实现FASS存储卷作为持久化存储资源供给容器应用。

5 应用场景与优势

FASS-CSI存储插件实现了Kubernetes系统管理操作FASS全闪存存储资源,主要服务对象涉及微服务开发厂商、云平台厂商、容器化平台厂商、存储服务厂商等,应用场景为依据FASS全闪存系统高IOPS、低延迟的高级特性,使用FASS-CSI存储插件为其微服务、云服务、容器应用等提供持久化存储资源。

FASS-CSI优势体现为

01

|稳定性:FASS-CSI存储插件将FASS全闪存系统与kubernetes系统完全解耦,实现了资源的隔离,同时FASS-CSI存储插件以容器化部署,稳定性得到保障。

02

|易维护:不需要复杂的集群配置修改和准备工作,只需 FASS-CSI容器配置,拉取镜像,一键可达。

03

|兼容性:FASS-CSI存储插件以容器化部署,对于Kubernetes系统大于v1.15.0版本与FASS全闪存系统所有版本完美兼容,消除环境差异所带来的不确定性以及其他约束。

04

|高性能:在容器的使用场景,大量Pod或者在Pod上会挂载较多的存储卷场景,使用FASS-CSI存储插件可以实现快速启动上百个pod,为容器应用提供FASS存储卷的高IOPS、低延迟等高级性能。

FASS分布式全闪存应用场景解决方案

01

● 裸金属云FASS高性能弹性块存储解决方案

02

● FASS全闪高性能文件网关解决方案

03

● 双剑合璧|FASS&JBOF『闪光』解决方案

推荐文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。