Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >细述Kubernetes和Docker容器的存储方式

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

原创
作者头像
本人秃顶程序员
修改于 2019-04-19 02:33:17
修改于 2019-04-19 02:33:17
1.3K0
举报
文章被收录于专栏:Java架构筑基Java架构筑基

目前,容器存储是容器离不开的一个话题,对于无状态的Docker容器,容器重启时容器数据会自动清除,一些静态的数据我们可以通过配置文件或者在容器build时直接写死。但是对于数据库日志文件等可以实时变化的数据,我们不能够通过这种方法存取,容器的存储大多支持Docker或Kubernetes的Volume(数据卷),因此我们下文先介绍这两种Volume的原理

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在架构上实现了软件定义存储的控制平面和数据平面。尽管许多功能还在不断完善之中,但是我们还是可以看出下一代面向容器的软件定义存储的雏形。

读者福利:

分享免费学习资料

针对于Java程序员,我这边准备免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

资料领取方式:加入Java技术交流群963944895点击加入群聊,私信管理员即可免费领取

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kubernetes中的Volume介绍
Docker 中也有一个 volume 的概念,尽管它稍微宽松一些,管理也很少。在 Docker 中,卷就像是磁盘或是另一个容器中的一个目录。它的生命周期不受管理,直到最近才有了 local-disk-backed 卷。Docker 现在提供了卷驱动程序,但是功能还非常有限(例如Docker1.7只允许每个容器使用一个卷驱动,并且无法给卷传递参数)。
sunsky
2020/08/20
2.3K0
Kubernetes | 存储 - Storage
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制大对象。
Zkeq
2023/05/13
9400
Kubernetes | 存储 - Storage
Kubernetes-存储卷Volume
由于容器本身是非持久化的,因此需要解决在容器中运行应用程序遇到的一些问题。首先,当容器崩溃时,kubelet将重新启动容器,但是写入容器的文件将会丢失,容器将会以镜像的初始状态重新开始;第二,在通过一个Pod中一起运行的容器,通常需要共享容器之间一些文件。Kubernetes通过存储卷解决上述的两个问题。
菲宇
2019/06/12
5K1
Kubernetes 的基本概念和术语
Kubernetes 里的 Master 指的是集群的控制节点,负责整个集群的管理和控制。 在 Master 上运行中以下关键进程:
tanmx
2019/12/30
7600
了解Kubernetes主体架构(二十八)
接下来还会逐步完善本教程,比如Helm、ELK、Windows Server容器等等。
心莱科技雪雁
2019/07/08
1K0
Kubernetes 几种存储方式性能对比 (转载)
https://blog.fleeto.us/post/kubernetes-storage-performance-comparison/
Portworx
2019/12/11
3.3K0
Kubernetes 学习(十)Kubernetes 容器持久化存储
0. 前言 最近在学习张磊老师的 深入剖析Kubernetes 系列课程,最近学到了 Kubernetes 容器持久化存储部分 现对这一部分的相关学习和体会做一下整理,内容参考 深入剖析Kubernetes 原文,仅作为自己后续回顾方便 希望详细了解的同学可以移步至原文支持一下原作者 参考原文:深入剖析Kubernetes 1. PV、PVC、StorageClass 关系梳理 1.1 相关概念 Volume:其实就是将一个宿主机上的目录,跟一个容器里的目录绑定挂载在了一起 持久化 Volume:指的就是
西凉风雷
2022/11/23
7540
Kubernetes 学习(十)Kubernetes 容器持久化存储
Pod 的存储之volume
​容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod 中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的 Volume 抽象就很好的解决了这些问题。
星哥玩云
2022/09/15
6840
Pod 的存储之volume
Kubernetes 存储原理解析
前面的章节中我们介绍了在 Kubernetes 中的持久化存储的使用,了解了 PV、PVC 以及 StorageClass 的使用方法,从本地存储到 Ceph 共享存储都有学习,到这里我们其实已经可以完成应用各种场景的数据持久化了,但是难免在实际的使用过程中会遇到各种各样的问题,要解决这些问题最好的方式就是来了解下 Kubernetes 中存储的实现原理。
我是阳明
2021/01/29
1.7K0
Kubernetes 存储原理解析
k8s之PV、PVC、StorageClass详解
PV是对底层网络共享存储的抽象,将共享存储定义为一种“资源”,比如Node也是容器应用可以消费的资源。PV由管理员创建和配置,与共享存储的具体实现直接相关。
Liusy
2020/12/02
13.9K0
k8s之PV、PVC、StorageClass详解
Kubernetes运维-持久化存储卷实践与管理
PV 的全称是:PersistentVolume(持久化卷),是对底层共享存储的一种抽象,PV 由管理员进行创建和配置,是一个全局资源,包含存储的类型,存储的大小和访问模式等。它和具体的底层的共享存储技术的实现方式有关,比如 Ceph、GlusterFS、NFS、hostPath 等,都是通过插件机制完成与共享存储的对接。
王先森sec
2024/04/20
5400
Kubernetes运维-持久化存储卷实践与管理
043.集群存储-共享存储
Kubernetes对于有状态的容器应用或者对数据需要持久化的应用,不仅需要将容器内的目录挂载到宿主机的目录或者emptyDir临时存储卷,而且需要更加可靠的存储来保存应用产生的重要数据,以便容器应用在重建之后仍然可以使用之前的数据。
木二
2020/03/27
3K0
浅谈Kubernetes的存储
PersistentVolume是一个表示在集群中独立于Pod之外的一块物理存储资源的对象。它抽象了底层存储系统的细节,为Pod提供了统一的接口来访问这些存储资源。 PV 描述的,是持久化存储数据卷。这个 API 对象主要定义的是一个持久化存储在宿主机上的目录,比如一个 NFS 的挂载目录
用户11097514
2024/07/31
1540
09 . Kubernetes之pv、pvc及使用nfs网络存储应用
动态模式: 管理员无需手动创建PV,而是通过StorageClass的设置对后端存储进行描述,标记为某种"类型(Class)",此时要求PVC对存储的类型进行声明,系统将自动完成PV的创建及PVC的绑定,PVC可以声明为Class为"",说明该PVC禁止使用动态模式
iginkgo18
2020/09/27
3.4K0
09 . Kubernetes之pv、pvc及使用nfs网络存储应用
kubernetes系列教程(九)初识Pod存储管理
上一篇文章中kubernetes系列教程(八)Pod健康检查机制介绍了kubernetes中Pod健康检查机制,通过实战介绍了kubernetes中两种健康检查探针:livenessProbe存活检查,readinessProbe就绪检查,存活检查用于检查应用的可用性,就绪检查用于检查容器是否准备接受流量,健康检查包含三种探测的方法:exec命令行探测,tcpSocket端口检测,httpGet请求检测,分别适用于不同场景下的健康检查。接下来介绍kubernetes系列教程pod的存储管理。
HappyLau谈云计算
2019/10/08
4.6K3
kubernetes系列教程(九)初识Pod存储管理
(译)Kubernetes 存储性能对比
如果你正在运行 Kubernetes,你可能正在使用,或者准备使用动态供给的块存储卷,而首当其冲的问题就是为集群选择合适的存储技术。这个事情并不能用一个简单的测试来做出简单的回答,告诉你目前市面上最好的技术是什么。存储技术的选择过程中,集群上运行的负载类型是一个重要的输入。对于裸金属集群来说,需要根据实际用例进行选择,并集成到自己的硬件之中。公有云中的托管 K8s,例如 AKS、EKS 或者 GKE,都具有开箱可用的块存储能力,然而这也不见得就是最好的选择。有很多因素需要考虑,比如说公有云的 StorageClass 的故障转移时间太长。例如在 一个针对 AWS EBS 的故障测试中,加载了卷的 Pod 用了超过五分钟才成功的在另一个节点上启动。Portworx 或者 OpenEBS 这样的云原生存储产品,正在尝试解决这类问题。
崔秀龙
2019/07/23
3.1K0
(译)Kubernetes 存储性能对比
Kubernetes 存储概念之Volumes介绍
默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问题,第一:当容器挂掉,K8S重启它时,文件将会丢失;第二:当Pod中同时运行多个容器,容器之间需要共享文件时。Kubernetes的Volume解决了这两个问题
授客
2022/05/06
2.2K0
容器技术在企业落地的9个关键问题
当今容器技术被广泛关注,已经有越来越多的企业开始布局或者已经采用容器技术来构建自己的云基础设施。 .
孙杰
2019/10/29
1.4K0
容器技术在企业落地的9个关键问题
Kubernetes系列学习文章 - 存储实现(九)
| 导语 数据,是无价的。了解清楚底层的存储实现方式对于数据的使用、保护以及IO性能的优化有很大的帮助。本篇文章从三个大点来讲讲K8S的存储实现机制。
宝哥@上云专家
2020/04/03
3.2K0
Kubernetes系列学习文章 - 存储实现(九)
Kubernetes-持久化存储卷PersistentVolume
PersistentVolume(PV)用于为用户和管理员提供如何提供和消费存储的API,PV由管理员在集群中提供的存储。它就像Node一样是集群中的一种资源。PersistentVolume 也是和存储卷一样的一种插件,但其有着自己独立的生命周期。PersistentVolumeClaim (PVC)是用户对存储的请求,类似于Pod消费Node资源,PVC消费PV资源。Pod能够请求特定的资源(CPU和内存),声明请求特定的存储大小和访问模式。PV是一个系统的资源,因此没有所属的命名空间。
菲宇
2019/06/12
1.9K1
Kubernetes-持久化存储卷PersistentVolume
相关推荐
Kubernetes中的Volume介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档