决定开启一个有意思的系列,就是把CNCF(云原生计算基金会)的graduated(毕业)项目都介绍一下。
当然,这个系列对每个技术,只是简单的介绍。其中有些项目在云原生架构起重要支持作用,也有很多项目是你在云原生架构中一定要去学习和掌握的。
这个系列只是介绍,所以我用了走马观花这个词。后续我会规划对一些重点技术做详细的教程与讲解,比如gRPC,Docker Stack以及K8S等在云原生架构中大家需要掌握的架构功能点等。
先讲下第一个技术,容器运行引擎containerd吧。
一)
说起容器,对于现在的微服务或是云原生架构来说,使用容器来进行部署与管理服务,几乎已经是一种标准了。对于一个云原生架构来说,有两个技术是核心,一个是K8S,另一个就是容器技术。今天要讲的containerd,就是容器技术了。
对于容器技术,我们程序员接触最多的可能就是Docker了。相对而言,containerd大家知道的可能就没有Docker多了,可能有相当一部分人是第一次听说这个。
那先说下containerd是什么?它和Docker又有什么区别与联系,又与K8S有什么关系?
好,如果我用一个有趣的比喻来说,可能大家就会非常清楚与明白了,Linux操作系统与Linux内核的关系应该是程序员众所周知的。
而Docker与containerd的关系也是如此。containerd是容器内核引擎,Docker是containerd+更高层能力集,containerd是Docker中自带的容器引擎。更进一步的说,containerd其实就是Docker从自身中剥离出来并捐赠给CNCF。
为什么Docker要这样做?很多人可能会想把好的东西自己保存着不是更好么?当然不是,对于技术来说,与其将containerd封闭着给自己,还不如把它开放出来,让它成为一种标准,只要成为标准,才能把自己的生态做大,做强。
Docker不仅是把containerd捐献出来给CNCF,更进一步,它实现了K8S的CRI(Container Runtime Interface)规范
实现了K8S的CRI规范,则意味着它可以被K8S很好的支持与兼容。这就是为什么我们用的Docker镜像,能被K8S支持的原因所在。因为基于Docker制作出来的镜像,其实就是符合K8S CRI标准的containerd镜像。
二)
那containerd究竟有哪些能力,Docker又有哪些能力。
我画了一个图来概述它们的关系。
containerd的能力
containerd容器运行引擎究竟有哪些能力?我在这里简单的列一下它主要负责的功能吧
- 下载,存储,运行以及销毁镜像
- 基于cgroups,限制容器运行的资源限制(如CPU,内存等)
- 给镜像提供一个隔离的运行环境,避免容器之间,容器与host相互影响
- 映射与支持Linux能力给容器
- 给容器提供网络能力
好,这就有意思了,似乎Dcoker也是这些能力,那Docker在它之上究竟提供了什么进一步的能力?
Docker的额外能力
- docker CLI ,Docker命令工具,使用它运行各种容器命令
- docker hub,一个镜像仓库中心,支持上传,管理及查找下载容器。就和Java中的Maven仓库一样
- docker compose,docker swarm以及Docker Stack等高级功能,docker compose是在单机上运行多容器的能力,而docker swarm提供了容器编排能力,相较于K8S,它相对轻量级,适合中小型微服务项目;而docker stack则提供了声明式部署的容器管理能力。
所以,明白没,Docker本身就是基于containerd,容器运行核心能力是由containerd提供支持的。Docker当然在它之上,提供了更高级的能力。
三)
说起containerd,不能不说K8S了。
K8S是可以说是容器编排事实上的王者了。对于大规模容器使用,没有K8S,是很难管理与运营的,几乎可以说K8S是必备,甚至是在其中占据核心重要作用的能力了。
前些年,有一种说法,叫Docker被K8S抛弃了,K8S不再支持Docker了。
这当然不是事实,更准确的描述这个事情应该是,K8S提出了一个自己的标准,那就是CRI(Container Runtime Interface),K8S不再与具体的Docker等技术耦合绑定,而是依赖抽象的CRI标准,任何遵守与实现CRI标准的容器运行技术,都能在K8S中得到支持。
现在明白了吧,并不是Docker被抛弃,而是K8S进行了标准化。当然,Docker把自己的容器引擎独立出来,并且也实现了CRI标准。
只能说这是一个好事,大家都更标准了。当然,除了Docker的containerd之外,当然还有会其它一些也支持了这个CRI标准的,比如kata Containers,gVistor等,只不过这些我们可能听到的都比较少,更别说使用了。
由于Docker的强大的影响力与事实占据最大的比重,因为现在的现状是:
大家都仍然在使用Docker,而使用Docker制作的镜像就是continerd镜像,containerd是遵守K8S的CRI的标准,仍然可以在K8S中使用它
这仍然是完美的搭配,我们仍然一直是在使用Docker + K8S,只是过往和现在,背后的实现机制却已发生改变了。
现在你知道containerd是什么了吧,其实你可能并不需要直接与它打交道,当前最好的方式,仍然是学习与使用Docker以及K8S。
但你至少要知道,containerd在云原生架构中占有非常重要的地位。