前言

本文主要会介绍笔者在学习Container Runtime时所总结的知识点,其中会涉及到低级Runtime、高级Runtime以及OCI方面的相关内容。 笔者也会将自己的理解在文中进行阐述,这也算是在和大家交流心得的一个过程。若文中有错误的理解和概念,请大家及时纠正;吸纳大家的建议,对于我来说也是很重要的学习过程之一。


(目录)


1.OCI(Open Container Initiative)

为了不使容器技术与Docker公司过度绑定,多个头部企业共同宣布成立开放容器项目(OCP),后更名为 OCI。 OCI 的主要目标是为容器生态系统定义统一的规范,以促进容器技术的互操作性和可移植性。

OCI关注两个主要方面:

  1. 容器运行时(Runtime Specification) OCI 制定了容器运行时的标准规范,即如何运行和管理容器。可以用于创建和运行符合 OCI 规范的容器。
  2. 容器镜像(Image Specification) OCI 还制定了容器镜像的标准规范,即容器镜像应该如何构建和组织。这个规范被用于定义容器镜像的文件格式和结构。

对于研发容器技术的企业和团队来说,推广OCI使得各个团体在实现Runtime时都会遵守同一套规范来实现容器操作,包括创建、启动、停止、创建快照、暂停、恢复等操作。这使得研发团队在开发Runtime时无需关心容器内容,对于容器进行标准操作执行后都能产生同样的效果。同时基于OCI规范实现的Runtime不受限于任何特定操作系统、硬件、CPU架构或公有云等可以运行在任何支持OCI的基础设施上。

对于开发者来将,开发者只要遵守OCI标准制作容器镜像以及对容器打包和签名一次就可以在大部分Runtime上运行该容器,这使得开发者可以将更多精力放在实现容器内容上。

由于OCI规范了容器的操作以及容器镜像的制作,因此依据这些容器标准化就可以更好的实施相关的容器自动化流水线。

注意: 容器运行时Container Runtime是容器领域的概念,而非Kubernetes的概念。


2.类型

Container Runtime按照级别可分为两类:低级Runtime和高级Runtime。

Tips: 这种分类方式类似于编程语言的级别分类方式(高级编程语言和底层编程语言)。

2.1 低级Runtime

低级Runtime只提供了容器生命周期管理的功能:

  1. 容器的创建和启动 包括准备容器的文件系统、配置容器的网络和其他资源。
  2. 容器隔离 确保容器之间的隔离,每个容器都有独立的文件系统、网络栈、进程空间等。 例如利用linux namespace和cgroups来实现。
  3. 资源管理和限制 容器运行时可以限制容器对系统资源(如 CPU、内存、磁盘等)的访问和使用,以防止容器过度占用资源影响其他容器或主机。
  4. 网络配置 容器运行时负责设置容器的网络配置,如 IP 地址、端口映射、网络策略等,以实现容器间和容器与主机之间的通信。
  5. 文件系统 容器运行时创建并管理容器的文件系统,可以基于镜像的分层文件系统来构建容器的文件系统。
  6. 容器的停止和删除 确保容器的资源得到适当释放,以及容器相关的文件系统和资源被清理。
  7. 容器监控和日志 记录容器的运行状态和性能指标,以及收集容器的日志信息。
  8. 容器的信号处理 容器运行时可以处理容器内部的信号,如终止信号、重启信号等。
  9. 容器的状态管理 容器运行时可以跟踪和管理容器的状态,包括运行状态、进程列表等。
  10. 卷管理 支持数据卷的创建和管理,用于容器和主机之间的数据共享。

低级Runtime不涉及容器运行时所依赖的镜像操作功能,比如拉取镜像。同时,也没有对外提远程供编程接口以方便其他应用集成。

低级Runtime典型的代表有:

  1. runc runc 是 Docker 项目的基础容器运行时。
  2. crun 一个轻量级的容器运行时,crun 的设计目标是更小巧和快速,适合一些特定的容器场景。
  3. runv 一个轻量级的容器运行时,与 runc 类似,但支持将容器运行在轻量级虚拟机中,从而实现更好的隔离性和安全性。

2.2 高级Runtime

High-Level.webp

高级Runtime能够提供三类功能:

  1. 容器生命周期管理 高级Runtime通过驱动低级Runtime来完成容器生命周期管理的功能。
  2. 容器管理API 高级Runtime还对外则提供了镜像拉取及基于 gRPC 接口的容器 CRUD 封装接口。 通常情况下,高级Runtime提供一个守护程序和一个API,远程应用程序可以使用它来运行容器并监控它们,它们位于低级Runtime或其他高级Runtime之上。
  3. 容器镜像管理 高级Runtime将专注于管理多个容器、传输和管理容器镜像以及将容器镜像加载和解压到低级Runtime。 高级Runtime负责容器镜像的传输和管理,解压镜像,并传递给低级Runtime来运行容器。

高级Runtime典型的代表为containerd。


3.CRI

scheduler.webp Container Runtime Interface是kubernetes提出的Container Runtime接口规范。

因为目前已有很多厂商提供了多种高级Container Runtime,kubernetes为了能够更好的对接这些高级Container Runtime(无需改动源码的情况下即可对接),因此提出了CRI。 有了CRI后,kubernetes在对接不同厂家的Container Runtime时,厂家的Container Runtime与kubernetes都无需改动双方的源码,仅需要厂家为其Container Runtime实现对应的CRI插件即可。kubernetes会通过CRI插件来调用Container Runtime。

CRI插件的演变史: v2-7b4cf968e76a2b41cd36a94ca812bfe0_720w.webp

Tips: 笔者这里之所以会提到kubernetes的CRI,是因为很多人会常常将这个概念与OCI概念搞混。OCI的作用是实现容器的标准化,使得容器技术的开发不再被垄断,所有人都可以参与进来;而CRI的作用是将kubernetes与Container Runtime进行解耦,使得kubernetes的可以更好的支持更多的Container Runtime,不会出现对单一Container Runtime的过度依赖。