1.1 Containerd 概述

Containerd 是一个工业级标准的容器运行时,负责容器的生命周期管理、镜像传输与存储、网络与存储挂载等核心操作。它从 Docker 项目中剥离并捐赠给 CNCF,成为 Kubernetes 默认的容器运行时接口(CRI)实现之一。理解 Containerd 的起源、架构及其在 Kubernetes 中的角色,是进行版本迁移与流水线适配的基础。

1.1.1 起源与演进

Containerd 的诞生与 Docker 的架构拆分密切相关。2014 年 Docker 推出 1.0 版本后,其单体架构逐渐暴露出可维护性与性能瓶颈。2016 年,Docker 将核心容器管理逻辑抽取为独立的守护进程,即 Containerd,随后将其捐赠给 CNCF 基金会。这一拆分使得 Kubernetes 能够直接对接 Containerd,而不必依赖完整的 Docker Engine。

时间节点 关键事件 影响
2014 年 Docker 1.0 发布,单体架构 功能完整但耦合度高,升级风险大
2016 年 Containerd 从 Docker 中剥离 形成独立的容器运行时层
2017 年 Containerd 捐赠给 CNCF 成为中立开源项目,社区治理
2019 年 Kubernetes 1.20 弃用 Dockershim Containerd 成为默认 CRI 实现
2021 年 Kubernetes 1.24 移除 Dockershim Containerd 成为唯一内置 CRI 运行时
迁移提示: 如果你的集群仍在使用 Docker Engine 作为运行时,建议优先迁移至 Containerd。Kubernetes 1.24+ 已完全移除 Dockershim,继续使用 Docker 需要额外安装 cri-dockerd 适配器,增加运维复杂度。

1.1.2 架构设计

Containerd 采用模块化、插件化的分层架构,核心组件包括 gRPC API 层、核心服务层、存储层和底层运行时接口。下图展示了 Containerd 的内部组件及其与上层编排系统、底层操作系统的关系。

Containerd 架构组件图 Kubernetes / Docker CLI / ctr gRPC API 层(CRI / 命名空间) 核心服务层 容器生命周期 镜像管理 网络与存储 事件与指标 存储层(镜像仓库 / 快照器) 底层运行时接口(Shim / runc / kata) 说明:Shim 进程负责将 Containerd 与具体运行时(runc、kata、gVisor)解耦,支持热升级与多运行时共存

架构中的关键设计要点:

  • gRPC API 层:对外暴露 CRI(Container Runtime Interface)接口,兼容 Kubernetes 调用;同时提供命名空间隔离,支持多租户场景。
  • 核心服务层:包含容器生命周期管理(创建、启动、停止、删除)、镜像拉取与缓存、网络命名空间与存储卷挂载、事件流与 Prometheus 指标。
  • 存储层:通过快照器(Snapshotter)管理容器层文件系统,支持 overlayfs、devmapper、zfs 等后端;镜像仓库模块负责与 registry 交互。
  • Shim 层:每个容器对应一个独立的 Shim 进程,Containerd 重启不影响运行中的容器,这是实现零停机升级的关键机制。

1.1.3 与 Docker 的关系

Containerd 与 Docker 并非竞争关系,而是上下游依赖关系。Docker Engine 在 1.11 版本之后内部调用 Containerd 来管理容器,而 Docker CLI 和 Docker Compose 等上层工具仍然保留。下表对比了两者的核心差异:

维度 Docker Engine Containerd
定位 完整的容器平台(CLI + API + 运行时) 轻量级容器运行时(仅核心能力)
API 风格 RESTful API(Docker API) gRPC(CRI + 自有命名空间 API)
镜像构建 内置 build 功能(docker build) 不提供构建能力,需配合 buildkit
容器日志 json-file、journald 等驱动 通过 CRI 标准日志流输出
进程模型 单一大守护进程(dockerd) containerd + 多个 shim 进程
资源占用 较高(包含完整生态) 较低(仅运行时核心)
版本迁移要点: 从 Docker 切换到 Containerd 时,原有 docker run / docker-compose 命令无法直接使用。需要改用 ctr(Containerd 原生 CLI)或 nerdctl(兼容 Docker CLI 的第三方工具)。在 Kubernetes 环境下,kubelet 通过 CRI 直接调用 Containerd,用户无需手动操作容器运行时。

1.1.4 在 Kubernetes 中的角色

在 Kubernetes 架构中,Containerd 作为 CRI 实现,位于 kubelet 与底层操作系统之间。kubelet 通过 gRPC 调用 Containerd 的 CRI 接口,完成 Pod 沙箱创建、容器启动、镜像拉取、资源统计等操作。下图展示了 Containerd 在 Kubernetes 节点中的位置与数据流。

Containerd 在 Kubernetes 节点中的角色 kubelet CRI gRPC containerd Shim 进程(每个 Pod 一个独立 shim) 容器 A(Pod 1) 容器 B(Pod 2) 容器 C(Pod 3) 说明:kubelet 通过 CRI 接口调用 containerd,containerd 为每个 Pod 启动一个 shim 进程,shim 再调用 runc 创建容器

Containerd 在 Kubernetes 中的核心职责包括:

  1. Pod 沙箱管理:通过 CRI 的 RunPodSandbox / StopPodSandbox 接口,为 Pod 创建独立的网络与 PID 命名空间。
  2. 容器生命周期:CreateContainer / StartContainer / StopContainer / RemoveContainer,对应容器的完整生命周期。
  3. 镜像管理:PullImage / ListImages / RemoveImage,支持镜像层缓存与垃圾回收。
  4. 资源统计:ContainerStats / ListContainerStats,提供 CPU、内存、磁盘 I/O 等指标,供 kubelet 和 HPA 使用。
  5. 容器日志:通过 CRI 的 ReopenContainerLog 接口,配合 kubelet 日志轮转策略。
版本迁移风险提示: 不同版本的 Containerd 对 CRI API 版本的支持不同。Kubernetes 1.24+ 要求 Containerd 版本 ≥ 1.6.0,且 CRI API 版本为 v1。在迁移前务必检查 kubelet 日志中的 CRI 版本协商结果,避免因 API 版本不匹配导致节点不可用。

1.1.5 版本迁移与流水线适配的切入点

基于上述架构理解,Containerd 版本迁移与发布流水线适配主要涉及以下四个层面:

层面 迁移关注点 流水线适配动作
CRI API 版本 确认 kubelet 与 containerd 的 CRI 版本兼容性 在 CI 中增加 CRI API 版本检测步骤
快照器后端 overlayfs 与 devmapper 的迁移路径 自动化测试不同快照器下的容器启动性能
Shim 进程管理 containerd 重启对运行中容器的影响 集成 shim 存活检查与优雅升级脚本
镜像仓库配置 registry mirror、TLS 证书、认证方式 在流水线中注入仓库配置模板与验证