库 / SDK
cri-o/cri-o avatar
cri-o/cri-o

CRI-O 评估:Kubernetes 原生的轻量容器运行时接口实现

基于开放容器计划的 Kubernetes 容器运行时接口实现。

5,659 个 Star1,206 个 ForkGoApache-2.0

秒懂

它是什么?
CRI-O 是 Kubernetes 社区维护的 CRI 实现,直接对接 OCI 运行时。本文基于官方仓库信息,分析其架构、安装方式、维护成本与适用边界。
适合谁用?
CRI-O 适合已经在使用 OCI 运行时、希望减少容器引擎额外抽象层的 Kubernetes 集群,尤其是对镜像构建和 CLI 工具没有强依赖的团队。不适合需要完整容器工具链、或者依赖 Docker 特有功能的场景。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库在最近一天内有新的提交。
用什么语言写的?
主要是 Go(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决什么问题:Kubelet 与 OCI 运行时之间的翻译层

Kubernetes 的 Kubelet 通过 Container Runtime Interface 与容器运行时通信,但 CRI 是一组 gRPC 接口,不是具体实现。CRI-O 就是这个接口的 Go 语言实现,它让 Kubelet 能直接管理 OCI 兼容的运行时,比如 runc。换句话说,CRI-O 把 Kubelet 的调用翻译成 OCI 运行时能执行的操作,同时处理镜像下载、存储挂载和网络配置。它面向的是那些不想在 Kubelet 和 OCI 运行时之间再隔一层 Docker 或 containerd 的集群运维者。仓库文档明确说,它的范围严格绑定在 CRI 定义的边界内,不包含镜像构建、签名和推送。

架构拆解:四个 OCI 组件拼出运行时链路

从 README 列出的依赖看,CRI-O 的架构很清晰。运行时用 runc 或任何符合 OCI runtime-spec 的实现;镜像管理用 container-libs/image;存储层用 container-libs/storage 管理镜像层和 overlay 文件系统;网络通过 CNI 插件接入。这四个组件分别对应 CRI 的四个核心职责:进程生命周期、镜像拉取、层存储、网络配置。这种组合方式意味着 CRI-O 本身不重造轮子,而是把 OCI 生态里已有的库拼装起来。代价是,任何一个底层组件的更新都可能影响 CRI-O 的行为,升级时需要同时关注这些依赖的变化。

版本对应关系:跟着 Kubernetes 的小版本走,但补丁节奏不同

CRI-O 的版本号与 Kubernetes 对齐,小版本号一致,比如 v1.36.4 对 Kubernetes 1.36。但补丁版本不跟 Kubernetes 同步。Kubernetes 每月发补丁,CRI-O 只在必要时发。这意味着你的集群如果依赖 Kubernetes 的某个补丁修复,不能指望 CRI-O 同时发布对应补丁。文档还说明,CRI-O 遵循 Kubernetes 的 n-2 版本偏差策略,即只支持当前版本及前两个小版本。一旦某个 Kubernetes 版本进入 EOL,对应的 CRI-O 版本也被视为同样状态。实际部署前,必须查兼容矩阵,确认你的 Kubernetes 版本有对应的 CRI-O 维护分支。

安装与配置:从包安装到 CNI 网络设置

README 的安装部分没有给出具体命令,但提到了安装路径和配置方式。CRI-O 的配置通过 /etc/crio/crio.conf 文件管理,网络依赖 CNI 插件,配置位于 /etc/cni/net.d/。安装通常通过发行版包管理器进行,比如 Fedora 或 openSUSE 的仓库,或者使用 cri-o/packaging 仓库提供的打包脚本。启动后,Kubelet 通过 CRI 接口连接 CRI-O 的 socket,默认路径是 /var/run/crio/crio.sock。配置项包括 runtime、storage 驱动和网络插件类型。由于文档没有提供完整的安装命令,实际部署时需要参考官方安装指南或发行版文档。

HTTP 状态接口与指标:运维可观测性从哪来

CRI-O 提供了一个 HTTP status API,用于查询运行时状态。这不同于 CRI 本身的 gRPC 接口,是给运维人员用的。README 中提到了 Metrics 和 Tracing 两个小节,说明 CRI-O 支持 Prometheus 指标导出和分布式追踪。但文档没有给出具体的端点路径或指标列表。从仓库结构看,这些功能是内置的,不需要额外插件。对于生产环境,这些接口是判断运行时健康状态的关键手段。不过,文档没有说明这些接口的认证方式,所以暴露在公网前需要自己加防护。

明确不做的事:镜像构建和 CLI 工具都不在范围内

README 花了专门一节列出不在范围内的功能。第一是镜像构建、签名和推送,这意味着 CRI-O 只消费镜像,不生产镜像。第二是 CLI 工具,项目自带的 CLI 仅用于测试,不保证向后兼容。这对实际使用影响很大:你不能用 CRI-O 的命令行来调试或管理镜像,得依赖 crictl 或其他独立工具。文档还提到,CRI-O 支持多种镜像格式,包括 Docker 镜像格式,但支持不代表能构建。如果你的工作流依赖 docker build 或 podman build,那这部分得放在 CRI-O 之外。

维护与升级成本:手工编写的发布说明和按需补丁

CRI-O 的发布说明是手工编写的,持续发布在 GitHub Pages 上。这意味着每次升级前,你应该去阅读这些说明,而不是依赖自动生成的 changelog。补丁版本按需发布,可能一个月一次,也可能几个月一次。最近的发布记录显示 v1.36.4、v1.35.7 和 v1.34.12 在同一天更新,说明维护分支是同时活跃的。许可证是 Apache-2.0,这是一个宽松许可证,允许修改和再分发,但如果你修改了代码并分发,需要保留版权声明。项目没有提到商业支持,所以企业用户需要自己承担升级测试和故障排查的成本。

与 containerd 的对比:同是 CRI 实现,但定位不同

最常见的替代方案是 containerd,它同样实现了 CRI,但架构不同。containerd 自带一个完整的容器生命周期管理栈,包括自己的 CLI(ctr)和镜像管理工具。CRI-O 则刻意保持精简,把镜像构建和 CLI 都排除在外。这意味着 containerd 更适合需要独立于 Kubernetes 使用容器功能的场景,而 CRI-O 更适合纯粹作为 Kubernetes 的运行时组件。另一个区别是 CRI-O 直接依赖 OCI 运行时和 CNI,而 containerd 有自己的插件系统。如果你的团队已经熟悉 containerd 的工具链,迁移到 CRI-O 需要重新学习配置方式。反过来,如果你只需要一个最小的 CRI 实现,CRI-O 的依赖更少,理论上攻击面也更小。

编辑结论

CRI-O 适合已经在使用 OCI 运行时、希望减少容器引擎额外抽象层的 Kubernetes 集群,尤其是对镜像构建和 CLI 工具没有强依赖的团队。不适合需要完整容器工具链、或者依赖 Docker 特有功能的场景。采用前应核对 CRI-O 与 Kubernetes 的版本对应关系,确认你的 Kubernetes 版本在支持矩阵内,并检查当前使用的 CNI 插件是否兼容。同时要明确:项目不提供镜像构建、签名或推送功能,这些需要额外工具链。CRI-O 的维护节奏与 Kubernetes 解耦,补丁版本按需发布,所以升级计划应基于自身稳定性需求,而不是跟随 Kubernetes 的补丁周期。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社区笔记

社区笔记