Containerd 源码解析:(一)Containerd 整体架构简介

大家好,我是费益洲。Containerd 的架构设计核心目标是提供稳定、高效、可扩展的容器生命周期管理能力。在开始进行 Containerd 源码解析前,我们需要先对 Containerd 的整体架构有一个基础了解。本文依托 Containerd 官网的架构图,对 Contianerd 的整体架构做简单介绍。
Containerd 作为更上层容器平台(如 Docker、Kubernetes)与底层操作系统之间的坚实中间层。其整体架构清晰分层,官方架构图如下所示:

架构层次详解
1️⃣ Platform
🏛️ 经过多年的迭代和发展,Containerd 已被 Google Cloud Platform、Docker、IBM Cloud、Microsoft Azure、Alibaba Cloud 等云平台和容器平台广泛采用,作为底层的容器运行时标准。
2️⃣Client
🔖 Kubernetes 的核心组件 Kubelet,通过 CRI(容器运行时接口)来与 Containerd 进行交互。而 Docker、Pouch、BuildKit、ctr 都是直接使用 Go Containerd Client 与 Containerd 进行交互。
Pouch:阿里云的容器引擎 BuildKit:Docker 镜像构建引擎 ctr:Containerd 自带的命令行工具
3️⃣API
🔗 在平台层通过 Client 调用 Containerd 后,Containerd 主要通过两种方式接收请求:CRI 插件、GRPC API 接口。其中 CRI 插件式专门为 Kubernetes CRI 标准实现的适配层,而 GRPC API 接口则是提供统一的高性能的远程过程调用接口,并支持多种编程语言。
✋ Service Handlers 在 Contianerd 是很重要的一部分,它负责将客户端的请求路由到对应的核心服务中,再由具体的服务处理业务逻辑。
📈 除提供容器相关的的业务功能之外,Containerd 还内置了 Prometheus 格式的指标暴露接口,只需要在 Containerd 的配置文件中开启 Prometheus 指标监控,就可以获取容器运行的各个维度的监控数据。
4️⃣Core
⚙️ 具体的业务由各类核心服务进行处理,Containerd 的核心服务组件包括以下部分:
-
Container Service:管理容器的静态生命周期,如创建、启动、停止、删除等 -
Content Service:管理镜像的内容存储,包括上传、下载、删除等 -
Diff Service:计算文件系统的差异,用于镜像层之间的比较 -
Images Service:管理镜像的元数据,如镜像名称、标签、大小等 -
Leases Service:用于资源锁定,防止多客户端操作冲突 -
Namespaces Service:提供资源隔离,不同命名空间下的容器、镜像等资源相互隔离 -
Snapshots Service:管理容器的文件系统快照,基于不同驱动(如 overlayfs、btrfs 等)创建容器运行时的可写层 -
Tasks Service:负责管理容器的动态、活动的进程生命周期
这里需要区分下 Container Service 和 Tasks Service,这两个核心服务都和容器的生命周期息息相关,但是各自负责的具体内容有所差别:Containers Service 负责管理容器的静态定义和元数据(名称、配置、状态等),Tasks Service 负责管理容器的动态、活动的进程生命周期
🥡 核心层还包含元数据管理,依托数据库 BoltDB 来存储以上核心服务中需要使用的各类元数据以及所有的状态信息。
5️⃣Backend
📦 Content Store 是实际存储镜像内容的地方,采用内容寻址(content-addressable)的方式,通过内容的哈希值来索引
🐘 Snapshotter 管理容器的文件系统快照,支持多种存储驱动,如 overlayfs、btrfs、devicemapper、native(用于 Windows)等
🚀 Runtime 基于 shim 的运行时架构,它负责容器的实际运行。Containerd 通过 shim 来管理容器进程,每个容器由独立的 shim 进程管理。
6️⃣Containerd-Shim
💨 Containerd-Shim 是 Containerd 架构中一个极其关键且独特的组件。它不是一个庞大的服务,而是一个轻量级的守护进程,其核心设计哲学是解耦与稳定。
简单来说,shim 是位于 containerd 守护进程和实际容器进程之间的“中间人”或“托管代理”,支持的 Runtime 包括:
-
runc:标准的 OCI 运行时,用于 Linux 容器。 -
runhcs:用于 Windows 容器的运行时。 -
kata:一种安全容器运行时,通过轻量级虚拟机来运行容器。 -
Firecracker:一种微虚拟机管理程序,也可以作为安全容器的运行时。 -
gVisor:用户空间内核运行时
Containerd 的这种分层架构使其能够在保持核心功能稳定的同时,灵活适应不同的部署环境和需求,这也是它能够成为行业标准容器运行时的重要原因。
夜雨聆风
