Linux容器技术进化史(2)

Google演示的是Kubernetes容器编排工具,它是基于Google内部开发的编排工具所积累的经验。OpenShift决定放弃Gear项目,开始和Google一起合作Kubernetes。Kubernetes目前已经称为GitHub上最大的社区项目之一。

Kubernetes

Kubernetes最初使用Google的lmctfy作为其容器运行时库。2014年夏天,lmctfy被移植支持Docker。Kubernetes会在集群的每个节点运行一个名为kubelet的守护进程。这意味着原始的Kubernetes和Docker 1.8工作流程看上去是这样的:

kubelet → dockerdaemon @ PID1

这又回到了两个守护进程的模式。

还有更糟糕的。每次Docker发布,Kubernetes都会被破坏。Docker 1.10修改了后端存储,导致所有镜像都需要重新构建。Docker 1.11开始通过runc来启动容器:

kubelet → dockerdaemon @ runc @PID1

Docker 1.12增加了一个容器守护进程来启动容器。这样的主要目的是满足Docker Swarm(一个Kubernetes的竞争对手)的需求:

kubelet → dockerdaemon → containerd @runc @ pid1

前面提到了,每次Docker发布新版本都会破坏Kubernetes的功能,因此对于Kubernetes和OpenShift等工具都需要适配旧版本Docker。

现在,已经进化成三守护进程系统,这种架构下守护进程中的任何一部分出错了,整个系统都会分崩离析。

走向容器标准化 CoreOS、rkt其他运行时环境

由于Docker运行时库的各种问题,多个组织都在寻求其替代方案。其中一个组织是CoreOS。CoreOS为上游docker提供了一个替代的容器运行时环境rkt(rocket)。同时,CoreOS还引入了一个标准容器规范:appc(App Container)。简单的说,他们希望大家在处理容器镜像存储的时候可以使用统一的标准规范。

这是一个对社区的警示。在刚开始和上游docker合作容器项目的时候,我最大的担忧是最终会有多个标准。我不希望会出现类似RPM格式和Debian格式(deb)之间的战争,这场战争影响了后来20年的Linux软件分发。appc提出的一个利好是它说服了上游docker和开源社区一起建立一个标准体:Open Container Initiative(OCI)。

OCI一直在制定两种规范:

通过提供容器镜像和运行时的行业规范,OCI帮助了容器相关工具和编排框架上的革新。

抽象运行时接口

Kubernetes编排工具是这些标准的受益者之一。作为Kubernetes的一大支持者,CoreOS提交了一系列的补丁为Kubernetes增加了通过rkt运行容器的支持。Google和Kubernetes社区发现应用了这些补丁之后,将来要为Kubernetes增加新的容器运行时支持会使得Kubernetes代码变得复杂和臃肿。因此Kubernetes团队决定实现一套名为容器运行时接口(Container Runtime Interface,CRI)的API协议规范。然后他们重构了Kubernetes,使其直接调用CRI,而不用调用Docker引擎。如果以后需要添加新的容器运行时接口,只需要实现CRI的服务端接口即可。同时,Kubernetes为CRI开发者提供了大量测试集用来验证这些实现是否兼容Kubernetes。CRI的抽象,还有一项需要持续进行工作:将原先Kubernetes中对Docker引擎的直接调用去除,移动到称为docker-shim的适配层中去。

容器工具创新 镜像仓库创新——skopeo

几年前我们在Atomic项目中开发atomic命令行接口。其中一个功能是,我们希望能够有一个工具,当镜像还在镜像仓库的时候,就可以验证其中的内容。当时,唯一的变通方式是通过容器镜像关联的JSON文件将镜像拉取到本地,然后再通过docker inspect命令来读取镜像信息。这些镜像可能非常大,占用上G空间。有了这项功能,就能够让用户能够提前检查镜像内容,以确定是否需要拉取镜像,因此我们为docker inspect命令增加了一个--remote的参数。但是上游docker拒绝了这个pull request,原因是他们不希望将Docker命令行接口弄的复杂,并且用户可以通过自己的小工具来实现同样的功能。

Antonio Murdaca领导的我们团队,最终完成了名为skopeo的工具。Antonio将这个工具定位不仅局限于拉取镜像的配置文件,他还实现了将容器镜像从镜像仓库拉取到本地服务器,从本地服务器推送镜像到镜像仓库的双向协议。

目前,skopeo已经重度融入在atomic命令行接口中,包括检查容器更新、集成入atomic scan命令实现中等。Atomic也使用skopeo来拉取和推送镜像,而非使用上游的docker守护进程。

Containers/image库

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12978.html