技术解析系列 | PouchContainer volume机制解析
PouchContainer 是阿里巴巴集团开源的高效、轻量级企业级富容器引擎技术,拥有隔离性强、可移植性高、资源占用少等特性。可以帮助企业快速实现存量业务容器化,同时提高超大规模下数据中心的物理资源利用率。已助力阿里巴巴集团实现在线业务 100% 容器化,双 11 容器规模达到百万级。
PouchContainer volume是专门用来解决容器的数据持久化的机制,想要了解volume的机制,就需要了解PouchContainer的镜像机制。PouchContainer,和Docker一样,实现了镜像的分层机制。所谓镜像分层机制,是指容器的镜像实际上是由多个只读的镜像层(layer)叠加而成,这样不同的镜像就可以复用镜像层,大大加快了镜像分发的效率,同时也减少了容器启动时间。当容器需要启动时,pouchd(下文中提到的pouchd均指PouchContainer daemon)会在启动镜像的最上层添加一个读写层,后续容器所有的读写操作就会记录在这个读写层中。这样也引入了一个问题,那就是容器数据的持久化。假如我们将容器删除,再次通过该镜像启动时,容器之前所做的修改都丢失了,这对于有状态的应用(如数据库)是致命的。
volume绕过了镜像机制,让容器中的数据以正常的文件或者目录的形式存在于宿主机上,当容器停止或删除时,并不会影响到volume中的数据,从而实现了数据的持久化,而且volume数据可以在不同的container之间共享。
1. PouchContainer volume整体架构
该部分内容可能涉及PouchContainer的volume源码实现。
PouchContainer volume整体架构目前主要由以下几部分构成:
VolumeManager:该结构是volume相关操作的入口。
Core:Core是volume的核心模块,包含了volume操作的业务逻辑
Store:负责存储volume元数据,目前元数据存储在本地的boltdb文件中。
Driver:volume driver接口,抽象了volume相关驱动的基本功能
Modules:具体的volume driver,目前存在local, tmpfs, volume plugin, ceph四种volume驱动
VolumeManager是PouchContainer中的存储组件(其他组件包括ContainerManager, ImageManager、NetworkManager等),它是所有volume操作的入口,目前提供了Create/Remove/List/Get/Attach/Detach接口。Core包含了volume操作的核心逻辑,向下负责调用底层具体的volume driver,实现volume的创建、删除、attach、detach等操作,同时调用Store,实现volume元数据管理。Store模块专门负责volume的元数据管理,volume的相关状态都会通过Store进行存储,之所以将元数据管理专门作为一个模块,是为了将来方便扩展,目前volume元数据是存储在boltdb,未来也可能存入etcd等。Driver抽象了volume driver需要实现的接口,一个具体的volume driver需要实现如下接口:
type Driver interface {// Name returns backend driver's name.Name(Context) string// StoreMode defines backend driver's store model.StoreMode(Context) VolumeStoreMode// Create a volume.Create(Context, *types.Volume, *types.Storage) error// Remove a volume.Remove(Context, *types.Volume, *types.Storage) error// Path returns volume's path.Path(Context, *types.Volume) (string, error)
}
2. PouchContainer支持的volume类型
目前,PouchContainer支持三种具体的volume类型,即local, tmpfs和ceph,还通过volume plugin这种通用的存储插件机制支持更多的第三方存储。
2.1 local volume
local volume是PouchContainer默认的volume类型,适合存储需要持久化的数据,它的生命周期独立于容器的生命周期。
当你创建一个volume时,假如没有指定driver类型,则默认local为driver类型。local volume本质上,是pouchd到/var/lib/pouch/volume目录下创建的一个子目录。相较于docker,PouchContainer的local volume拥有更多的实用特性,包括:
指定挂载目录创建volume
可以指定volume大小
首先我们可以指定目录创建一个local volume。该特性在生产中非常实用。对于某些应用,如数据库,我们需要挂载专门的块设备,用于存储数据库数据,例如运维人员将块设备格式化后,挂载到/mnt/mysql_data目录。执行以下命令,我们就创建了一个挂载在/mnt/mysql_data的volume,然后可以将该volume挂载到容器指定目录,启动容器。
pouch volume create --driver local --option mount=/mnt/mysql_data --name mysql_data
其次,我们可以限制volume的大小。该功能依赖于底层文件系统提供的quato功能,目前支持的底层文件系统为ext4和xfs,同时对内核版本也有要求。
pouch volume create --driver local --option size=10G --name test_quota
2.2 tmpfs volume
tmpfs volume的数据并不会持久化到硬盘中去,只存储于内存中 (若内存不足,则存入swap),访问速度快,但当容器停止运行时,该volume里面的所有信息都会消失,因此tmpfs volume只适合保存一些临时和敏感的数据。
tmpfs volume默认存储/mnt/tmpfs目录下,你也可以通过 -o mount 指定其挂载路径。不过指定tmpfs的挂载路径没有什么意义,因为tmpfs内容直接存储在内存中。
pouch volume create --driver tmpfs --name tmpfs_test
2.3 ceph volume
ceph是一种比较特殊的volume类型,ceph volume是将数据存储到ceph集群(ceph rbd 存储)中,因此可以实现volume跨物理机的迁移。
目前外界暂时不能使用ceph volume。从PouchContainer volume架构图可知,ceph driver和driver层之间还有一层alibaba storage controller(注意:alibaba storage controller只是一个代称),这是阿里巴巴内部的一套容器存储管理平台,后面对接了ceph/pangu/nas等诸多存储方案。PouchContainer通过与该容器存储管理平台对接,可以直接利用ceph提供volume。后期我们可能开源该容器存储管理平台。
2.4 volume plugin
volume plugin是一种通用性的volume,准确来说它是一种volume的扩展机制。目前docker通过插件机制可以管理诸多的第三方存储,PouchContainer也实现了该volume plugin机制,可以无缝对接原先docker已经存在的volume plugin。
作为一个volume plugin,必须实现volume plugin protocol。volume plugin其实本质上是一个web server,该web server实现了如下服务,所有请求均为POST请求。
/VolumeDriver.Create // Volume创建服务/VolumeDriver.Remove // Volume删除服务/VolumeDriver.Mount // Volume挂载服务/VolumeDriver.Path // Volume挂载路径服务/VolumeDriver.Unmount // Volume卸载服务/VolumeDriver.Get // Volume Get服务/VolumeDriver.List // Volume List服务/VolumeDriver.Capabilities // Volume Driver能力服务
3. bind mounts与volumes
PouchContainer目前支持两种数据持久化的方式,除了上述的volumes,还可以利用bind mounts。bind mounts,顾名思义,指的是直接将宿主机的目录挂载到容器里面。
pouch run -d -t -v /hostpath/data:/containerpath/data:ro ubuntu sh
上述这条命令就将宿主机上的/hostpath/data目录已只读的方式挂载到容器的/containerpath/data目录下。
bind mounts依赖于宿主机文件系统目录结构,而volume,在PouchContainer中有专门的机制进行管理。volumes相对于bind mounts,有以下优势:
volumes相对于bind mounts,更容易进行备份和管理;
PouchContainer提供了专门的CLI和API,用来管理volumes;
volumes适合在多个容器之间安全地共享;
volumes提供了插件机制,可以更加方便地对接第三方存储。
4. PouchContainer volume未来的发展
CSI,即Container Storage Interface(该项目定义了容器调度层和容器之间的存储接口),目前已发布了v0.2版本。Pouch未来可能增加一种通用类型的driver,用于对接已实现CSI接口的存储系统。
5. 总结
本文介绍了PouchContainer的volume机制, volume机制主要是为了解决容器数据持久化的问题。PouchContainer目前支持local,tmpfs,ceph三种driver,同时支持以volume plugin的形式对接更多的第三方存储。
技术解析系列 | PouchContainer volume机制解析相关推荐
- 技术解析系列 | PouchContainer 支持 LXCFS 实现高可靠容器隔离
划重点 本周起 PouchContainer 启动核心技术专家解析系列文章,第一篇文章将深入剖析 LXCFS 适用业务场景和原理,对 LXCFS 感兴趣的同学不要错过 引言 PouchContaine ...
- 技术解析系列 | PouchContainer CRI的设计与实现
1. CRI简介 在每个Kubernetes节点的最底层都有一个程序负责具体的容器创建删除工作,Kubernetes会对其接口进行调用,从而完成容器的编排调度.我们将这一层软件称之为容器运行时(Con ...
- 技术解析系列 | PouchContainer 富容器技术
划重点 本文将从什么是富容器.富容器适用场景.富容器技术实现三个角度全方位向大家解释富容器技术,同时对富容器感兴趣的同学可以扫描文章末尾二维码参与关于富容器的技术讨论.本文作者 PouchContai ...
- 技术解析系列 PouchContainer Goroutine Leak 检测实践
划重点 本文将从什么是 goroutine leak,如何检测以及常用的分析工具来介绍 PouchContainer 在 goroutine leak 方面的检测实践.本文作者聿歌. 0. 引言 Po ...
- Netty 源码解析系列-服务端启动流程解析
netty源码解析系列 Netty 源码解析系列-服务端启动流程解析 Netty 源码解析系列-客户端连接接入及读I/O解析 五分钟就能看懂pipeline模型 -Netty 源码解析 1.服务端启动 ...
- 湖上建仓全解析:如何打造湖仓一体数据平台 | DEEPNOVA技术荟系列公开课第四期
如今,面对数字化快速发展带来的挑战,现代化企业需要打破以往数据的孤岛,让数据从采集.加工.管理到应用,是统一的数据存储和数据处理,甚至是作为全栈式的湖仓一体数据平台,以支撑各类数据赋能业务,进而创造更 ...
- 时序数据库连载系列: 时序数据库一哥InfluxDB之存储机制解析
InfluxDB 的存储机制解析 本文介绍了InfluxDB对于时序数据的存储/索引的设计.由于InfluxDB的集群版已在0.12版就不再开源,因此如无特殊说明,本文的介绍对象都是指 InfluxD ...
- 时序数据库连载系列: 时序数据库一哥InfluxDB之存储机制解析 1
2019独角兽企业重金招聘Python工程师标准>>> InfluxDB 的存储机制解析 本文介绍了InfluxDB对于时序数据的存储/索引的设计.由于InfluxDB的集群版已在0 ...
- UWP 手绘视频创作工具技术分享系列 - 文字的解析和绘制
本篇作为技术分享系列的第二篇,详细讲一下文字的解析和绘制,这部分功能的研究和最终实现由团队共同完成,目前还在寻找更理想的实现方式. 首先看一下文字绘制在手绘视频中的应用场景 文字是手绘视频中很重要的表 ...
最新文章
- OpenCV中的对极几何和对极约束
- php 顶踩,php和jQuery实现文章页【顶】和【踩】的功能
- 锚杆拉拔试验弹性模量计算_土钉、锚杆拉拔试验检测方案 - 图文 -
- python资源百度云_Python Selenium 百度云分享链接资源 批量保存
- python startswith
- 【PAT甲级 U形打印】1031 Hello World for U (20 分) Java版 6/6通过
- php ci url,URL路由设置-CI(codeigniter)PHP框架再探
- python logistic回归_logistic回归介绍与源码分析
- java义一个方法,返回一组双色球票数
- 警示:一个update语句引起大量gc等待和业务卡顿
- 小峰视频十四:面向对象和类的概念
- volatile关键字使用总结
- iframe常用属性知识
- 不能bostype没有元数据异常_金蝶EAS - BOS工作笔记
- Python之NumPy(axis=0/1/2...)的透彻理解——通过np.sum(axis=?)实例进行说明
- Integer 十六进制
- FindBugs问题集锦
- 【论文翻译】The Quantum Internet: Networking Challenges in Distributed Quantum Computing
- dos命令(转东转西)
- ubuntu滚动屏幕长截屏,截取整个网页
热门文章
- 【Laravel】只保留Auth::routes()的登录,关闭Auth::routes()的注册、重置密码、验证路由
- 3、使用Statement接口实现增,删,改操作
- 15、子查询注意事项
- 11、修改和删除索引(DROP INDEX)
- 1.17 选择排序法
- Codeforces Beta Round #12 (Div 2 Only)【未完结】
- JSR303—Bean Validation验证
- 用华为鸿蒙 OS 2.0 系统写出了HelloWorld!那些说鸿蒙是PPT的可以闭嘴了!
- 一直用git,你了解git的内部机制吗?
- HTML5--表单标签input新增type值