集群镜像中的overlay2使用剖析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集群镜像中的overlay2使用剖析相关的知识,希望对你有一定的参考价值。

参考技术A sealer 是阿里巴巴开源的基于kuberentes的集群镜像开源技术,可以把整个集群整体打包。

sealer中集群镜像的存储和docker镜像很像,也采用了写时复制的技术来提升复用性。

本文聊一下overlay2。

COPY on Write在很多地方都会用到,比如git的存储,去修改一个文件并非真的修改,

而是把文件拷贝出来修改,读的时候读取上层的修改层,同样比如在ceph的后段存储

等系统中都存在应用。好处是可以非常方便的进行回滚,以及存储复用,比如给虚拟机

做快照,那我们并不需要把整个系统盘复制一份,而只需要用指针指一下快照的地方就好。

容器镜像同理,写时复制可以让多个应用共享一个基础镜像。

集群镜像把整个集群打包,用写时复制的方法可以帮助分布式应用共享k8s基础镜像。

以及可以很方便的把各种分布式应用镜像进行融合。

overlay文件系统分为lowerdir、upperdir、merged, 对外统一展示为merged,uperdir和lower的同名文件会被upperdir覆盖

workdir必须和upperdir是mount在同一个文件系统下, 而lower不是必须的

lowerdir可以是多个目录(前面覆盖后面),如果没有upperdir,那merged是read only.

overlay只支持两层,upper文件系统通常是可写的;lower文件系统则是只读,这就表示着,当我们对 overlay 文件系统做任何的变更,都只会修改 upper 文件系统中的文件

来个实际操作:

以上overlay2下面的几个目录就被合并了

对只在 lower 有的文件写时,则会做一个copy_up 的操作,先从 lower将文件拷贝一份到upper,同时为文件创建一个硬链接。此时可以看到 upper 目录下生成了两个新文件,写的操作只对从lower 复制到 upper 的文件生效,而 lower 还是原文件

删除 lower 和 upper 都有的文件时,upper 的会被删除,在 upper 目录下创建一个 ‘without’ 文件,而 lower 的不会被删除

有了上述理论基础,我们先看一段 docker里面的源码

mountTarget就是目标目录, mountData是: fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", string(lowers), path.Join(id, "diff"), path.Join(id, "work"))

可以看到SDK的使用和命令行很像

我们可以做一个封装:

主要是syscall.Mount这个系统调用,参数基本和命令行一一对应

sealer中overlay2源码地址
kubernetes一键安装

sealer集群整体打包!

15.overlay和overlay2对比介绍

关于OverlayFS的镜像分层与共享,先说几个重要的结论

1.overlay驱动只能工作在两层之上。也就是说多层镜像不能用多层OverlayFS实现。替代的,每个镜像层在/var/lib/docker/overlay中用自己的目录来实现,使用硬链接这种有效利用空间的方法,来引用底层分享的数据。注意:Docker1.10之后,镜像层ID和/var/lib/docker中的目录名不再一一对应。

2.overlay驱动只工作在一个lower OverlayFS层之上,因此需要硬链接来实现多层镜像

$ mount | grep overlay

overlay on /var/lib/docker/overlay/ec444863a55a.../merged
type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay/55f1e14c361b.../root,
upperdir=/var/lib/docker/overlay/ec444863a55a.../upper,
workdir=/var/lib/docker/overlay/ec444863a55a.../work)

3.但overlay2驱动原生地支持多层lower OverlayFS镜像(最多128层)

$ mount | grep overlay

overlay on /var/lib/docker/overlay2/9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/merged
type overlay (rw,relatime,
lowerdir=l/DJA75GUWHWG7EWICFYX54FIOVT:l/B3WWEFKBG3PLLV737KZFIASSW7:l/JEYMODZYFCZFYSDABYXD5MF6YO:l/UL2MW33MSE3Q5VYIKBRN4ZAGQP:l/NFYKDW6APBCCUCTOUSYDH4DXAT:l/6Y5IM2XC7TSNIJZZFLJCS6I4I4,
upperdir=9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/diff,
workdir=9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/work)

4.本质区别是镜像层之间共享数据的方法不同

overlay共享数据方式是通过硬连接
而overlay2是通过每层的 lower文件

 

参考:

https://blog.csdn.net/styshoo/article/details/60715942

https://www.cnblogs.com/iiiiher/p/8037719.html

 

以上是关于集群镜像中的overlay2使用剖析的主要内容,如果未能解决你的问题,请参考以下文章

15.overlay和overlay2对比介绍

[docker]overlay和overlay2的区别

docker的overlay2目录

解决 error creating overlay mount to /var/lib/docker/overlay2

解决 error creating overlay mount to /var/lib/docker/overlay2

解决 error creating overlay mount to /var/lib/docker/overlay2