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)。 这种分层架构有助于解耦容器管理的各个方面,提高了灵活性和可维护性。

  1. 高级运行时 (High-level Runtime)

    • 功能:高级运行时主要负责容器镜像的管理、容器生命周期的管理以及与容器编排系统(如 Kubernetes)的交互。它们提供了一个更友好的接口,简化了容器的创建、启动、停止和删除等操作。

    • 代表Docker shimcontainerdCRI-O

    • 流程

      • 接收来自容器编排系统的指令(例如,创建容器)。
      • 从镜像仓库下载容器镜像。
      • 将镜像解压成 OCI 运行时文件系统包(filesystem bundle)。
      • 调用低级运行时来实际创建和运行容器。
      • 监控容器的生命周期,并向容器编排系统报告状态。
    • 例如,当你使用 docker run 命令时,Docker 守护进程(dockerd)会调用 containerd,然后 containerd 负责拉取镜像、创建容器的元数据,并最终调用 runC 来启动容器。

  2. 低级运行时 (Low-level Runtime)

    • 功能:低级运行时直接与操作系统内核交互,负责创建和管理容器的隔离环境,包括命名空间(namespaces)、控制组(cgroups)以及文件系统的挂载等。

    • 标准:遵循 OCI(Open Container Initiative)运行时规范(Runtime Specification),该规范定义了如何从 OCI 运行时文件系统包运行容器进程,并定义了容器的配置、运行环境和生命周期。

    • 代表runCkata-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,无需额外的适配层。
  1. 性能比较

kubernetes_CRI
https://mfzzf.github.io/2025/03/22/kubernetes-CRI/
作者
Mzzf
发布于
2025年3月22日
许可协议