共计 2242 个字符,预计需要花费 6 分钟才能阅读完成。
前言
在波及到容器时你常常听到一个术语:容器运行时。每个人对这个术语都有不同的了解,即便在容器社区也是这种状况。这篇文章是这个系列文章的第一篇,它们别离是:
- 容器运行时介绍:为什么它们令人如此困惑?
- 深刻
Low-Level
运行时 - 深刻
High-Level
运行时 Kubernetes 运行时和 CRI
这篇文章将会介绍容器运行时是什么和为什么会让人如此困惑,而后深刻介容器运行时不同的类型,它们是如何工作的以及它们之间的不同点。
通常来说,一个计算机程序员可能将一个程序的运行周期了解为 ” 运行时 ”,或者是反对其运行的语言的特定实现,其中的一个例子是`Java HotSpot
运行时,后者更靠近 ” 容器运行时 ” 的概念。容器运行时负责一个容器运行的所有局部,而容器实际上并未在运行程序自身。正如咱们将从本系列文章中看到的那样,运行时实现了各个级别的性能个性,但实际上运行一个容器就是调用容器运行时所需的全副。
为什么容器让人如此困惑?
Docker 于 2013 年公布,它端到端地解决了开发者运行容器的诸多问题:
- 容器镜像格局
- 构建镜像的办法(
Dcokerfile/docker build
) - 治理容器镜像的办法(
Docker images, docker rm, etc
) - 治理容器实例的办法(
docker ps, docker rm, etc
) - 分享容器镜像的办法(
docker push/pull
) - 运行容器的办法(
docker run
)
在那时,Docker 是一个一体化的零碎,然而事实上这些性能个性彼此之间并没有相互依赖,它们中的每一个都能够在一个更小更专一的工具实现,每个工具都能够在一个通用的规范(容器规范)下一起应用。因为这个缘故,Docker,Google,CoreOS
以及其余的供应商一起创建了凋谢容器标准(OCI
),同时他们拆分了容器运行这部分的代码将其作为一个工具或 lib 库称之为 run c
, 而后捐献给OCI
作为 OCI
运行规范的参考范例。
最后,这使 Docker 对 OCI
的捐献感到困惑,他们捐献的是一个规范而不是运行容器的办法,其中并没有蕴含镜像格局或者镜像仓库拉取推送规定,当你运行一个 Docker 容器的时候,它们实际上通过了以下的步骤:
- 下载镜像
- 将镜像文件解开为
bundle
文件,将一个文件系统拆分成多层 - 从
bundle
文件运行容器
Docker 标准化的仅仅是第三步。在此之前,每个人都认为容器运行时反对 Docker 反对的所有性能。最终,Docker 方面廓清:原始 OCI 标准指出,只有“运行容器”的局部组成了runtime
。这种“概念失联”始终继续到明天,并使“容器运行时”成为一个令人困惑的话题。心愿我能证实单方都不是齐全谬误的,并且在本博文中将宽泛应用该术语。
Low-Level 和 High-Level 容器运行时
当人们想到容器运行时时,可能会想到许多示例。runc,lxc,lmctfy,Docker(containerd),rkt,cri-o
。这些中的每一个都是针对不同的状况而构建的,并实现了不同的性能。有些容器(例如 containerd
和cri-o
容器)实际上应用 runc 来运行容器,在 runc
之上实现了镜像治理和 API 接口。与 runc
的Low-Level
个性相比,您能够将这些性能(包含图像传输,图像治理,图像解压缩和 API)视为 High-Level
个性。思考到这点,能够看到容器运行时空间相当简单,每个运行时涵盖了从 Low-Level
到High-Level
的不同局部,这里有一张十分直观的图:
因而,从理论登程,通常只专一于正在运行的容器的 runtime 通常称为“Low-Level
容器运行时”,反对更多高级性能(如镜像治理和 gRPC / Web API
)的运行时通常称为“High-Level
容器运行时”,“High-Level
容器运行时”或通常仅称为“容器运行时”,我将它们称为“高级容器运行时”。值得注意的是,Low-Level
容器运行时和 High-Level
容器运行时是解决不同问题的、从根本上不同的事物。容器是通过 Linux nanespace
和Cgroups
实现的,Namespace
能让你为每个容器提供虚拟化系统资源,像是文件系统和网络,Cgroups
提供了限度每个容器所能应用的资源的如内存和 CPU 使用量的办法。在最低级别的运行时中,容器运行时负责为容器建设 namespaces
和cgroups
, 而后在其中运行命令,Low-Level
容器运行时反对在容器中应用这些操作系统个性。
通常状况下,开发人员想要运行一个容器不仅仅须要 Low-Level
容器运行时提供的这些个性,同时也须要与镜像格局、镜像治理和共享镜像相干的 API 接口和个性,而这些个性个别由 High-Level
容器运行时提供。就日常应用来说,Low-Level
容器运行时提供的这些个性可能满足不了日常所需,因为这个缘故,惟一会应用 Low-Level
容器运行时的人是那些实现 High-Level
容器运行时以及容器工具的开发人员。那些实现 Low-Level
容器运行时的开发者会说 High-Level
容器运行时比方 containerd
和cri-o
不像真正的容器运行时,因为从他们的角度来看,他们将容器运行的实现外包给了 runc
。然而从用户的角度来看,它们只是提供容器性能的单个组件,能够被另一个的实现替换,因而从这个角度将其称为runtime
依然是有意义的。即便 containerd
和cri-o
都应用runc
,然而它们是截然不同的我的项目,反对的个性也是十分不同的。