Volume(存储卷)
容器中的文件在磁盘上是临时存放的,当容器重建时,容器中的文件将会丢失,另外当在一个Pod中同时运行多个容器时,常常需要在这些容器之间共享文件,这也是容器不好解决的问题。Kubernetes抽象出了Volume来解决这两个问题,也就是存储卷,Kubernetes的Volume是Pod的一部分,Volume不是单独的对象,不能独立创建,只能在Pod中定义。
Pod中的所有容器都可以访问Volume,但必须要挂载,且可以挂载到容器中任何目录。
实际中使用容器存储如下图所示,将容器的内容挂载到Volume中,通过Volume两个容器间实现了存储共享。
Volume的生命周期与挂载它的Pod相同,但是Volume里面的文件可能在Volume消失后仍然存在,这取决于Volume的类型。
存储卷类型说明
Volume可分为本地磁盘存储和云存储两大类。
- 本地磁盘存储
本地磁盘存储可以使用如下几种类型,具体使用请参见本地磁盘存储。- emptyDir:一种简单的空目录,主要用于临时存储。
- hostPath:将主机(节点)某个目录挂载到容器中,适用于读取主机上的数据。
- ConfigMap:特殊类型,将Kubernetes特定的对象类型挂载到容器。
- Secret:特殊类型,将Kubernetes特定的对象类型挂载到容器。
- LocalPV:本地持久卷,直接使用节点的本地磁盘,持久化存储容器数据。
- 云存储:
CCE支持使用云存储有如下几种。- 云硬盘EVS
- 极速文件存储SFS Turbo
- 对象存储OBS
- 弹性文件存储SFS
CSI
Kubernetes提供了CSI接口(Container Storage Interface,容器存储接口),基于CSI这套接口,可以开发定制出CSI插件,从而支持特定的存储,达到解耦的目的。
CCE开发了存储插件Everest,在创建集群时必须安装,安装了插件就可以使用的EVS、OBS等云存储。
PV与PVC
Kubernetes抽象了PV(PersistentVolume)和PVC(PersistentVolumeClaim)来定义和使用存储,从而让使用者不用关心具体的基础设施,当需要存储资源的时候,只要像CPU和内存一样,声明要多少即可。
- PV:PV描述的是一个集群里的持久化存储卷,和节点一样,属于集群级别资源。在新版控制台(需要将集群升级到1.19.10并且everest存储插件升级到1.2.10)PV资源已经正式开放给用户管理;旧版控制台仍保持导入使用或者是通过动态创建方式进行创建,用户无法通过控制台对PV资源进行生命周期管理。
- PVC:PVC描述的是负载对存储的申领,PVC的申领会消耗集群中存量的PV资源,若集群中无存量PV资源,会动态创建底层存储及PV资源;创建PVC时,需描述请求的持久化存储的属性,比如,Volume存储的大小、可读写权限等等。
在Pod中可以使用Volume关联PVC,即可让Pod使用到存储资源,它们之间的关系如下图所示。
图 PVC绑定PV
通常在使用时,可以使用PV描述已有的存储资源,然后创建PVC使用存储。具体使用可参见后续各章节中使用kubectl对接存储资源的内容。
而新创建存储资源时,可以使用一种更为方便的方法,可以跳过PV直接使用PVC,这就是StorageClass。
StorageClass
StorageClass描述了集群中的存储类型“分类”,在创建PVC/PV均需要指定StorageClass。目前CCE默认提供csi-disk、csi-nas、csi-obs等StorageClass,在声明PVC时使用对应StorageClassName,就可以创建对应类型PV,并自动创建底层的存储资源。
执行如下命令即可查询CCE提供的默认StorageClass。您可以使用CCE提供的CSI插件自定义创建StorageClass,但从功能角度与CCE提供的默认StorageClass并无区别,这里不做过多描述。
# kubectl get sc
NAME PROVISIONER AGE
csi-disk everest-csi-provisioner 17d # 云硬盘 StorageClass
csi-disk-topology everest-csi-provisioner 17d # 延迟绑定的云硬盘 StorageClass
csi-nas everest-csi-provisioner 17d # 文件存储 StorageClass
csi-obs everest-csi-provisioner 17d # 对象存储 StorageClass
csi-sfsturbo everest-csi-provisioner 17d # 极速文件存储 StorageClass
csi-local-topology everest-csi-provisioner 17d # 本地持久卷
定义了StorageClass后,就可以减少创建并维护PV的工作,PV变成了自动创建,作为使用者,只需要在声明PVC时指定StorageClassName即可,这就大大减少工作量。
CCE容器存储概览
CCE支持工作负载Pod绑定存储卷类型说明中的多种本地磁盘存储和云存储,每种存储卷的主要特点及应用场景如下表:
图 CCE支持的存储类型
表 网络存储对比
对比维度 | 云硬盘EVS | 弹性文件服务SFS | 对象存储OBS | 极速文件存储SFS Turbo |
---|---|---|---|---|
概念 | 云硬盘(Elastic Volume Service)可以为云主机提供高可靠、高性能、规格丰富并且可弹性扩展的块存储服务,可满足不同场景的业务需求,适用于分布式文件系统、开发测试、数据仓库以及高性能计算等场景。 | SFS为用户提供一个完全托管的共享文件存储,能够弹性伸缩至PB规模,具备高可用性和持久性,为海量数据、高带宽型应用提供有力支持。适用于多种应用场景,包括HPC、媒体处理、文件共享、内容管理和Web服务等。 | 对象存储服务(Object Storage Service,OBS)提供海量、安全、高可靠、低成本的数据存储能力,可供用户存储任意类型和大小的数据。适合企业备份/归档、视频点播、视频监控等多种数据存储场景。 | SFS Turbo为用户提供一个完全托管的共享文件存储,能够弹性伸缩至320TB规模,具备高可用性和持久性,为海量的小文件、低延迟高IOPS型应用提供有力支持。适用于多种应用场景,包括高性能网站、日志存储、压缩解压、DevOps、企业办公、容器应用等。 |
存储数据的逻辑 | 存放的是二进制数据,无法直接存放文件,如果需要存放文件,需要先格式化文件系统后使用。 | 存放的是文件,会以文件和文件夹的层次结构来整理和呈现数据。 | 存放的是对象,可以直接存放文件,文件会自动产生对应的系统元数据,用户也可以自定义文件的元数据。 | 存放的是文件,会以文件和文件夹的层次结构来整理和呈现数据。 |
访问方式 | 只能在ECS/BMS中挂载使用,不能被操作系统应用直接访问,需要格式化成文件系统进行访问。 | 在ECS/BMS中通过网络协议挂载使用。需要指定网络地址进行访问,也可以将网络地址映射为本地目录后进行访问。 | 可以通过互联网或专线访问。需要指定桶地址进行访问,使用的是HTTP和HTTPS等传输协议。 | 提供标准的文件访问协议NFS(仅支持NFSv3),用户可以将现有应用和工具与SFS Turbo无缝集成。 |
静态数据卷 | 支持 | 支持 | 支持 | 支持 |
动态数据卷 | 支持 | 支持 | 支持 | 不支持 |
主要特点 | 非共享存储,每个云盘只能在单个节点挂载。 | 共享存储,可提供高性能、高吞吐存储服务。 | 共享存储,用户态文件系统。 | 高性能、高带宽、共享存储。 |
应用场景 | HPC高性能计算、企业核心集群应用、企业应用系统和开发测试等。说明高性能计算:主要是高速率、高IOPS的需求,用于作为高性能存储,比如工业设计、能源勘探等。 | HPC高性能计算、媒体处理、内容管理和Web服务、大数据和分析应用程序等。说明高性能计算:主要是高带宽的需求,用于共享文件存储,比如基因测序、图片渲染等。 | 大数据分析、静态网站托管、在线视频点播、基因测序、智能视频监控、备份归档、企业云盘(网盘)等。 | 高性能网站、日志存储、DevOps、企业办公等。 |
容量 | TB级别 | PB级别 | EB级别 | TB级别 |
时延 | 1~2ms | 3~20ms | 10ms | 1~2ms |
IOPS/TPS | 单盘33K | 2K | 千万级 | 100K |
带宽 | MB/s级别 | GB/s级别 | TB/s级别 | GB/s级别 |
约束与限制
安全容器不支持使用对象存储卷。
- OBS限制单用户创建100个桶,但是CCE使用OBS桶为单个工作负载挂载一个桶,当工作负载数量较多时,容易导致桶数量超过限制,OBS桶无法创建。建议此种场景下直接通过OBS的API或SDK使用OBS,不在工作负载中挂载OBS桶。
- 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。
1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。
- 1.19及以下版本的集群在卸载subpath时会遍历subpath下所有文件夹,若文件夹数量较多的情况下,遍历时间较长,卸卷时间对应较长。建议在subpath下不要建立太多文件夹,否则可能会出现Pod删除卸卷时间较长的情况。
- CCE集群下挂载的OBS中单个文件大小限制远小于obsfs限制。
插件使用推荐
- 使用CSI插件(Everest)要求Kubernetes版本需为 1.15及以上 ,v1.15及以上版本的集群在创建时将默认安装本插件,v1.13及以下版本集群创建时默认安装Flexvolume插件(storage-driver)。
- 集群版本由v1.13升级到v1.15后,v1.13版本集群中的Flexvolume容器存储插件(storage-driver)能力将由v1.15的CSI插件(Everest,插件版本v1.1.6及以上)接管,接管后原有功能保持不变。
- 插件版本为1.2.0的Everest优化了使用OBS存储时的 密钥认证功能 ,低于该版本的Everest插件在升级完成后,需要重启集群中使用OBS存储的全部工作负载,否则工作负载使用存储的能力将受影响。
CSI和Flexvolume存储插件的区别
表 CSI与Flexvolume
Kubernetes插件方案 | CCE插件名称 | 插件特性 | 使用推荐 |
---|---|---|---|
CSI | Everest | CSI插件是kubernetes社区推荐的存储插件机制。CCE发布的kubernetes1.15版本及以上版本默认安装CSI插件Everest,并用于对接块存储、文件存储、对象存储、极速文件存储等Iaas存储服务。 Everest插件包含两部分: Everest-csi-controller:提供存储卷的创建、删除、扩容、云盘快照等功能; Everest-csi-driver:提供存储卷在node上的挂载、卸载、格式化等功能。 |
针对1.15及以上版本的集群,在创建时将默认安装CSI插件(Everest)。CCE会跟随社区持续更新CSI插件的各种能力。 |
Flexvolume | storage-driver | Flexvolume插件是kubernetes社区早期实现的存储卷插件机制。自CCE上线伊始,提供的就是Flexvolume数据卷服务。 CCE发布的kubernetes 1.13及以下版本安装的插件是“storage-driver”,并用于对接块存储、文件存储、对象存储、极速文件存储等Iaas存储服务。 |
针对已经创建的1.13及以下版本的集群,仍然使用已经安装的Flexvolume存储插件(storage-driver),CCE已停止更新该插件。 |
说明
不支持CSI和Flexvolume插件在同一个集群中使用。
不支持将v1.13及以下版本集群的Flexvolume插件转变到CSI插件,v1.13版本的集群可以通过升级集群版本切换为CSI插件。
如何判断集群的存储插件模式
步骤 1 登录CCE控制台。
步骤 2 在控制台左侧栏目树中,单击“插件管理”。
步骤 3 在右侧的插件管理列表中,单击“插件实例”页签。
步骤 4 在插件实例页面下,选择右上方的集群后,可以看到创建该集群时默认安装的存储插件。