11. [containerd] content服务解析
创始人
2024-03-12 07:46:10
0

containerd的核心Layer层存储组件content,用于存储下载的layer层数据,大家知道镜像是分层架构,一个镜像可能有很多Layer层组成,通过各Layer堆叠形成最终的文件系统,供运行时组件调用。本节详细分析content组件。

一、content服务接口

type Store interface {ManagerProviderIngestManagerIngester
}

1.Manager用于Layer层数据的删改查,对应下面四个方法。Walk方法,是查询的一种,将过滤出来的content应用WalkFunc方法。最后一个查Info,并不是读取Layer层数据,而是获取其属性信息,包括文件大小、修改时间等。

Delete(ctx context.Context, dgst digest.Digest) error
Update(ctx context.Context, info Info, fieldpaths ...string) (Info, error)
Walk(ctx context.Context, fn WalkFunc, filters ...string) error
Info(ctx context.Context, dgst digest.Digest) (Info, error)	

2.Provider用户Layer层数据的查询。下面方法读取数据。

ReaderAt(ctx context.Context, desc ocispec.Descriptor) (ReaderAt, error)

3.IngestManager用于管理正在下载的Layer层数据,提供状态查询、中断等方法,上面两个方法是下载完成的Layer管理接口。

Status(ctx context.Context, ref string) (Status, error)
ListStatuses(ctx context.Context, filters ...string) ([]Status, error)
Abort(ctx context.Context, ref string) error

4.Ingester用于下载Layer层数据,提供数据存储服务。

Writer(ctx context.Context, opts ...WriterOpt) (Writer, error)

二、content组件设计

containerd以插件形式管理各个组件,content组件生效需要提供两个组件标识。

plugin.GRPCPlugin 将 content组件注册为GRPC服务,对外提供服务接口,ctr、crictl等客户端可以访问该服务。
plugin.ServicePlugin 将content组件注册为一个功能服务,提供Layer层存储服务。
plugin.MetadataPlugin 该组件是所有组件的元数据管理中心,用于存储各组件的管理数据。
plugin.ContentPlugin content组件的存储实现服务,真正实现存储逻辑的。

他们几个的关系:
1)客户端调用从GRPCPlugin组件访问Content服务,GRPCPlugin加载ServicePlugin并调用其提供的服务。
2)ServicePlugin 调用MetadataPlugin,调用其提供的服务。
3)MetadataPlugin 调用ContentPlugin,调用其提供的存储服务。

containerd的源代码在这方面确实有点混乱,这几个组件很多方法名称相同,连IDE也无法正确分辨。

三、ContentPlugin

1. 存储目录定义

定义存储结构,组件包含两类数据,一类是正在下载的临时目录,一类是下载完成、验证完成的Layer层真实存储目录。

1)下载完成的Layer层存储目录:/var/lib/containerd/io.containerd.content.v1.content/blobs
2)Layer层临时存储目录:/var/lib/containerd/io.containerd.content.v1.content/ingest

2. Layer层存储服务

2.1)获取Layer层下载的Writer句柄

IngesterWriter(ctx context.Context, opts ...WriterOpt) (Writer, error) 实现。

1)存储Layer层数据,传入该Layer层的唯一标识,以及根据Manifest获取的Desc信息,Desc信息包含期望下载的Digest。
2)ingest目录其{namespace/id/ref}文件夹下,定义两个子文件 ref文件、data文件,ref文件存储Layer层的唯一标识,data文件Layer层数据。
3) 根据data文件是否有内容,判断是重新写入还是接着上次的offset继续写入。将data文件的WriteIO句柄封装到返回值Writer服务中。

2.2)Writer服务

1)Writer数据写入服务,这个好理解,写入Layer层数据到data文件
2)Digest获取写入数据的Hash值
3)Status获取已经写入数据状态,包括写入Size、Offset,以及期望的Digest等。
4)Truncate文件内容清空,Reset文件的Offset等。
5)Commit通知文件写入完毕,可以进行后续处理,例如将ingest文件存储到blobs目录。

四、MetadataPlugin

客户端真正的访问顺序,从MetadataPluginContentPlugin,在调用ContentPlugin存储Layer数据前,需要MetadataPlugin 先行对元数据进行处理。

1. 存储

metadata存储数据库:bolt
metadata存储目录:/var/lib/containerd/io.containerd.metadata.v1.bolt

2. 常用的存储字段

1)该Layer层存储完毕,记录元数据

Key:v1/{namespace}/content/blob/{digest}
Key1: createdat
Key2:updatedat
Key3:size

2)content的lease信息,下载完成后设置

Key: v1/{namespace}/leases/{leaseID}/content/{Digest}
Value: nil

3)正在下载的ref记录

Key:v1/{namespace}/content/ingests/{ref}
Key1:ref Value:{namespace}/{boltID}{ref}
Key2:expireat Value:{deadline time}
Key3:expected Value:{Digest}

4)下载环节设置,GC使用

Key: v1/{namespace}/leases/{leaseID}/ingests/{ref}
Value: nil

五、GarbageCollect 垃圾回收

content垃圾回收用于删除无用的content。

遍历所有的content存储,在v1/{namespace}/content/blob/v1/{namespace}/content/ingests存在的content保留,其他删除。

相关内容

热门资讯

“留得残荷听雨声”,在《红楼梦... “留得残荷听雨声”,在《红楼梦》里哪一回?《红楼梦》四十回史太君两宴大观园 金鸳鸯三宣牙牌令:宝玉道...
如何能大批捉蟋蟀? 如何能大批捉蟋蟀?只要拿一个空的大可乐瓶子半埋在底下(记住,是瓶口在上底部在下)里面放一些蔬菜之类的...
一只鸟对另一个鸟说因为我的叫声... 一只鸟对另一个鸟说因为我的叫声难听,人们讨厌我,我要南迁,另一只鸟说,你只有改变你的叫声,不然南迁应...
有9把钥匙9把锁,一把钥匙开一... 有9把钥匙9把锁,一把钥匙开一把锁,但不知道哪把开哪把,最少______次能够确保全打开.8+7+…...
谁有好看的言情小说~~! 谁有好看的言情小说~~!已发 校园网略慢 请耐心等一下 鞠躬~
巴基斯坦夏给拉和小猫咪过得怎么... 巴基斯坦夏给拉和小猫咪过得怎么样巴基斯坦夏给拉和小猫咪过得非常好。因为老王一直都在帮助一个叫夏给拉的...
从新办了身份证旧的还能用吗? 从新办了身份证旧的还能用吗?办了新身份证旧在有效期内仍然可以使用。补办新的身份证后,旧的身份证不会被...
郭论第二季说上厕所下厨房的是哪... 郭论第二季说上厕所下厨房的是哪一期?还解释了东宫西宫的区别,是哪一期什么上厕所下厨房的?这都哪跟哪儿...
冰心诗四首中《母亲》《纸船》两... 冰心诗四首中《母亲》《纸船》两首诗表达的情感有无区别?造成这种区别的原因是?(1)从自然的风雨联想心...
在用英语叙述故事时应该用什么时... 在用英语叙述故事时应该用什么时态 看情况,可以选择不同的时态来写故事。想强调是现实中也会发生的,...
关于“星梦天使”的问题! 关于“星梦天使”的问题!星司有人希良梨做妹妹吗?宙人或希良梨有表白吗?有的话,是哪集。还有的就是,宙...
做菜一般都需要什么调料 做菜一般都需要什么调料油、盐、酱油、白醋、陈醋,糖、味精、鸡精,生抽、老抽、香油,芝麻油,葱,姜,蒜...
燕无歇歌曲表达的意思? 燕无歇歌曲表达的意思? 燕无歇歌曲表达的意思是指男女间复杂的感情,女方不喜欢男方,另有所爱,而男方因...
《绝世剑神》无用一书生,故事起... 《绝世剑神》无用一书生,故事起因是?绝世剑神作者:无用一书生简介:百年前,苍穹大陆第一剑神叶云在“开...
无畏无惧的歌词 无畏无惧的歌词《无畏无惧》What's wrong with meWhat's wrong with...
寓言是文学体裁的一种,其特点为... 寓言是文学体裁的一种,其特点为篇幅大多较短,情节较 ,主题充满智慧和哲理。大多采用 和 的表现手法情...
伊索寓言主要讲什么 伊索寓言主要讲什么对富人贪婪自私的揭露;对恶人残忍本性的鞭鞑;对劳动创造财富的肯定;对社会不平等的抨...
擦干泪,别害怕写一篇故事 擦干泪,别害怕写一篇故事故事很励志,给我很大鼓励,谢谢楼主。
评价一下“学渣再怎么努力也无法... 评价一下“学渣再怎么努力也无法超越学霸,因为你在努力,学霸也在努力”这句话你以为你足够努力了,其实比...
小象贝贝去救火,当他犹豫的时候... 小象贝贝去救火,当他犹豫的时候,会发生什么小象西西会有危险。在电视剧小象救援队中的第十集中,小象西西...