kubernetes_CRI
CRI 是 Kubernetes 定义的一组 gRPC 接口。它允许 kubelet(Kubernetes 的节点代理)与容器运行时(例如 Docker, containerd, CRI-O 等)进行通信。
CRI
定义
CRI 是 Kubernetes 定义的一组 gRPC 接口。它允许 kubelet与容器运行时(例如 Docker, containerd, CRI-O 等)进行通信。这种接口的设计目的是为了解耦 Kubernetes 和特定的容器运行时实现,使得 Kubernetes 可以支持多种容器运行时,而无需修改 Kubernetes 的核心代码。

容器运行时
容器运行时通常被分为两个主要层级:高级运行时(High-level Runtime)和低级运行时(Low-level Runtime)。 这种分层架构有助于解耦容器管理的各个方面,提高了灵活性和可维护性。
高级运行时 (High-level Runtime)
功能:高级运行时主要负责容器镜像的管理、容器生命周期的管理以及与容器编排系统(如 Kubernetes)的交互。它们提供了一个更友好的接口,简化了容器的创建、启动、停止和删除等操作。
代表:
Docker shim
、containerd
和CRI-O
流程:
- 接收来自容器编排系统的指令(例如,创建容器)。
- 从镜像仓库下载容器镜像。
- 将镜像解压成 OCI 运行时文件系统包(filesystem bundle)。
- 调用低级运行时来实际创建和运行容器。
- 监控容器的生命周期,并向容器编排系统报告状态。
例如,当你使用
docker run
命令时,Docker 守护进程(dockerd)会调用 containerd,然后 containerd 负责拉取镜像、创建容器的元数据,并最终调用 runC 来启动容器。
低级运行时 (Low-level Runtime)
功能:低级运行时直接与操作系统内核交互,负责创建和管理容器的隔离环境,包括命名空间(namespaces)、控制组(cgroups)以及文件系统的挂载等。
标准:遵循 OCI(Open Container Initiative)运行时规范(Runtime Specification),该规范定义了如何从 OCI 运行时文件系统包运行容器进程,并定义了容器的配置、运行环境和生命周期。
代表:
runC
、kata-runtime
等。流程:
- 接收来自高级运行时的指令和配置信息。
- 使用 Linux 内核的特性(如 namespaces 和 cgroups)来创建容器的隔离环境。
- 执行容器内的进程。
- 管理容器的资源限制。
深入理解 runC:
runC
是一个轻量级的、可移植的容器运行时工具,它是 Docker 的核心组件之一。它直接调用 Linux 内核的 API 来创建容器。runC
的主要功能包括:- 命名空间(Namespaces):为容器提供隔离的运行环境,包括 PID、网络、IPC、Mount、UTS 和 User namespaces。
- 控制组(Cgroups):限制容器可以使用的资源,如 CPU、内存、磁盘 I/O 等。
- 文件系统隔离:通过 chroot 或 pivot_root 将容器的文件系统与主机隔离。
- 能力(Capabilities):控制容器内进程可以执行的特权操作。
OCI(Open Container Initiative)
OCI 是一个开源项目,旨在制定容器格式和运行时的开放标准。OCI 定义了两个主要的规范:
- 镜像规范(Image Specification):定义了容器镜像的格式。
- 运行时规范(Runtime Specification):定义了如何运行容器。
通过遵循 OCI 标准,不同的容器运行时可以互操作,从而避免了厂商锁定。
开源运行时的比较
1. 整体架构
- Docker: 从图中可以看出,Docker 的架构相对复杂,涉及多个组件,包括 dockershim, docker, containerd。这使得 Docker 在 Kubernetes 中的集成略显笨重,维护和调试也相对复杂。
- Containerd: Containerd 的架构更为简洁,直接通过
cri-containerd
与 Kubernetes 集成,减少了中间环节,提高了效率和稳定性。Containerd 通过containerd-shim
与底层的 OCI 运行时交互,负责容器的生命周期管理。 - CRI-O: CRI-O 的设计目标是成为 Kubernetes 的专用容器运行时。它直接实现了 Kubernetes CRI (Container Runtime Interface),通过
conmon
监控容器进程,并使用 OCI 运行时 (如 runc) 创建和管理容器。
2. 关键组件
- dockershim: dockershim 是 Kubernetes 为了兼容 Docker 而引入的组件,它充当了 Docker 和 Kubernetes 之间的适配器。但 dockershim 的引入增加了维护成本,也限制了 Kubernetes 对其他容器运行时的支持。在 Kubernetes 1.24 版本中,dockershim 已被移除。
- containerd: Containerd 是一个 CNCF (Cloud Native Computing Foundation) 项目,它提供了一个工业标准的容器运行时。Containerd 专注于容器的生命周期管理、镜像分发和存储等核心功能。
- CRI-O: CRI-O 是一个轻量级的容器运行时,专门为 Kubernetes 设计。它只关注 Kubernetes 需要的功能,例如镜像拉取、容器创建、启动、停止和删除等。
- OCI Runtime: OCI (Open Container Initiative) 运行时,如 runc,是真正创建和运行容器的组件。它们负责与操作系统内核交互,完成容器的隔离、资源限制等操作。
3. 与 Kubernetes 的集成
- Docker: 通过 dockershim 集成,已被 Kubernetes 废弃。
- Containerd: 通过
cri-containerd
插件直接集成,是 Kubernetes 推荐的容器运行时。 - CRI-O: 原生支持 Kubernetes CRI,无需额外的适配层。

- 性能比较
