基本概念
1. Containerd是 容器技术标准化后的产物,为了兼容 OCI 标准(定义了容器运行时标准),将容器运行时及其管理功能从docker daemon 抽离出来(主要作用是进行镜像管理和容器管理)。
2. runC 是 按照 OCF(定义了开放容器格式化标准) 从libContainer 抽离出来的产物,其进行容器的启停,以及资源隔离等。
具体使用流程:K8s 通过 CRI (容器运行时接口)去调用 Containerd,Containerd又通过CRI使用RunC,这样就可以使用容器啦。
Containerd 由很多模块(插件)组成。为了解耦,Containerd 将不同的职责划分给不同的组件,每个组件就相当于一个子系统(subsystem)。连接不同子系统的组件被称为模块。
containerd结构
总体上 Containerd 被划分为两个子系统:
Bundle:在containerd中,Bundle包含了配置、元数据和根文件系统数据,可以理解为容器的文件系统。而Bundle子系统允许用户从镜像中提取和打包Bundles。
Runtime:用来执行Bundle,如创建容器。
常见插件:
-
Content Plugin : 提供对镜像中可寻址内容的访问,所有不可变的内容都被存储在这里。
-
Snapshot Plugin : 用来管理容器镜像的文件系统快照。镜像中的每一个 layer 都会被解压成文件系统快照,类似于 Docker 中的
graphdriver。 -
Metrics : 暴露各个组件的监控指标。
containerd主要分成三部分:storage,metadata,runtime
还有就是在配置的时候,如果这个 containerd 要作为 k8s 的 node 节点使用 ,则 oom_score 最好设置的比其他守护进程的优先级要略低,最好是 -999
存储配置
Containerd 有两个不同的存储路径,一个用来保存持久化数据,一个用来保存运行时状态。
-
root = "/var/lib/containerd" state = "/run/containerd"root用来保存持久化数据,包括Snapshots,Content,Metadata以及各种插件的数据。每一个插件都有自己单独的目录,Containerd 本身不存储任何数据,它的所有功能都来自于已加载的插件,真是太机智了。
state 用来保存临时数据,包括 sockets、pid、挂载点、运行时状态以及不需要持久化保存的插件数据。