细述Kubernetes和Docker容器的存储方式

细述Kubernetes和Docker容器的存储方式

Docker的容器卷插件
Docker V1.8正式发布了容器卷插件 (Volume Plugin) 的规范,允许第三方厂商的数据卷在Docker引擎中提供数据服务,使得外置存储可以超过容器的生命周期而独立存在。这意味着各种存储设备只要满足接口API的标准,就可以接入Docker容器的运行平台中。Volume Plugin的接口规范定义了5中操作,如下表所示:

这个规范定义非常简洁,现有的各种存储可以通过简单的驱动程序封装,从而实现和Docker容器的对接。可以说,驱动程序实现了和容器引擎的北向接口,底层则调用后端存储的功能完成数据存取等任务。还有不少存储方案实现了额外的高端功能,如容器数据卷迁移等,这部分功能不在Docker的卷插件规范当中,可通过存储自身的管理工具来使用。目前已经实现的Docker Volume Plugin中,后端存储包括常见的NFS, CIFS, GlusterFS和块设备等。

Kubernetes的容器卷
Kubernetes是开源的容器集群管理平台,可以自动化部署、扩展和运维容器应用。Kubernetes的调度单位称作“Pod”(豆荚),每个Pod代表一个应用,包含一个或多个容器。Pod可部署在集群的任意节点中,存储设备可以通过数据卷(Volume)提供给Pod的容器使用。Kubernetes底层支持Docker的容器运行引擎,为了不绑定在特定的容器技术上,Kubernetes没有使用Docker的Volume机制,而是重新制定了自己的通用数据卷插件规范,以配合不同的容器运行时来使用(如Docker和rkt)。

数据卷一般可以贯穿Pod的整个生命周期,当Pod被平台删除的时候,在不同的数据卷实现中,数据可能会被保留或移除。如果数据被保留的话,其他Pod可以重新把该卷的数据加载使用。数据卷分为共享和非共享两种类型,其中非共享型只能被某个节点挂载使用(如iSCSI,AWS EBS等网络块设备),共享型则可以让不同节点上的多个Pod同时使用(如NFS,GlusterFS,CephFS等网络文件系统,以及可支持多方读写的块设备)。对有状态的应用来说,共享型的卷存储能够很方便地支持容器在集群各节点之间的迁移。

Kubernetes的数据卷可把外部预创建的数据卷接入Pod里面,在这个过程中,Pod无法对数据卷配置参数(如卷大小,IOPS等),因为这些参数是由提供数据卷的存储预先设定的,这有点象传统存储先划分数据卷,再供给应用挂载使用。为了给容器提供更细粒度的卷管理,Kubernetes增加了持久化卷PV(Persistent Volume)的功能,把外置存储作为资源池,由平台管理并提供给整个集群使用。每个PV具有一些可被平台感知的存储能力,如卷容量(storage size),读写访问模式(access mode)等。当Pod需要存储时,可以向平台请求所需要存储资源,该请求称作PVC (Persistent Volume Claim)。PVC内容包括访问模式、容量大小等信息。平台根据请求的资源属性(如卷大小等)匹配合适的资源并分配给Pod,并把数据卷挂载到Pod所在的主机中供Pod使用(如下图所示)。

Kubernetes的Persistent Volume功能还在不断发展中,目前PV仅支持存储容量(storage size)的能力(capacity),今后还可能支持IOPS,吞吐量等存储能力,以便配置更丰富的存储策略。Kubernetes的卷管理架构使得存储可用标准的接入方式,并且通过接口暴露存储设备所支持的能力,从而在容器任务调度等方面实现了自动化管理。

Flocker
为了给容器应用提供文件卷存储,比较简单的方式是在重用传统存储的基础上,加上适配容器规范的相应接口。使用这种方式的容器存储很多,如适配Docker的GlusterFS, NFS, CIFS的卷插件。下文介绍的Flocker也是这种模式的开源容器卷管理器,它提供了在集群中管理和编排容器数据卷的方案,并依靠后端的共享块存储提供数据卷跨主机的能力。

如上图所示,Flocker由控制服务作为总控制器,对外提供REST API接口,负责维持和更新系统的状态。Flocker Agent安装在集群的每个节点上,负责确保每个节点上的本地状态符合系统期待的状态,如果发现本地状态和期待状态不符,Flocker Agent将采取必要的纠正措施,使得节点上的数据卷与集群系统的配置实现最终一致性(eventual consistency)。Flocker Plugin也部署在每个节点上,主要以插件形式与Docker、Kubernetes等容器平台的集成,不仅让容器可以使用Flocker提供的数据卷,还能够支持容器的迁移。

例如,在Kubernetes中,当Pod所在的主机失效之后,Kubernetes会把Pod重新调度(迁移)到另一台主机上,相应地,Flocker把Pod在原主机上的数据卷释放出来,并且在新主机中重新挂载给该Pod。这样,有状态容器在迁移主机的时候,其数据卷也能够跟随着容器一起移动。

Flocker后端可采用各种常见的网络块设备,包括AWS EBS,OpenStack Cinder,EMC、DELL、NetApp、VMware VSAN/vVOL等,这些块设备配上驱动程序,即可由Flocker生成数据卷(文件目录形式),挂接到任意的主机上,再通过卷插件的接口,把数据卷提供给容器应用。

Portworx
Portworx开发了容器感知的软件定义存储系统,称为CDS (Container-Defined Storage)。在Portworx的CDS存储中,采用的是计算和存储融合的架构,把集群中所有节点的本地存储聚合成大的资源池,使得每个节点既提供计算能力,也提供本地磁盘作为存储,这样运行在节点中的容器可从本地直接访问数据。

任何存储都要保证数据的完整性和可靠性,由于Portworx采用分布式存储架构,与Ceph、VMware Virtual SAN等类似,需要在多节点之间进行数据复制。如上图所示,当数据在本地写入的时候,根据存储设定的参数,可以把数据复制到其他若干个节点中,从而在集群中存有多个数据副本,确保了数据的可用性和可靠性。如果某个节点出现故障或进行下线维护,该节点上的容器可以被上层的调度器重新调度到其他节点上。因为数据已经复制到了多个节点,容器在新节点上可直接使用本地数据,提高了数据访问的效率(如下图所示)。

Portworx还设计了面向容器卷的存储策略,在创建数据卷的时候可以动态设置,这些策略如下所示:

通过设置上述存储属性的配置,容器卷的QoS等需求可以动态满足,与传统的SAN等块存储有很重要的区别:这些策略是以容器卷的粒度进行配置的,能够很好地符合容器应用的需求,所以称为容器定义的存储(Container Defined Storage),是为容器应用量身定制的软件定义存储。目前,Portworx在架构上实现了软件定义存储的控制平面和数据平面。尽管许多功能还在不断完善之中,但是我们还是可以看出下一代面向容器的软件定义存储的雏形。

转载于:https://blog.51cto.com/14046599/2378568

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100982.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 区块链应用 | 普华永道报告:区块链不只是比特币,还将改变这8大领域

    区块链应用 | 普华永道报告:区块链不只是比特币,还将改变这8大领域

  • 10个常用的3D建模软件,作为3D建模的软件东西很杂很碎,还需多练习才最重要「建议收藏」

    10个常用的3D建模软件,作为3D建模的软件东西很杂很碎,还需多练习才最重要「建议收藏」很多人都会好奇,电脑是怎么将手绘的2D图形变成3D的实际物品的?究竟是什么神奇魔法能够瞬间将我们的想法变成现实的呢?今天来和大家介绍下工业设计师经常会用到的10个3D建模软件。SolidworksSolidworks是工业设计师经常会用到的一款建模软件。SolidWorks是一款在MircosoftWindows上才能运行的建模计算机辅助设计和计算机辅助工程的计算机程序,由DassaultSystemes开发和发布。这是一款很常见的很普遍的工业设计建模软件,如果你以后有机会在国外找工

  • pytorch交叉熵损失函数计算_pytorch loss不下降

    pytorch交叉熵损失函数计算_pytorch loss不下降MSE:MeanSquaredError(均方误差)含义:均方误差,是预测值与真实值之差的平方和的平均值,即:MSE=1N∑i=1n(xi−yi)2\begin{aligned}MSE=\cfrac{1}{N}\sum_{i=1}^n(x_i-y_i)^2\end{aligned}MSE=N1​i=1∑n​(xi​−yi​)2​  但是,在具体的应用中跟定义稍有不同。主要差别是参数的设置,在torch.nn.MSELoss中有一个reduction参数。reduction是维度要不要

  • Python电影评论数据分析系统_echarts数据可视化

    Python电影评论数据分析系统_echarts数据可视化书接上文,继上文实现了《复仇者联盟4:终局之战》电影的影评数据分析采集之后,本文主要对获取到的影评数据进行一些可视化展示,主要的可视化展示手段是词云。这里我把200条左右的纯评论数据抽取解析了出来,贴在下面,感兴趣的可以拿去:=========================================================================…

  • python分割字符串输出_python字符串分割「建议收藏」

    python分割字符串输出_python字符串分割「建议收藏」内置split()函数str.split(sep=None,maxsplit=-1)sep为自定义分割符,maxsplit为最大分割次数,默认值-1进行全部分割注意以下区别:str.split()以空格分割,包括连续空格str.split(”)同样以空格分割,但是不能识别连续空格,会返回两空格之间的空字符串python3docre模块的split()函数re.split(patte…

  • Google搜索语法_谷歌高级搜索怎么用

    Google搜索语法_谷歌高级搜索怎么用Google搜索技巧是利用各种高级搜索语法或者搜索指令,让我们能够使用谷歌进行精确化的搜索,外贸找客户和学术文件查找都可以应用到这些搜索技巧。搜索技巧#1:关键词精确查询使用谷歌搜索时,用英文引号把关键词框起来,Google会进行完全匹配的精确搜索,搜索结果中的页面会包含完整的关键词或者词组。搜索实例比如,我们想要查找谷歌站长工具相关的信息,不限定网页的类型,但必须包含“谷歌站长工具”这个完整的词汇。语法指令“谷歌站长工具”搜索结果搜索技巧#2:OR选择查询一般情况

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号