1. 容器运行时概述

1.1 容器运行时定义

容器运行时(Container Runtime)是负责管理容器生命周期的基础软件组件,包括镜像拉取、容器创建、启动、停止、删除以及资源隔离等核心操作。从实现层次上,容器运行时通常分为两类:

  • 低级运行时(Low-level Runtime):直接与操作系统内核交互,通过 cgroups 和 namespace 实现资源隔离与限制,典型代表为 runc、runsc、Kata-runtime。
  • 高级运行时(High-level Runtime):在低级运行时之上提供镜像管理、gRPC 接口、存储挂载等能力,通常实现 CRI(Container Runtime Interface)协议,典型代表为 containerd、CRI-O。
关键理解:高级运行时负责"管理"容器,低级运行时负责"运行"容器。Kubernetes 通过 CRI 与高级运行时通信,高级运行时再调用低级运行时完成实际的容器进程创建。

1.2 主流容器运行时对比

下表从架构定位、CRI 支持、镜像管理、安全隔离等维度对比当前主流的容器运行时组件:

运行时 类型 CRI 原生支持 镜像管理 安全隔离 典型场景
Docker 高级(全栈) 需通过 cri-dockerd 适配 内置(containerd 镜像管理) 共享内核 开发环境、传统容器化
containerd 高级(CRI 原生) 原生内置 CRI 插件 内置(原生) 共享内核 Kubernetes 默认运行时
CRI-O 高级(CRI 专用) 原生实现 CRI 依赖外部(skopeo/podman) 共享内核 Kubernetes 轻量运行时
runc 低级 不支持 不支持 共享内核 OCI 规范参考实现
Kata Containers 低级(安全容器) 不支持(通过 containerd 集成) 不支持 轻量虚拟机隔离 多租户、强隔离需求

1.3 运行时在 Kubernetes 中的位置

在 Kubernetes 集群架构中,容器运行时位于 kubelet 与 操作系统内核 之间,是 Pod 生命周期管理的最终执行层。kubelet 通过 CRI(Container Runtime Interface)gRPC 协议调用运行时,运行时负责拉取镜像、创建容器沙箱(Sandbox)、启动业务容器。

Kubernetes 容器运行时架构分层 Kubernetes 容器运行时架构分层 Kubernetes 控制面(API Server / Scheduler / Controller Manager) Node 组件(kubelet / kube-proxy) CRI(Container Runtime Interface)gRPC 协议 高级运行时(containerd / CRI-O / cri-dockerd) 低级运行时(runc / runsc / Kata-runtime)→ 操作系统内核

1.4 运行时调用链与 CRI 适配

Kubernetes 自 v1.20 起逐步弃用 Docker 作为默认运行时,转而推荐 containerd 和 CRI-O。这一演进的核心驱动力是 CRI 标准化——所有符合 CRI 的运行时均可被 kubelet 直接调用,无需额外的适配器(如 cri-dockerd)。

架构演进要点:
  • v1.20 之前:kubelet → Docker Engine → containerd → runc(调用链长,Docker 作为适配层)
  • v1.20 之后:kubelet → containerd/CRI-O → runc(调用链短,原生 CRI 支持)
  • 安全容器场景:kubelet → containerd → Kata-runtime → 轻量虚拟机(硬件级隔离)
容器运行时调用链对比 容器运行时调用链对比 传统 Docker 调用链(v1.20 前) kubelet cri-dockerd(适配层) Docker Engine containerd runc(OCI 运行时) 现代 CRI 原生调用链(v1.20+) kubelet containerd / CRI-O runc(OCI 运行时) 优势对比 • 减少 2 层中间适配 • 原生 CRI 支持,无性能损耗 • 镜像管理更轻量

1.5 运行时选型建议

根据生产环境的不同需求,推荐以下运行时选型策略:

  • 通用生产集群:containerd(默认推荐,成熟稳定,Kubernetes 官方默认)
  • 轻量边缘集群:CRI-O(镜像体积小,资源占用低)
  • 多租户安全隔离:containerd + Kata Containers(硬件虚拟化隔离)
  • 兼容遗留 Docker 工具链:containerd + cri-dockerd(过渡方案)
注意:Docker 在 Kubernetes v1.24+ 中已完全移除 dockershim,如果仍使用 Docker Engine 作为运行时,必须部署 cri-dockerd 适配器。建议新集群直接采用 containerd 或 CRI-O。