持久卷分配方法、装置、计算机设备和存储介质转让专利

申请号 : CN202011135642.4

文献号 : CN111966305B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李斌吉

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本申请涉及一种持久卷分配方法、装置、计算机设备和存储介质,该方法涉及云存储技术,该方法包括:获取持久卷分配请求,持久卷分配请求基于目标容器组创建的持久卷声明生成,持久卷声明与持久卷对象绑定,持久卷分配请求包括目标容器组指定的目标路径、持久卷声明指定的文件系统类型和与持久卷对象对应的卷标识;根据卷标识查询持久卷对象的存储容量;在目标容器组调度至的工作节点的持久卷数据目录下,按照存储容量创建以卷标识命名的目标文件,将按照文件系统类型格式化后的目标文件虚拟成块存储设备;将块存储设备挂载至目标路径。采用本方法能够实现持久卷的动态供应。

权利要求 :

1.一种持久卷分配方法,其特征在于,所述方法由工作节点上的持久卷供应容器组执行,所述工作节点是目标容器组调度至的节点,所述方法包括:获取主节点发送的持久卷分配请求,所述持久卷分配请求是主节点在监控到所述目标容器组创建持久卷声明后生成的,所述持久卷声明与持久卷对象绑定,所述持久卷分配请求包括所述目标容器组指定的目标路径、所述持久卷声明指定的文件系统类型和与所述持久卷对象对应的卷标识;

根据与所述持久卷对象对应的卷标识,查询所述持久卷对象的存储容量;

在所述目标容器组调度至的工作节点的持久卷数据目录下,按照所述存储容量创建以所述卷标识命名的目标文件,并按照所述文件系统类型将所述目标文件格式化;

将格式化后的所述目标文件虚拟成块存储设备;

将所述块存储设备挂载至所述目标路径,以使所述目标容器组通过所述目标路径访问所述工作节点的持久卷数据目录下的所述目标文件;

当所述目标容器组从所述工作节点上删除后,则

获取关于所述目标容器组的持久卷卸载请求,所述持久卷卸载请求包括所述目标容器组指定的目标路径;

当检查到所述目标路径被挂载时,则执行卸载命令,所述卸载命令用于解除所述工作节点的持久卷数据目录与所述目标容器组指定的目标路径之间的挂载关系。

2.根据权利要求1所述的方法,其特征在于,所述方法还包括:通过所述目标容器组创建持久卷声明,所述持久卷声明包括请求的持久卷的存储容量及文件系统类型;

获取当前处于可用状态的持久卷对象集合;

从所述持久卷对象集合中选取与所述存储容量、所述文件系统类型一致的持久卷对象,并将选取的所述持久卷对象与所述持久卷声明绑定。

3.根据权利要求1所述的方法,其特征在于,所述方法还包括:获取所述目标容器组指定的用于挂载持久卷的目标路径;

当监控到所述目标容器组创建所述持久卷声明后,则

根据所述目标路径、所述持久卷声明绑定的持久卷对象对应的卷标识和所述持久卷声明指定的文件系统类型,生成持久卷分配请求。

4.根据权利要求1所述的方法,其特征在于,所述方法还包括:获取持久卷扩容请求,所述持久卷扩容请求基于目标容器组修改所述持久卷声明生成,所述持久卷扩容请求包括所述目标容器组指定的目标路径、修改后的持久卷声明指定的存储容量和与所述持久卷对象对应的卷标识;

在所述工作节点的持久卷数据目录下查询与所述卷标识对应的目标文件;

获取查询到的目标文件的文件大小、文件系统类型及挂载至的块存储设备;

根据所述文件大小及修改后的所述存储容量确定待扩容容量;

根据所述待扩容容量对所述目标文件进行扩容;

按照所述文件系统类型对所述挂载至的块存储设备进行格式化,使所述目标容器组通过所述目标路径访问所述工作节点的持久卷数据目录下的扩容后的所述目标文件。

5.根据权利要求4所述的方法,其特征在于,所述方法还包括:获取所述目标容器组指定的用于挂载持久卷的目标路径;

当监控到所述目标容器组修改所述持久卷声明指定的存储容量后,则根据所述目标路径、修改后的所述持久卷声明指定的存储容量和与所述持久卷对象对应的卷标识,生成持久卷扩容请求。

6.根据权利要求1所述的方法,其特征在于,所述方法还包括:获取预先配置的所述工作节点的持久卷数据目录;

扫描所述持久卷数据目录所在磁盘的可用存储容量;

统计所述持久卷数据目录下的目标文件的文件大小;

根据所述可用存储容量和所述文件大小获得工作节点的持久化存储容量;

上报所述持久化存储容量。

7.根据权利要求6所述的方法,其特征在于,所述方法还包括:获取预先配置的所述工作节点的持久卷数据目录;

扫描所述持久卷数据目录下的目标文件;

当检测到存在未挂载的目标文件时,则

获取所述未挂载的目标文件的文件名称;

当检测到不存在与所述文件名称相同的卷标识对应的持久卷对象时,则删除所述持久卷数据目录下的所述未挂载的目标文件。

8.根据权利要求1至7任意一项所述的方法,其特征在于,所述工作节点运行了用于管理容器组所需的组件,所述目标容器组包括至少一个用于运行目标应用程序的容器,所述目标应用程序是有状态应用程序,所述持久卷数据目录下的目标文件用于存储所述目标应用程序的持久化数据。

9.一种持久卷分配装置,其特征在于,所述装置包括:

第一获取模块,用于通过工作节点上运行的持久卷供应容器组获取主节点发送的持久卷分配请求,所述持久卷分配请求是主节点在监控到目标容器组创建持久卷声明后生成的,所述目标容器组运行在所述工作节点上,所述持久卷声明与持久卷对象绑定,所述持久卷分配请求包括所述目标容器组指定的目标路径、所述持久卷声明指定的文件系统类型和与所述持久卷对象对应的卷标识;

第一查询模块,用于根据与所述持久卷对象对应的卷标识,查询所述持久卷对象的存储容量;

文件创建模块,用于在所述目标容器组调度至的工作节点的持久卷数据目录下,按照所述存储容量创建以所述卷标识命名的目标文件,并按照所述文件系统类型将所述目标文件格式化;

挂载模块,用于将格式化后的所述目标文件虚拟成块存储设备;将所述块存储设备挂载至所述目标路径,以使所述目标容器组通过所述目标路径访问所述工作节点的持久卷数据目录下的所述目标文件;

第三获取模块,用于当所述目标容器组从所述工作节点上删除后,则获取关于所述目标容器组的持久卷卸载请求,所述持久卷卸载请求包括所述目标容器组指定的目标路径;

持久卷卸载模块,用于当检查到所述目标路径被挂载时,则执行卸载命令,所述卸载命令用于解除所述工作节点的持久卷数据目录与所述目标容器组指定的目标路径之间的挂载关系。

10.根据权利要求9所述的装置,其特征在于,所述装置还包括:持久卷声明创建模块,用于通过所述目标容器组创建持久卷声明,所述持久卷声明包括请求的持久卷的存储容量及文件系统类型;

持久卷对象获取模块,用于获取当前处于可用状态的持久卷对象集合;

绑定模块,用于从所述持久卷对象集合中选取与所述存储容量、所述文件系统类型一致的持久卷对象,并将选取的所述持久卷对象与所述持久卷声明绑定。

11.根据权利要求9所述的装置,其特征在于,所述装置还包括监控模块,用于获取所述目标容器组指定的用于挂载持久卷的目标路径;当监控到所述目标容器组创建所述持久卷声明后,则根据所述目标路径、所述持久卷声明绑定的持久卷对象对应的卷标识和所述持久卷声明指定的文件系统类型,生成持久卷分配请求。

12.根据权利要求9所述的装置,其特征在于,所述装置还包括:第二获取模块,用于获取持久卷扩容请求,所述持久卷扩容请求基于目标容器组修改所述持久卷声明生成,所述持久卷扩容请求包括所述目标容器组指定的目标路径、修改后的持久卷声明指定的存储容量和与所述持久卷对象对应的卷标识;

第二查询模块,用于在所述工作节点的持久卷数据目录下查询与所述卷标识对应的目标文件;获取查询到的目标文件的文件大小、文件系统类型及挂载至的块存储设备;

文件扩容模块,用于根据所述文件大小及修改后的所述存储容量确定待扩容容量;根据所述待扩容容量对所述目标文件进行扩容;

文件系统扩容模块,用于按照所述文件系统类型对所述挂载至的块存储设备进行格式化,使所述目标容器组通过所述目标路径访问所述工作节点的持久卷数据目录下的扩容后的所述目标文件。

13.根据权利要求12所述的装置,其特征在于,所述装置还包括监控模块,用于获取所述目标容器组指定的用于挂载持久卷的目标路径;当监控到所述目标容器组修改所述持久卷声明指定的存储容量后,则根据所述目标路径、修改后的所述持久卷声明指定的存储容量和与所述持久卷对象对应的卷标识,生成持久卷扩容请求。

14.根据权利要求9所述的装置,其特征在于,所述装置还包括节点容量上报模块,用于获取预先配置的所述工作节点的持久卷数据目录;扫描所述持久卷数据目录所在磁盘的可用存储容量;统计所述持久卷数据目录下的目标文件的文件大小;根据所述可用存储容量和所述文件大小获得工作节点的持久化存储容量;上报所述持久化存储容量。

15.根据权利要求14所述的装置,其特征在于,所述装置还包括持久卷删除模块,用于获取预先配置的所述工作节点的持久卷数据目录;扫描所述持久卷数据目录下的目标文件;当检测到存在未挂载的目标文件时,则获取所述未挂载的目标文件的文件名称;当检测到不存在与所述文件名称相同的卷标识对应的持久卷对象时,则删除所述持久卷数据目录下的所述未挂载的目标文件。

16.根据权利要求9至15任一项所述的装置,其特征在于,所述工作节点运行了用于管理容器组所需的组件,所述目标容器组包括至少一个用于运行目标应用程序的容器,所述目标应用程序是有状态应用程序,所述持久卷数据目录下的目标文件用于存储所述目标应用程序的持久化数据。

17.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至8中任一项所述的方法的步骤。

说明书 :

持久卷分配方法、装置、计算机设备和存储介质

技术领域

[0001] 本申请涉及云存储技术领域,特别是涉及一种持久卷分配方法、装置、计算机设备和存储介质。

背景技术

[0002] 随着云技术的发展,许多的云平台通过容器集群管理系统来运行,实现了运维自动化、应用快速部署、资源弹性伸缩和应用环境的动态调整,提高研发运营效率。容器集群管理系统用于管理云平台中容器化的应用程序,为容器化的应用提供资源调度、部署运行、服务发现和扩容缩容等技术支持。
[0003] 持久卷对象是容器集群管理系统中用于为用户和管理员提供如何提供和消费持久卷的程序接口。通常,容器集群管理系统为容器提供的持久卷对象后,使用它的容器组会将所在宿主机上指定的文件系统路径绑定给自己,从而让容器组的数据能够持久化到宿主机文件系统指定路径上。然而,由于该持久卷对象无法直接申明持久卷的容量,存在一定的容量限制。

发明内容

[0004] 基于此,有必要针对上述技术问题,提供一种能够动态供应持久卷的存储容量的持久卷分配方法、装置、计算机设备和存储介质。
[0005] 一种持久卷分配方法,所述方法包括:
[0006] 获取持久卷分配请求,所述持久卷分配请求基于目标容器组创建的持久卷声明生成,所述持久卷声明与持久卷对象绑定,所述持久卷分配请求包括所述目标容器组指定的目标路径、所述持久卷声明指定的文件系统类型和与所述持久卷对象对应的卷标识;
[0007] 根据与所述持久卷对象对应的卷标识,查询所述持久卷对象的存储容量;
[0008] 在所述目标容器组调度至的工作节点的持久卷数据目录下,按照所述存储容量创建以所述卷标识命名的目标文件,并按照所述文件系统类型将所述目标文件格式化 ;
[0009] 将格式化后的所述目标文件虚拟成块存储设备 ;
[0010] 将所述块存储设备挂载至所述目标路径,以使所述目标容器组通过所述目标路径访问所述工作节点的持久卷数据目录下的所述目标文件。
[0011] 在一个实施例中,所述方法还包括:
[0012] 通过所述目标容器组创建持久卷声明,所述持久卷声明包括请求的持久卷的存储容量及文件系统类型;
[0013] 获取当前处于可用状态的持久卷对象集合;
[0014] 从所述持久卷对象集合中选取与所述存储容量、所述文件系统类型一致的持久卷对象,并将选取的所述持久卷对象并与所述持久卷声明绑定。
[0015] 在一个实施例中,所述方法还包括:
[0016] 获取所述目标容器组指定的用于挂载持久卷的目标路径;
[0017] 当监控到所述目标容器组创建所述持久卷声明后,则
[0018] 根据所述目标路径、所述持久卷声明绑定的持久卷对象对应的卷标识和所述持久卷声明指定的文件系统类型,生成持久卷分配请求。
[0019] 在一个实施例中,所述方法还包括:
[0020] 获取持久卷扩容请求,所述持久卷扩容请求基于目标容器组修改所述持久卷声明生成,所述持久卷扩容请求包括所述目标容器组指定的目标路径、修改后的持久卷声明指定的存储容量和与所述持久卷对象对应的卷标识;
[0021] 在所述工作节点的持久卷数据目录下查询与所述卷标识对应的目标文件;
[0022] 获取查询到的目标文件的文件大小、文件系统类型及挂载至的块存储设备;
[0023] 根据所述文件大小及修改后的所述存储容量确定待扩容容量;
[0024] 根据所述待扩容容量对所述目标文件进行扩容;
[0025] 按照所述文件系统类型对所述挂载至的块存储设备进行格式化,使所述目标容器组通过所述目标路径访问所述工作节点的持久卷数据目录下的扩容后的所述目标文件。
[0026] 在一个实施例中,所述方法还包括:
[0027] 获取所述目标容器组指定的用于挂载持久卷的目标路径;
[0028] 当监控到所述目标容器组修改所述持久卷声明指定的存储容量后,则[0029] 根据所述目标路径、修改后的所述持久卷声明指定的存储容量和与所述持久卷对象对应的卷标识,生成持久卷扩容请求。
[0030] 在一个实施例中,所述方法还包括:
[0031] 获取监测到所述目标容器组被删除后生成的持久卷卸载请求,所述持久卷卸载请求包括所述目标容器组指定的目标路径;
[0032] 当所述目标路径存在挂载的持久卷时,则
[0033] 执行卸载命令,所述卸载命令用于解除所述工作节点的持久卷数据目录与所述目标容器组指定的目标路径之间的挂载关系。
[0034] 在一个实施例中,所述方法还包括:
[0035] 获取预先配置的所述工作节点的持久卷数据目录;
[0036] 扫描所述持久卷数据目录所在磁盘的可用存储容量;
[0037] 统计所述持久卷数据目录下的目标文件的文件大小;
[0038] 根据所述可用存储容量和所述文件大小获得工作节点的持久化存储容量;
[0039] 上报所述持久化存储容量。
[0040] 在一个实施例中,所述方法还包括:
[0041] 获取预先配置的所述工作节点的持久卷数据目录;
[0042] 扫描所述持久卷数据目录下的目标文件;
[0043] 当检测到存在未挂载的目标文件时,则
[0044] 获取所述未挂载的目标文件的文件名称;
[0045] 当检测到不存在与所述文件名称相同的卷标识对应的持久卷对象时,则[0046] 删除所述持久卷数据目录下的所述未挂载的目标文件。
[0047] 在一个实施例中,所述工作节点运行了用于管理容器组所需的组件,所述目标容器组包括至少一个用于运行目标应用程序的容器,所述目标应用程序是有状态应用程序,所述持久卷数据目录下的目标文件用于存储所述目标应用程序的持久化数据。
[0048] 一种持久卷分配装置,所述装置包括:
[0049] 第一获取模块,用于获取持久卷分配请求,所述持久卷分配请求基于目标容器组创建的持久卷声明生成,所述持久卷声明与持久卷对象绑定,所述持久卷分配请求包括所述目标容器组指定的目标路径、所述持久卷声明指定的文件系统类型和与所述持久卷对象对应的卷标识;
[0050] 第一查询模块,用于根据与所述持久卷对象对应的卷标识,查询所述持久卷对象的存储容量;
[0051] 文件创建模块,用于在所述目标容器组调度至的工作节点的持久卷数据目录下,按照所述存储容量创建以所述卷标识命名的目标文件,并按照所述文件系统类型将所述目标文件格式化;
[0052] 挂载模块,用于将格式化后的所述目标文件虚拟成块存储设备;将所述块存储设备挂载至所述目标路径,以使所述目标容器组通过所述目标路径访问所述工作节点的持久卷数据目录下的所述目标文件。
[0053] 一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
[0054] 获取持久卷分配请求,所述持久卷分配请求基于目标容器组创建的持久卷声明生成,所述持久卷声明与持久卷对象绑定,所述持久卷分配请求包括所述目标容器组指定的目标路径、所述持久卷声明指定的文件系统类型和与所述持久卷对象对应的卷标识;
[0055] 根据与所述持久卷对象对应的卷标识,查询所述持久卷对象的存储容量;
[0056] 在所述目标容器组调度至的工作节点的持久卷数据目录下,按照所述存储容量创建以所述卷标识命名的目标文件,并按照所述文件系统类型将所述目标文件格式化 ;
[0057] 将格式化后的所述目标文件虚拟成块存储设备 ;
[0058] 将所述块存储设备挂载至所述目标路径,以使所述目标容器组通过所述目标路径访问所述工作节点的持久卷数据目录下的所述目标文件。
[0059] 一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
[0060] 获取持久卷分配请求,所述持久卷分配请求基于目标容器组创建的持久卷声明生成,所述持久卷声明与持久卷对象绑定,所述持久卷分配请求包括所述目标容器组指定的目标路径、所述持久卷声明指定的文件系统类型和与所述持久卷对象对应的卷标识;
[0061] 根据与所述持久卷对象对应的卷标识,查询所述持久卷对象的存储容量;
[0062] 在所述目标容器组调度至的工作节点的持久卷数据目录下,按照所述存储容量创建以所述卷标识命名的目标文件,并按照所述文件系统类型将所述目标文件格式化 ;
[0063] 将格式化后的所述目标文件虚拟成块存储设备 ;
[0064] 将所述块存储设备挂载至所述目标路径,以使所述目标容器组通过所述目标路径访问所述工作节点的持久卷数据目录下的所述目标文件。
[0065] 上述持久卷分配方法、装置、计算机设备和存储介质,在目标容器组创建持久卷声明后,该持久卷声明将与持久卷对象绑定,并会根据该持久卷声明指定的文件系统类型、该持久卷对象对应的卷标识及该目标容器组指定的目标路径生成持久卷分配请求,在该目标容器组调度至的工作节点获取到该持久卷分配请求后,根据卷标识查询相应的持久卷对象,并从查询到的持久卷对象中取出存储容量,接着在该工作节点的持久卷数据目录下,按照该存储容量创建以该卷标识命名的目标文件,并按照该文件系统类型将创建的目标文件格式化,使该目标文件包含一个完整的文件系统,然后将该目标文件虚拟成块存储设备,以便于查看该文件系统中的内容,最后将该块存储设备挂载至目标容器组指定的目标路径,这样目标容器组就可以通过该目标路径访问该文件系统中的内容。由于目标文件是在工作节点本地的持久卷数据目录下创建的,可以按目标容器组的需求设置目标文件的大小,不需要提前按固定容量划分本地的存储空间,克服了容量限制的问题,实现了持久卷的动态供应与按需供应,确保工作节点上的存储资源能够有效利用。

附图说明

[0066] 图1为一个实施例中容器集群管理系统的架构示意图。
[0067] 图2为一个实施例中持久卷分配方法的应用环境示意图。
[0068] 图3为一个实施例中工作节点的框架示意图。
[0069] 图4为一个实施例中持久卷分配方法的流程示意图。
[0070] 图5为一个实施例中对分配的持久卷进行扩容的步骤的流程示意图。
[0071] 图6为一个实施例中对分配的持久卷进行卸载的步骤的流程示意图。
[0072] 图7为一个实施例中上报工作节点的持久化存储容量的步骤的流程示意图。
[0073] 图8为一个实施例中删除工作节点的持久卷的步骤的流程示意图。
[0074] 图9为一个实施例中持久卷分配装置的结构框图。
[0075] 图10为一个实施例中计算机设备的内部结构图。

具体实施方式

[0076] 为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
[0077] 本申请提供的方法涉及云技术。云技术(Cloud technology)是指在广域网或局域网内将硬件、软件、网络等系列资源统一起来,实现数据的计算、储存、处理和共享的一种托管技术。云技术基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、应用技术等的总称,可以组成资源池,按需所用,灵活便利。云计算技术将变成重要支撑。技术网络系统的后台服务需要大量的计算、存储资源,如视频网站、图片类网站和更多的门户网站。伴随着互联网行业的高度发展和应用,将来每个物品都有可能存在自己的识别标志,都需要传输到后台系统进行逻辑处理,不同程度级别的数据将会分开处理,各类行业数据皆需要强大的系统后盾支撑,只能通过云计算来实现。
[0078] 云存储(cloud storage)是在云计算概念上延伸和发展出来的一个新的概念,分布式云存储系统(以下简称存储系统)是指通过集群应用、网格技术以及分布存储文件系统等功能,将网络中大量各种不同类型的存储设备(存储设备也称之为存储节点)通过应用软件或应用接口集合起来协同工作,共同对外提供数据存储和业务访问功能的一个存储系统。
[0079] 目前,存储系统的存储方法为:创建逻辑卷,在创建逻辑卷时,就为每个逻辑卷分配物理存储空间,该物理存储空间可能是某个存储设备或者某几个存储设备的磁盘组成。客户端在某一逻辑卷上存储数据,也就是将数据存储在文件系统上,文件系统将数据分成许多部分,每一部分是一个对象,对象不仅包含数据而且还包含数据标识(ID,ID entity) 等额外的信息,文件系统将每个对象分别写入该逻辑卷的物理存储空间,且文件系统会记录每个对象的存储位置信息,从而当客户端请求访问数据时,文件系统能够根据每个对象的存储位置信息让客户端对数据进行访问。
[0080] 存储系统为逻辑卷分配物理存储空间的过程,具体为:按照对存储于逻辑卷的对象的容量估量(该估量往往相对于实际要存储的对象的容量有很大余量)和独立冗余磁盘阵列(RAID,Redundant Array of Independent Disk)的组别,预先将物理存储空间划分成分条,一个逻辑卷可以理解为一个分条,从而为逻辑卷分配了物理存储空间。
[0081] 本申请提供的实施例可以应用于容器集群管理系统,如图1所示,为一个实施例中容器集群管理系统的架构示意图。参照图1, 该容器集群管理系统将集群中的计算机设备划分为一个主节点和一群工作节点。下面对一些重要的概念进行描述:
[0082] 主节点用于管理整个集群,是所有管理任务的入口,主节点负责编排工作节点。主节点上运行着集群管理相关的一组进程,主要包括高可用的键值存储系统、系统管理指令程序接口、管理控制中心和调度器,其中,系统管理指令程序接口、管理控制中心、调度器构成了容器集群管理系统的总控中心,这些进程自动实现了整个集群的资源管理、容器组调度、弹性伸缩、安全控制、系统监控和纠错等管理功能。
[0083] 工作节点用于对在本地运行的容器组的生命周期进行管理。一个工作节点可以是虚拟机或物理机。每个工作节点具备运行容器组的一些必要服务,并由主节点上的组件进行管理,工作节点上的服务包括虚拟化容器和生命周期管理程序,用于对在本地运行的容器组的生命周期进行管理。
[0084] 容器组是容器集群管理系统最基本的管理单位。容器组是在容器上的一层封装,由一组运行在同一主机的一个或者多个容器组成。一个容器组是一个隔离体,而同一个容器组中的容器是共享网络地址和端口号的,并且,容器组中的容器可以访问共同的数据卷来实现文件系统的共享。
[0085] 主节点上运行的键值存储系统可以用于存储各个资源的状态。
[0086] 主节点上运行的系统管理指令程序接口负责对外提供容器集群管理系统的应用程序接口服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给该系统管理指令程序接口处理后再提交给键值存储系统。如图1所示,工作节点上的生命周期管理程序是直接和主节点上的该系统管理指令程序接口交互的,该系统管理指令程序接口与存储通信,其他模块通过该系统管理指令程序接口访问集群状态。
[0087] 主节点上运行的管理控制中心是该容器集群管理系统内部负责集群内节点、容器组副本、服务端点、命名空间、服务账号和资源定额的管理。当某个工作节点意外宕机时,管理控制中心会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。集群内的每个资源一般都对应有一个控制器,管理控制中心负责管理这些控制器。比如,通过系统管理指令程序接口创建一个容器组,当这个容器组创建成功后,就由管理控制中心保证容器组的状态符合预期。
[0088] 主节点上运行的调度器用于将容器组调度到合适的工作节点上,也就是将容器组与一个工作节点绑定。
[0089] 工作节点上运行的虚拟化容器用于部署容器化应用。
[0090] 工作节点上运行的生命周期管理程序是工作节点上用于对容器进行生命周期的管理的程序。生命周期管理程序负责获取工作节点上的容器组或容器的期望状态,包括容器组需要运行什么容器、容器组的网络或存储如何配置等等,并调用对应的容器平台接口达到该期望状态。生命周期管理程序是该容器集群管理系统提供的客户端工具,通过生命周期管理程序实现对该容器集群管理系统中系统管理指令程序接口的调用,通过系统管理指令程序接口去调用各个进程来完成对 节点的部署和控制。生命周期管理程序还用于查看容器是否正常运行,并在容器运行出错时根据设置的重启策略进行处理。生命周期管理程序还用于监控所在工作节点的资源使用情况,并定时向主节点报告,这样可以了解整个集群所有工作节点的资源情况,从而实现对容器组的正常调度和运行。
[0091] 本申请提供的实施例,主要应用于容器管理系统集群中的工作节点,该工作节点可以是云平台中的计算机设备。容器集群管理系统,例如可以是Docker  Swarm、Kubernetes、Apache Mesos和AWS ECS,等等。本申请提供的持久卷分配方法,可以应用于如图2所示的应用环境中。其中,主节点102通过网络与工作节点104进行通信。主节点102与工作节点104可以是服务器,服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络以及大数据和人工智能平台等基础云计算服务的云服务器。本申请在此不做限制。
[0092] 在一个实施例中,如图3所示,提供了一种工作节点的框架示意图。参照图3,该工作节点上运行了目标容器组1和目标容器组2,目标容器组1与容器组2是具备持久卷需求的容器组。目标容器组可以包括至少一个用于运行目标应用程序的容器,目标应用程序可以是有状态应用程序。该工作节点上还运行了持久卷供应容器组,持久卷供应容器组用于执行本申请实施例提供的持久卷分配方法,持久卷分配方法可以封装成一种插件运行在持久卷供应容器组中。持久卷供应容器组包括持久卷提供模块、节点容量上报模块和持久卷回收模块。持久卷提供模块用于执行持久卷创建并发布、持久卷扩容及持久卷卸载的流程。节点容量上报模块和持久卷回收模块可以用其他辅助容器实现,与持久卷提供模块一起部署在持久卷供应容器组中。
[0093] 参照图3,为实现本申请实施例提供的持久卷分配方法,需要事先配置用于提供本地持久卷的持久卷数据目录,在分配持久卷时,在该持久卷数据目录下创建目标文件,并将目标文件虚拟成块存储设备后,将块存储设备挂载至目标容器组对应的目标路径,这样目标容器组可以通过该目标路径访问持久卷目录下的目标文件。
[0094] 在一个实施例中,工作节点上运行的持久卷供应容器组可以获取持久卷分配请求,持久卷分配请求基于目标容器组创建的持久卷声明生成,持久卷声明与持久卷对象绑定,持久卷分配请求包括目标容器组指定的目标路径、持久卷声明指定的文件系统类型和与持久卷对象对应的卷标识;根据与持久卷对象对应的卷标识,查询持久卷对象的存储容量;在目标容器组调度至的工作节点的持久卷数据目录下,按照存储容量创建以卷标识命名的目标文件,并按照文件系统类型将目标文件格式化;将格式化后的目标文件虚拟成块存储设备 ;将块存储设备挂载至目标路径,以使目标容器组通过目标路径访问工作节点的持久卷数据目录下的目标文件。
[0095] 在一个实施例中,如图4所示,提供了一种持久卷分配方法,以该方法应用于图1中的工作节点104为例进行说明,包括以下步骤:
[0096] 步骤402,获取持久卷分配请求,持久卷分配请求基于目标容器组创建的持久卷声明生成,持久卷声明与持久卷对象绑定,持久卷分配请求包括目标容器组指定的目标路径、持久卷声明指定的文件系统类型和与持久卷对象对应的卷标识。
[0097] 其中,本申请实施例中的持久卷是工作节点上用于存储数据的物理存储空间,可以称为本地持久化存储卷(Local Persistent Volume),简称为持久卷。容器组的本地持久化存储就是要把容器中运行的应用程序相关的数据存储到运行该容器组的宿主机上,前提需要保证容器组被调度到具有本地持久化存储的工作节点,因此本申请实施例中,目标容器组运行于工作节点上。本申请实施例中,目标容器组是一个或多个容器的封装,为容器化应用程序的运行提供隔离环境。目标容器组中可以运行一个或多个容器,每个容器中可以运行具备持久化存储需求的目标应用程序,当目标容器组中封装了多个容器时,这多个容器可以共享为目标容器组分配的持久卷。此外,本实施例提供的方法可以封装成插件运行于容器组中,可以称之为持久卷供应容器组,目标容器组与持久卷供应容器组运行于同一个工作节点。
[0098] 持久卷声明(PersistentVolumeClaim,PVC)是容器组对存储空间的请求,目标 容器组需要请求存储空间时,可以通过创建持久卷声明获得本地的持久卷。持久卷对象(PersistentVolume,PV)是逻辑上的概念,用于代表真实的持久卷。持久卷对象可以由集群管理员创建,也可以使用存储类(Storage Class)动态供应,创建后的持久卷对象也属于集群的一种资源,可以通过与持久卷声明绑定而被消耗。每个持久卷对象可以通过对应的卷标识(VolumeID)来表示。
[0099] 文件系统类型(fsType)是文件被组织或管理的方式,不同文件系统采用不同的方法来管理磁盘空间。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。文件系统是具体到磁盘分区的,格式化的过程就是采用指定的文件系统类型对磁盘的分区空间进行管理的过程。文件系统类型可以是XFS、Ext3 和 Ext4中的一种。每个持久卷对象通常都具备确定的存储容量,存储容量可以通过持久卷对象的容量属性来设置,在匹配持久卷对象时还要考虑存储容量的一致性。目标路径是目标容器组用于访问工作节点本地的持久化存储空间的路径,也就是本地持久化存储空间拟挂载至的路径。
[0100] 具体地,容器集群管理系统中的控制器监测是否有新的持久卷声明被创建,在监测到工作节点上的目标容器组创建了新的持久卷声明时,查找与该新的持久卷声明匹配的持久卷对象,并将该持久卷对象与该持久卷声明绑定。绑定的持久卷对象还未分配真实的本地持久卷,在一个实施例中,控制器可以获取目标容器组指定的用于挂载持久卷的目标路径;当监控到目标容器组创建持久卷声明后,则根据目标路径、持久卷声明绑定的持久卷对象对应的卷标识和持久卷声明指定的文件系统类型,生成持久卷分配请求。该工作节点上运行的持久卷供应容器组可以获取该持久卷分配请求,或者,控制器可以根据生成的持久卷分配请求调用持久卷供应容器组中运行的持久卷供应插件中的持久卷分配接口。需要说明的是,该用于监控持久卷声明被创建的控制器可以部署在主节点上,也可以部署在某一个工作节点上。
[0101] 还需要说明的是,在容器集群管理系统中,持久卷声明与持久卷对象之间的绑定关系是一对一的绑定关系,当不存在与该持久卷声明匹配的持久卷对象时,该持久卷声明将会处于未绑定状态。例如,集群上供应了很多 50 G的持久卷对象,也无法与请求 100 G的持久卷声明匹配,当新的 100 G的持久卷对象被加入到集群时,该请求 100 G的持久卷声明才有可能被绑定。
[0102] 在一个实施例中,工作节点可以通过目标容器组创建持久卷声明,持久卷声明包括请求的持久卷的存储容量及文件系统类型;获取当前处于可用状态的持久卷对象集合;从持久卷对象集合中选取与存储容量、文件系统类型一致的持久卷对象,并将选取的持久卷对象并与持久卷声明绑定。
[0103] 在本实施例中,容器集群管理系统的持久卷对象可以通过动态方式供应。每个持久卷对象可以属于某个存储类型(StorageClass),在创建持久卷对象时,可以通过将其存储类型属性(storageClassName )设置为某个存储类型的名称来指定该持久卷对象的存储类型。特定类型的持久卷对象只能绑定到请求该类型持久卷对象的持久卷声明,而未设置存储类型属性 的持久卷对象只能绑定到那些没有指定特定存储类型的持久卷声明。本申请实施例定义了一种存储类型,如可以命名为ClassName,该存储类型需要指定的参数至少包括存储类型属性、文件系统类型,在创建该存储类型的持久卷对象时,指定该存储类型名称和文件系统类型,在创建持久卷声明时也需要指明存储类型名称才能将该存储类型的持久卷对象与其绑定。
[0104] 步骤404,根据与持久卷对象对应的卷标识,查询持久卷对象的存储容量。
[0105] 具体地,工作节点通过运行的持久卷供应容器组接收持久卷分配请求,从持久卷分配请求中获得持久卷对象对应的卷标识,根据持久卷分配请求中的卷标识,向主节点上的系统管理指令程序接口查询与该卷标识对应的持久卷对象,并根据其容量属性获取该持久卷对象的存储容量。
[0106] 步骤406,在目标容器组调度至的工作节点的持久卷数据目录下,按照存储容量创建以卷标识命名的目标文件,并按照文件系统类型将目标文件格式化。
[0107] 其中,工作节点的持久卷数据目录,是专门用于存放目标文件的本地路径,该路径是预先配置好的,在工作节点启动时,其上运行的持久卷供应容器组启动,并根据预先的配置参数配置该持久卷数据目录,如/dataRoot。该持久卷数据目录所在分区用于为该工作节点上运行的所有容器组提供本地持久卷,因此,可以理解的是,该持久卷数据目录所在分区的存储容量决定了该工作节点可以为在该工作节点上运行的所有容器组提供的本地持久卷的存储容量的最大值。
[0108] 目标文件,是用于承载虚拟文件系统的文件,目标文件的大小即为格式化后文件系统的大小。在工作节点的持久卷数据目录下创建的目标文件可以是空文件。目标文件可以是镜像文件,例如可以是Linux系统中的loop文件。块存储设备是通过影射操作系统上的正常的文件而形成的虚拟块设备,可以先创建一个目标文件后将该目标文件虚拟成块存储设备。每个持久卷对象都有一个唯一的名字,即卷标识,通过将该卷标识作为目标文件的名字,就可以根据持久卷对象查找到对应的目标文件,反过来,就可以根据目标文件可以查找到对应的持久卷对象。将目标文件格式化是对用于存储目标文件的存储空间创建文件系统的过程,创建文件系统就是把存储空间划分为指定的文件系统类型的存储格式,是用于明确存储空间或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。
[0109] 具体地,在获取到与持久卷声明绑定的持久卷对象对应的卷标识及指定的存储容量后,工作节点可以通过持久卷供应容器组,在持久卷数据目录下查看是否已经存在以该卷标识命名的目标文件,如果不存在,则按照获取的存储容量创建以该卷标识为文件名称的目标文件。如果存在目标文件或是已经创建了目标文件没有被格式化,是不能被正常访问的,因此,持久卷供应容器组需要继续检查该目标文件是否已经格式化,如果没有格式化,则需要按照持久卷声明指定的文件系统类型将该目标文件格式化为相应的文件系统,如xfs或ext4,如果已经存在文件系统,则直接执行步骤408。工作节点上的持久卷供应容器组可以通过执行dd命令创建目标文件,接着通过mkfs命令将目标文件格式化为一个文件系统。
[0110] 步骤408,将格式化后的目标文件虚拟成块存储设备。
[0111] 块存储设备是将信息按存储块进行存储的设备,将文件虚拟成块存储设备是使用文件来模拟块存储设备的一种技术。将目标文件虚拟成块存储设备从而模拟整个文件系统,使得该目标文件可以像一个磁盘或光盘一样被使用。由loop文件虚拟而成的块存储设备可以称为loop设备。
[0112] 具体地,工作节点可以通过持久卷供应容器组检查此目标文件是否已经虚拟为块存储设备,如目标文件名称为loop1,则虚拟的块存储设备为/dev/loop1;如果该目标文件没有虚拟成块存储设备,则将目标文件虚拟成块存储设备,得到设备号,如果已经虚拟成块存储设备,则直接得到设备号。
[0113] 步骤410,将块存储设备挂载至目标路径,以使目标容器组通过目标路径访问工作节点的持久卷数据目录下的目标文件。
[0114] 挂载(mount)这一动作就是把某个设备与目录树中的某个特定位置进行关联,以便于操作系统能够从根目录开始找到这个刚刚加入的设备,从而访问该设备的内的文件数据。
[0115] 具体地,在获得块存储设备后,工作节点上运行的持久卷供应容器组需要将该块存储设备与目标容器组提供的目标路径(targetPath)关联,这样目标容器组能够通过该目标路径像访问真实设备一样来访问目标文件,目标容器组也就获得了持久卷供应容器组所分配的工作节点上的持久卷。持久卷供应容器组可以检查目标路径是否已被挂载,如果没有被挂载,则使用挂载命令将块存储设备挂载到目标路径,从而完成工作节点上的持久卷创建并发布流程。
[0116] 上述持久卷分配方法,在目标容器组创建持久卷声明后,该持久卷声明将与持久卷对象绑定,并会根据该持久卷声明指定的文件系统类型、该持久卷对象对应的卷标识及该目标容器组指定的目标路径生成持久卷分配请求,该目标容器组调度至的工作节点在获取到该持久卷分配请求后,根据卷标识查询相应的持久卷对象,并从查询到的持久卷对象中取出存储容量,接着在该工作节点的持久卷数据目录下,按照该存储容量创建以该卷标识命名的目标文件,并按照该文件系统类型将创建的目标文件格式化,使该目标文件包含一个完整的文件系统,然后将该目标文件虚拟成块存储设备,以便于查看该文件系统中的内容,最后将该块存储设备挂载至目标容器组指定的目标路径,这样目标容器组就可以通过该目标路径访问该文件系统中的内容。由于目标文件是在工作节点本地的持久卷数据目录下创建的,可以按目标容器组的需求设置目标文件的大小,不需要提前按固定容量划分本地的存储空间,克服了容量限制的问题,实现了持久卷的动态供应与按需供应,确保工作节点上的存储资源能够有效利用。
[0117] 在一个实施例中,如图5所示,上述方法还包括对分配的持久卷进行扩容的步骤,具体包括:
[0118] 步骤502,获取持久卷扩容请求,持久卷扩容请求基于目标容器组修改持久卷声明生成,持久卷扩容请求包括目标容器组指定的目标路径、修改后的持久卷声明指定的存储容量和与持久卷对象对应的卷标识。
[0119] 在本申请实施例中,目标容器组或者管理员可以修改持久卷声明所请求的存储容量,在一个实施例中,容器集群管理系统的控制器监控到目标容器组修改持久卷声明指定的存储容量后,则根据目标容器组指定的用于挂载持久卷的目标路径、修改后的持久卷声明指定的存储容量和与持久卷对象对应的卷标识,生成持久卷扩容请求。该工作节点上运行的持久卷供应容器组可以获取该持久卷分配请求,或者,控制器可以根据生成的持久卷分配请求调用持久卷供应容器组中运行的持久卷供应插件中的持久卷扩容接口。
[0120] 步骤504,在工作节点的持久卷数据目录下查询与卷标识对应的目标文件。
[0121] 由于在工作节点的持久卷数据目录下创建的目标文件均以与持久卷对象对应的卷标识命名的,因此,持久卷供应容器组可以根据修改的持久卷声明绑定的持久卷对象对应的卷标识,在工作节点的持久卷数据目录下查询以该卷标识命名的目标文件。
[0122] 步骤506,获取查询到的目标文件的文件大小、文件系统类型及挂载至的块存储设备。
[0123] 具体地,工作节点上的持久卷供应容器组可以根据目标文件,检查是否该目标文件是否已虚拟为块存储设备,如果没有则返回失败,如果有则得到相应的设备号,例如/dev/loopx。例如,可以用losetup命令检查是否该目标文件是否已虚拟为块存储设备。还可以根据目标文件的文件大小获得为目标容器组当前分配的持久卷的存储容量。
[0124] 步骤508,根据文件大小及修改后的存储容量确定待扩容容量。
[0125] 具体地,工作节点上的持久卷供应容器组可以根据修改后的存储容量减去当前分配的持久卷的存储容量,得到待扩容容量。
[0126] 步骤510,根据待扩容容量对目标文件进行扩容。
[0127] 具体地,工作节点上的持久卷供应容器组可以使用扩容命令,如fallocate命令对目标文件进行扩容。
[0128] 步骤512,按照文件系统类型对挂载至的块存储设备进行格式化,使目标容器组通过目标路径访问工作节点的持久卷数据目录下的扩容后的目标文件。
[0129] 具体地,工作节点上的持久卷供应容器组让块存储设备感知到目标文件大小已经发生变化,以通知目标容器组分配的持久卷的存储容量已经发生变化,同时,持久卷供应容器组还需要根据目标文件的文件系统类型,使用文件系统扩容命令,如resize2fs或xfs_growfs,对块存储设备进行文件系统扩容,这样就可以把扩容的这段存储空间也格式化成文件系统。
[0130] 在本实施例中,基于块存储设备对持久卷进行扩容,不需要在工作节点上安装逻辑卷管理软件就可以实现在线扩容,兼容性好,并且扩容容量也不受限制。
[0131] 在一个实施例中,如图6所示,上述方法还包括对分配的持久卷进行卸载的步骤,具体包括:
[0132] 步骤602,获取监测到目标容器组被删除后生成的持久卷卸载请求,持久卷卸载请求包括目标容器组指定的目标路径。
[0133] 在本实施例中,当目标容器组被删除之后,该目标容器组可能会被调度至其他工作节点,不在需要当前工作节点为其分配持久卷,因此当监测到该目标容器组被删除后,触发容器集群管理系统中的生命周期管理程序根据该目标容器组对应的目标路径生成持久卷卸载请求,根据生成的持久卷卸载请求调用持久卷供应容器组中运行的持久卷供应插件中的持久卷卸载接口。
[0134] 步骤604,当目标路径存在挂载的持久卷时,则执行卸载命令,卸载命令用于解除工作节点的持久卷数据目录与目标容器组指定的目标路径之间的挂载关系。
[0135] 具体地,持久卷供应容器组从持久卷卸载请求中提取目标容器组指定的目标路径,并检查该目标路径是否被挂载,如果没有被挂载,则返回成功,如果被挂载,则执行卸载命令,以解除工作节点的持久卷数据目录与目标容器组指定的目标路径之间的挂载关系,也就是工作节点不再通过该持久卷数据目录为该目标容器组提供持久卷。
[0136] 在一个实施例中,如图7所示,上述方法还包括上报工作节点的持久化存储容量的步骤,具体包括:
[0137] 步骤702,获取预先配置的工作节点的持久卷数据目录。
[0138] 在工作节点启动时,持久卷供应容器组会配置持久卷数据目录。
[0139] 步骤704,扫描持久卷数据目录所在磁盘的可用存储容量。
[0140] 可用存储容量是持久卷数据目录所在磁盘剩余的可用容量。
[0141] 步骤706,统计持久卷数据目录下的目标文件的文件大小。
[0142] 具体地,持久卷供应容器组扫描持久卷数据目录下目标文件,统计每个目标文件的文件大小,得到总的文件大小。
[0143] 步骤708,根据可用存储容量和文件大小获得工作节点的持久化存储容量。
[0144] 步骤710,上报持久化存储容量。
[0145] 具体地,持久卷数据目录下的可用存储容量与已创建的目标文件的文件大小之和,即为该工作节点为运行于该工作节点上的容器组能够提供的持久化存储容量。在得到该工作节点能够提供的持久化存储容量后,将该持久化存储容量上报至容器集群管理系统中的主节点,主节点通过系统管理指令程序接口接收上报的持久化存储容量。
[0146] 在一个实施例中,工作节点上的持久卷供应容器组还可以周期性地上报节点容量,例如可以启动定时器,周期为30秒,每个周期都执行一次上述步骤702至步骤710,以便于容器集群管理系统能够及时地清楚集群的存储资源的情况,从保证存储资源的有效分配。
[0147] 在一个实施例中,如图8所示,方法还包括删除工作节点的持久卷的步骤,具体包括:
[0148] 步骤802,获取预先配置的工作节点的持久卷数据目录。
[0149] 步骤804,扫描持久卷数据目录下的目标文件。
[0150] 步骤806,当检测到存在未挂载的目标文件时,则获取未挂载的目标文件的文件名称。
[0151] 步骤808,当检测到不存在与文件名称相同的卷标识对应的持久卷对象时,则删除持久卷数据目录下的未挂载的目标文件。
[0152] 具体地,持久卷供应容器组扫描持久卷数据目录下的每个目标文件,依次检查每个目标文件是否有挂载,有则跳过,没有挂载则根据目标文件的文件名称获得卷标识。在得到卷标识后,根据该卷标识向系统管理指令程序接口查询是否存在与该卷标识对应的持久卷对象,如果存在则跳过,如果不存在,说明该目标文件已经不被当前节点上的容器组使用了,则删除持久卷数据目录下的该未挂载的目标文件,以释放存储空间。
[0153] 在一个实施例中,工作节点上的持久卷供应容器组还可以周期性地检查本节点上的目标文件,例如可以启动定时器,周期为30秒,每个周期都执行一次上述步骤802至步骤808,以便于容器集群管理系统能够及时地释放本节点的存储资源。
[0154] 在一个具体的实施例中持久卷分配方法包括以下步骤:
[0155] 1、在目标容器组创建持久卷声明后获取持久卷分配请求,持久卷声明与持久卷对象绑定,持久卷分配请求包括目标容器组指定的目标路径、持久卷声明指定的文件系统类型和与持久卷对象对应的卷标识。
[0156] 2、从持久卷分配请求中取出目标路径、文件系统类型和卷标识。
[0157] 3、根据卷标识向系统管理指令程序接口查询此卷的持久卷对象,从持久卷对象中取出存储容量。
[0158] 4、在本地的持久卷数据目录下,查看是否已经存在此卷的目标文件,如果不存在,则在本地的持久卷数据目录下创建以卷标识命名的目标文件,如果已经存在,则直接进行5。
[0159] 5、对目标文件检查是否已经格式化,如果没有,则按持久卷声明指定的文件系统类型将该目标文件格式化为文件系统,如xfs或ext4,如果已经存在文件系统,则直接进行6。
[0160] 6、检查此目标文件是否已经挂在载为块存储设备,形如/dev/loopx ,如果没有,则将目标文件进行挂载,得到设备号,如果已经挂载在则直接得到设备号,进行7。
[0161] 7、检查目标路径是否已挂载,如果没有,则使用挂载命令将块存储设备挂载到目标路径,完成卷创建并发布流程。
[0162] 8、获取持久卷扩容请求,从持久卷扩容请求中取出持久卷挂载的目标路径、卷标识和持久卷的新的容量大小。
[0163] 9、根据卷标识,在本地的持久卷数据目录下查找此卷的目标文件。
[0164] 10、根据目标文件,检查是否已挂载为块存储设备,如果没有则返回失败,如果有则得到设备号。
[0165] 11、根据目标文件得到当前卷的大小,根据卷的新的容量大小减去当前卷的大小,得到要扩容的容量。
[0166] 12、对目标文件进行扩容。
[0167] 13、让块存储设备感知到目标文件大小已经发生变化。
[0168] 14、根据目标文件的文件系统类型,使用文件系统扩容命令对块存储设备进行文件系统扩容,完成后返回成功。
[0169] 15、获取持久卷卸载请求,从持久卷卸载请求中取出卷挂载的目标路径。
[0170] 16、检查目标路径是否已有挂载,如果没有,返回成功,如果有则进行17。
[0171] 17、执行卸载命令进行卸载,完成后返回成功。
[0172] 18、每个周期进行容量扫描,扫描本地的持久卷数据目录所在分区剩余的可用容量。
[0173] 19、扫描本地的持久卷数据目录下的目标文件,统计每个文件的大小得到总容量大小。
[0174] 20、根据可用容量和总容量大小得到此节点的本地存储容量,上报本地存储容量扩展资源的大小到系统管理指令程序接口。
[0175] 21、每个周期进行目标文件扫描,扫描本地的持久卷数据目录下的每个目标文件是否有挂载,有则跳过,没有则进行22。
[0176] 22、根据目标文件得到卷标识,向系统管理指令程序接口查询该卷标识对应的持久卷对象,如果存在则跳过,如果不存在则进行23。
[0177] 23、删除此目标文件。
[0178] 在一个具体的实施例中,上述方法可以应用基于Kubernetes的容器集群管理系统,基于Kubernetes的容器集群包括工作节点和主节点,该基于Kubernetes的持久卷分配方法具体由工作节点上运行的持久卷供应容器组执行,该基于Kubernetes的持久卷分配方法具体包括以下步骤:
[0179] 1、在工作节点上运行目标容器组创建持久卷声明(PVC)后,Kubernetes原生的控制器监测该PVC被创建了,就会将该持久卷声明与匹配的持久卷对象(PV)绑定,并生成持久卷分配请求下发至持久卷供应容器组,持久卷供应容器组获取持久卷分配请求,持久卷分配请求包括目标容器组指定的目标路径(targetPath)、持久卷声明指定的文件系统类型(fsType)和与持久卷对象对应的卷标识(volume ID)。
[0180] 2、持久卷供应容器组从持久卷分配请求中取出目标路径、文件系统类型和卷标识。
[0181] 3、持久卷供应容器组根据卷标识向主节点上的kube-apiserver(一种资源对象的查询接口) 查询此卷的持久卷对象 ,从持久卷对象中取出申请的容量。
[0182] 4、持久卷供应容器组在工作节点的持久卷数据目录(dataRoot)下,查看是否已经存在此卷的loop文件,如果不存在,则在该持久卷数据目录下创建名为volumeID的loop文件,如果已经存在,则直接进行5。
[0183] 5、持久卷供应容器组对loop文件检查是否已经格式化,如果没有,则格式化为fsType类型的文件系统,如xfs或ext4,如果已经存在文件系统,则直接进行6。
[0184] 6、持久卷供应容器组使用losetup命令检查此loop文件是否已经挂在载为loop设备,形如/dev/loopx ,如果没有,则使用losetup命令将loop文件进行挂载,得到设备号/dev/loopx,如果已经挂载在则直接得到设备号/dev/loopx,进行7。
[0185] 7、持久卷供应容器组检查目标路径是否已挂载,如果没有,则使用mount命令将设备/dev/loopx挂载到目标路径,完成卷创建并发布流程。
[0186] 8、Kubernetes原生的控制器resizer监测到PVC大小发生变化后,生成持久卷扩容请求,持久卷供应容器组获取该持久卷扩容请求,从持久卷扩容请求中取出持久卷挂载的目标路径、卷标识和持久卷的新大小(CapacityRange)。
[0187] 9、持久卷供应容器组根据卷标识,在本地的持久卷数据目录下查找此卷的loop文件。
[0188] 10、持久卷供应容器组根据loop文件,用losetup命令检查是否已挂载为loop设备,如果没有则返回失败,如果有则得到设备号/dev/loopx。
[0189] 11、持久卷供应容器组根据loop文件得到当前卷的大小,根据卷的新大小减去当前卷的大小,得到要扩容的容量expandSize。
[0190] 12、持久卷供应容器组对loop文件进行扩容,使用fallocate命令,-o指定偏移量为当前卷大小,-l指定要扩容的容量,单位都为字节。
[0191] 13、持久卷供应容器组使用losetup命令让loop设备感知到loop文件大小已经发生变化。
[0192] 14、持久卷供应容器组根据loop文件的文件系统类型,使用resize2fs或xfs_growfs对loop设备/dev/loopx进行文件系统扩容,完成后返回成功。
[0193] 15、当目标容器组被删除后,Kubernetes kuble生成持久卷卸载请求,持久卷供应容器组获取该持久卷卸载请求,从持久卷卸载请求中取出卷挂载的目标路径。
[0194] 16、持久卷供应容器组检查目标路径是否已有挂载,如果没有,返回成功,如果有则进行17。
[0195] 17、持久卷供应容器组执行umount命令卸载,完成后返回成功。
[0196] 18、持久卷供应容器组每个周期进行容量扫描,扫描持久卷数据目录所在分区剩余的可用容量available。
[0197] 19、持久卷供应容器组扫描持久卷数据目录下的loop文件,统计每个文件的大小得到总大小volumesTotal。
[0198] 20、持久卷供应容器组根据available+volumesTotal得到此节点的本地存储容量,上报本地存储容量的大小到主节点上的kube-apiserver。
[0199] 21、持久卷供应容器组每个周期进行loop文件扫描,扫描持久卷数据目录下的每个loop文件是否有挂载,有则跳过,没有则进行22。
[0200] 22、持久卷供应容器组根据loop文件得到卷标识,向主节点上的kube-apiserver查询该卷标识对应的持久卷对象,如果存在则跳过,如果不存在则进行23。
[0201] 23、持久卷供应容器组删除此loop文件。
[0202] 需要说明的是,上述持久卷分配方法也可以应用于其它需要为虚拟化容器应用分配持久卷的容器集群管理系统,例如可以是Docker Swarm、Apache Mesos和AWS ECS,等等。这些容器集群管理系统均可以在集群内的某个节点运行上述的持久卷分配方法,以实现为虚拟化容器应用动态供应本地持久卷。
[0203] 应该理解的是,虽然图4至图8的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图4至图8中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
[0204] 在一个实施例中,如图9所示,提供了一种持久卷分配装置900,该装置可以采用软件模块或硬件模块,或者是二者的结合成为计算机设备的一部分,该装置应用于目标容器组调度至的工作节点,该装置具体包括:第一获取模块902、第一查询模块904、文件创建模块906和挂载模块908,其中:
[0205] 第一获取模块902,用于获取持久卷分配请求,持久卷分配请求基于目标容器组创建的持久卷声明生成,持久卷声明与持久卷对象绑定,持久卷分配请求包括目标容器组指定的目标路径、持久卷声明指定的文件系统类型和与持久卷对象对应的卷标识;
[0206] 第一查询模块904,用于根据与持久卷对象对应的卷标识,查询持久卷对象的存储容量;
[0207] 文件创建模块906,用于在目标容器组调度至的工作节点的持久卷数据目录下,按照存储容量创建以卷标识命名的目标文件,并按照文件系统类型将目标文件格式化;
[0208] 挂载模块908,用于将格式化后的目标文件虚拟成块存储设备;将块存储设备挂载至目标路径,以使目标容器组通过目标路径访问工作节点的持久卷数据目录下的目标文件。
[0209] 在一个实施例中,装置还包括:
[0210] 持久卷声明创建模块,用于通过目标容器组创建持久卷声明,持久卷声明包括请求的持久卷的存储容量及文件系统类型;
[0211] 持久卷对象获取模块,用于获取当前处于可用状态的持久卷对象集合;
[0212] 绑定模块,用于从持久卷对象集合中选取与存储容量、文件系统类型一致的持久卷对象,并将选取的持久卷对象并与持久卷声明绑定。
[0213] 在一个实施例中,上述装置还包括监控模块,用于获取目标容器组指定的用于挂载持久卷的目标路径;当监控到目标容器组创建持久卷声明后,则根据目标路径、持久卷声明绑定的持久卷对象对应的卷标识和持久卷声明指定的文件系统类型,生成持久卷分配请求。
[0214] 在一个实施例中,上述装置还包括:
[0215] 第二获取模块,用于获取持久卷扩容请求,持久卷扩容请求基于目标容器组修改持久卷声明生成,持久卷扩容请求包括目标容器组指定的目标路径、修改后的持久卷声明指定的存储容量和与持久卷对象对应的卷标识;
[0216] 第二查询模块,用于在工作节点的持久卷数据目录下查询与卷标识对应的目标文件;获取查询到的目标文件的文件大小、文件系统类型及挂载至的块存储设备;
[0217] 文件扩容模块,用于根据文件大小及修改后的存储容量确定待扩容容量;根据待扩容容量对目标文件进行扩容;
[0218] 文件系统扩容模块,用于按照文件系统类型对挂载至的块存储设备进行格式化,使目标容器组通过目标路径访问工作节点的持久卷数据目录下的扩容后的目标文件。
[0219] 在一个实施例中,上述装置还包括监控模块,用于获取目标容器组指定的用于挂载持久卷的目标路径;当监控到目标容器组修改持久卷声明指定的存储容量后,则根据目标路径、修改后的持久卷声明指定的存储容量和与持久卷对象对应的卷标识,生成持久卷扩容请求。
[0220] 在一个实施例中,上述装置还包括:
[0221] 第三获取模块,获取监测到目标容器组被删除后生成的持久卷卸载请求,持久卷卸载请求包括目标容器组指定的目标路径;
[0222] 持久卷卸载模块,用于当目标路径存在挂载的持久卷时,则执行卸载命令,卸载命令用于解除工作节点的持久卷数据目录与目标容器组指定的目标路径之间的挂载关系。
[0223] 在一个实施例中,上述装置还包括节点容量上报模块,用于获取预先配置的工作节点的持久卷数据目录;扫描持久卷数据目录所在磁盘的可用存储容量;统计持久卷数据目录下的目标文件的文件大小;根据可用存储容量和文件大小获得工作节点的持久化存储容量;上报持久化存储容量。
[0224] 在一个实施例中,上述装置还包括持久卷删除模块,用于获取预先配置的工作节点的持久卷数据目录;扫描持久卷数据目录下的目标文件;当检测到存在未挂载的目标文件时,则获取未挂载的目标文件的文件名称;当检测到不存在与文件名称相同的卷标识对应的持久卷对象时,则删除持久卷数据目录下的未挂载的目标文件。
[0225] 在一个实施例中,工作节点运行了用于管理容器组所需的组件,目标容器组包括至少一个用于运行目标应用程序的容器,目标应用程序是有状态应用程序,持久卷数据目录下的目标文件用于存储目标应用程序的持久化数据。
[0226] 上述持久卷分配装置,在目标容器组创建持久卷声明后,该持久卷声明并将会与持久卷对象绑定,并会根据该持久卷声明指定的文件系统类型、该持久卷对象对应的卷标识及该目标容器组指定的目标路径生成持久卷分配请求,该目标容器组调度至的工作节点在获取到该持久卷分配请求后,根据卷标识查询相应的持久卷对象,并从查询到的持久卷对象中取出存储容量,接着在该工作节点的持久卷数据目录下,按照该存储容量创建以该卷标识命名的目标文件,并按照该文件系统类型将创建的目标文件格式化,使该目标文件包含一个完整的文件系统,然后将该目标文件虚拟成块存储设备,以便于查看该文件系统中的内容,最后将该块存储设备挂载至目标容器组指定的目标路径,这样目标容器组就可以通过该目标路径访问该文件系统中的内容。由于目标文件是在工作节点本地的持久卷数据目录下创建的,可以按目标容器组的需求设置目标文件的大小,不需要提前按固定容量划分本地的存储空间,克服了容量限制的问题,实现了持久卷的动态供应与按需供应,确保工作节点上的存储资源能够有效利用。
[0227] 关于持久卷分配装置的具体限定可以参见上文中对于持久卷分配方法的限定,在此不再赘述。上述持久卷分配装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
[0228] 在一个实施例中,提供了一种计算机设备,该计算机设备可以是容器集群管理系统集群中的工作节点,其内部结构图可以如图10所示。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种持久卷分配方法。
[0229] 本领域技术人员可以理解,图10中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
[0230] 在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
[0231] 在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
[0232] 在一个实施例中,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各方法实施例中的步骤。
[0233] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-Only Memory,ROM)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic Random Access Memory,DRAM)等。
[0234] 以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0235] 以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。