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)、启动业务容器。
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 → 轻量虚拟机(硬件级隔离)
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。