kata-container github#
https://github.com/kata-containers
https://github.com/kata-containers/runtime
Kata Containers是一个开源项目和社区,致力于构建轻量级虚拟机(VM)的标准实现——这些虚拟机的感知和执行类似容器,但提供VM的工作负载隔离和安全优势,内核级别的隔离宿主机的内核!Kata Containers 项目最初是基于 QEMU 的,但它的设计从一开始就以支持多种管理程序解决方案为出发点.
kata-containers是什么 #
kata containers是由OpenStack基金会管理,但独立于OpenStack项目之外的容器项目。它是一个可 以使用容器镜像以超轻量级虚机的形式创建容器的运行时工具。 kata containers整合了Intel的 Clear Containers 和 Hyper.sh 的 runV,能够支持不同平台的硬件 (x86-64,arm等),并符合OCI(Open Container Initiative)规范,同时还可以兼容k8s的 CRI(Container Runtime Interface)接口规范。目前项目包含几个配套组件,即Runtime,Agent, Proxy,Shim,Kernel等
真正启动Docker容器的命令工具是RunC,它是OCI运行时规范 (runtime-spec)的默认实现。Kata containers其实跟RunC类似,也是一个符合OCI运行时规范的一种 实现(即Clear Container和runV 都符OCI规范),不同之处是,它给每个容器(在Docker容器的 角度)或每个Pod(k8s的角度)增加了一个独立的linux内核(不共享宿主机的内核),使容器有更好 的隔离性,安全性。
容器生态系统中的位置#
容器运行时是一个相对的概念,比如,从k8s的角度看,直接创建容器的组件是docker或containerd, 因此,将docker、containerd以及新加入的CRI-O作为容器运行时组件。而在docker、containerd或 CRI-O的角度看,真正启动容器的组件是runC,因此,docker中将runC作为容器运行时工具,当然在 docker中,runC可以被替换,比如可以替换为本文介绍的kata containers(即clear Container或者 runV)(角度不同,对象不同)
docker组件关系图#
我们看到runC处于docker组件图的最底端,runC下面就是容器。目前docker已经不是一个专一的容器 管理组件,而真正的容器管理组件是containerd,而containerd本身也不会直接跟操作系统交互,去 创建、删除容器,而是借助runC来对容器生命周期进行管理因此这里可以讲runC作为容器运行时。容器圈中针对容器运行时指定了OCI规范
Docker的架构#
如红色虚线框内所示,也就是说,只要符合OCI规范的运行时工具,都可以被docker(或者说是 containerd)使用。 了解上面的内容,我想kata containers在容器的什么位置,应该就显而易见了。它符合OCI运行时规 范,因此,可以作为runC的替代组件
k8s组件的结构图#
注: CC 表示 clear containers , CC 和 runV 有一个虚线框圈起来,表示后续这两个组件会合并成 kata containers ,目前可以分别使用。 上图中给出了k8s分别将docker、containerd和CRI-O作为容器管理工具(以k8s角度的容器运行时) 的组件关系图。k8s为了能对接多种容器管理工具,抽象了CRI接口,每个容器管理工具只需实现接口即可。
runc/kata#
包含的组件及其功能介绍#
runtime:符合OCI规范的容器运行时命令工具,主要用来创建轻量级虚机,并通过agent控制虚 拟机内容器的生命周期
agent:运行在虚机中的一个运行时代理组件,主要用来执行runtime传给他的指令,在虚机内 管理容器的生命周期
shim:以对接docker为例,这里的shim相当于是containerd-shim的一个适配,用来处理容器 进程的stdio和signals。shim可以将containerd-shim发来的数据流(如stdin)传给proxy,然 后转交给agent,也可以将agent经由proxy发过来的数据流(stdout/stderr)传给containerdshim,同时也可以传输signal。
这里的shim跟上一节k8s结构图中的shim不是一个组件,上节提到的shim表示 containerd-shim proxy:主要用来为runtime和shim分配访问agent的控制通道,以及路由shim实例和agent之 间的I/O数据流。
kernel:kernel其实比较好理解,就是提供一个轻量化虚机的linux内核,根据不同的需要,提供 几个内核选择,最小的内核仅有4M多
kata containers各组件之间的关系#
reference#
https://blog.csdn.net/O4dC8OjO7ZL6/article/details/78986732
https://www.cnblogs.com/qccz123456/p/10978505.html
https://blog.csdn.net/hdu_hanwei/article/details/82389111