最近对CRI-O[2]进行了全面的安全审计。CRI-O 是 Kubernetes 容器运行时接口[3]的一种实现,在 Kubernetes 集群中用作核心组件,在每个节点上编排容器。 这是针对依赖 CRI-O 运行时的节点,有趣的是,该漏洞也存在于另一个流行的容器运行时 Containerd[4]中。 我们要感谢 CRI-O 维护者的合作。 审计和结果摘要 该审计项目的目标是对 CRI-O 的安全态势进行广泛分析,分为以下任务: CRI-O 的威胁模型形式化 代码的安全审计 CRI-O 的模糊测试集成,包括通过OSS-Fuzz[8]的持续模糊测试集成 CRI-O 的持续模糊测试集成 我们针对 CRI-O 基础设施集成了一个广泛的模糊测试套件。 参考 完整 PDF 报告:https://github.com/cri-o/cri-o/blob/main/security/2022_security_audit_adalogics.pdf CRI-O
00:00:00 nginx: master process nginx -g daemon off; 安装minikube 安装cri-o(以下步骤来自官方文档): 安装依赖库 yum install ,在编译CRI-O时可以指定Build-tag。 当前的CRI-O需要golang 12.x版本来编译 git clone https://github.com/cri-o/cri-o # or your fork cd cri-o make sudo 在cri-o的源码目录下执行如下步骤,启动CRI-O sudo make install.systemd sudo systemctl daemon-reload sudo systemctl enable Flannel Networking Demystify 6 Reasons why CRI-O is the best runtime for Kubernetes
“CRI-O的创始原则是'不重新发明轮子',而是使用共享组件并改进生产中测试过的方法,以及现有的经过实战检验的代码。” CRI-O是任何Kubernetes集群的构建块,可以根据Kubernetes CRI的要求促进容器的生命周期。” 在这项工作的基础上,开发了CRI-O项目(最初称为OCID),为Kubernetes提供轻量级运行时。 “我们期待支持和培养CRI-O社区作为顶级项目。” 有关CRI-O的更多信息,请到github.com/cri-o/cri-o。
比如 Docker, containerd, CRI, CRI-O, OCI, runc,本篇将介绍这些你听过但并不了解的术语,并解释容器生态系统是如何在一起工作的。 你可以使用你喜欢的 containerd 来运行你的容器,也可以使用 CRI-O 来运行你的容器,因为这两个运行时都实现了 CRI 规范。 CRI-O CRI-O 是另一个实现了容器运行时接口(CRI)的高级别容器运行时,可以使用 OCI(开放容器倡议)兼容的运行时,它是 containerd 的一个替代品。 CRI-O 诞生于 RedHat、IBM、英特尔、SUSE、Hyper 等公司。 这就是为什么有 CRI 和 OCI 标准,以及 containerd、runc 和 CRI-O 等项目存在的原因了。
随着时间的推移,直接使用 CRI 兼容的容器运行时(如 containerd 和 CRI-O)成为了更加高效和简洁的选择,因为这些运行时原生适配 CRI,无需额外的转换层。
Kubernetes已经使用CRI-O作为容器运行时。自然的它也推出了相应的命令行工具Crictl来调试CRI-O,管理Images, ps等。 当然,它也完全支持OpenShift, 您可以访问cri-o官网来了解更多。 Crictl是用来开发,测试,诊断容器运行时,同时也可以诊断Kubernetes的CRI-O的配置的工具。 Podman不跟CRI交互,也不直接跟CRI-O交互。然而,Podman像Buildah一样与CRI-O共享相同的后端数据存储。 ⚠️注意,Podman还没有和CRI-O共享用于识别container 的库,这也意味着,Podman并不能列出通过CRI-O创建的容器。 这跟CRI-O使用的库一样,因此CRI-O可以使用Podman拉取的容器镜像。
Cri-o/runc:令人惊讶的是,在所有 create/delete 中是最慢的,但在其他方面处于中等水平。 Cri-o/crun:在 create/delete 方面不是很好,但是在其他方面表现是最好的。 Containerd:表现非常好,几乎在所有情况下都可以快速响应。 Docker:在 create/delete 方面比 cri-o 快,但在 status/list 请求方面是最慢的。 status/list 请求是 cri 上最频繁的请求,所以这也是性能最重要的地方,cri-o 在这里似乎是更好的选择,其次就是 containerd。 的话我会优先选择 cri-o。
它允许 Kubernetes 使用各种容器运行时,例如 Docker、containerd、CRI-O 等。 使用案例 在 Kubernetes 中使用 CRI-O 场景描述:假设您正在设置一个 Kubernetes 集群,并决定使用 CRI-O 作为容器运行时。 步骤: 安装 CRI-O:首先,在您的集群的所有节点上安装 CRI-O。 sudo apt-get update sudo apt-get install cri-o 配置 Kubernetes 使用 CRI-O:确保 Kubernetes 通过修改 Kubelet 配置来使用 CRI-O。
“ https://github.com/containerd/containerd/ ” CRI-O CRI-O 是主要由 Red Hat 员工开发的 CRI 运行时。 相反,其只为容器环境提供 Podman、Buildah 以及 CRI-O。 “ https://github.com/cri-o/cri-o ” CRI-O 的优势在于其采用极简风格,或者说它的设计本身就是作为“纯 CRI”运行时存在。 不同于作为 Docker 组成部分的 containerd,CRI-O 在本质上属于纯 CRI 运行时、因此不包含除 CRI 之外的任何其他内容。 从 Docker 迁移至 CRI-O 往往更为困难,但无论如何,CRI-O 至少可以支持 Docker 容器在 Kubernetes 上的正常运行。
Kubernetes 需要的是一个专注于容器管理的轻量级工具,Containerd 和 CRI-O 更符合这一需求。 2. • dockershim 需要额外的工作来桥接 Kubernetes 和 Docker,而使用 Containerd 和 CRI-O 则可以简化架构,减少维护的复杂性。 4. Docker 自 2020 年以来已经不再是容器运行时的推荐标准,Containerd 和 CRI-O 被认为是 Kubernetes 最优的容器运行时选择。 集群配置简化: • 由于 Containerd 和 CRI-O 都是 Kubernetes 原生支持的容器运行时,弃用 dockershim 后,集群配置将变得更加简洁和一致。 容器运行时的更高性能: • Containerd 和 CRI-O 专注于容器的生命周期管理,去除了 Docker 中一些不必要的功能,因此它们更为轻量,性能更高。
CRI-O 维护者还在开发conmon的容器监控替代,称为 conmon-rs 并且纯用 Rust 编写。 /cri-o/server. /cri-o/server. /cri-o/server. 如果我们现在仔细查看这些 spans,可以看到 CRI-O 的日志正确地包含了相应的功能。
## CRI-O 成为 CNCF 托管项目 [CRI-O](https://github.com/cri-o/cri-o) 是基于 OCI 的 Kubernetes CRI 实现,旨在提供符合 OCI Kubernetes 就推出了容器运行时接口(CRI),这给了 kubelet 一种使用各种不同容器运行时的能力,现在最常用的当然还是 Docker,当然也有人使用 containerd、runc、CRI-O CRI-O 最初由 Red Hat 和 Google 开发,现在已达到稳定状态,且已有大量的贡献者,本次成为 CNCF 托管项目,也算是给容器运行时提供一个更大的可能。 附一张官方图: ?
在 Kubernetes 的 dockershim、cri-containerd、cri-o 三种实现中,RedHat 推崇的 cri-o 已经比较主流,它虽然仍是“套娃“,但已经比较精简。 ? 下面是从 kubernetes 集群运行的全景图看 cri-o 的位置: ? 如果是 kubelet 的 cri-o 模式(红色),则更加简练: kubelet从CRI的gRPC调用cri-o; cri-o调用OCI的实现runC 如果以 kubelet 调用 CRI 为起点,OCI 可与 containerd 同进程;cri-o 模式只有 1 个可执行程序。 显然在这种 Red Hat 推崇的 cri-o 模式下,Docker 体系的 containerd 也用不着了,只剩 runC 这个命令行的程序。
https://github.com/containerd/containerd/ CRI-O CRI-O 是主要由 Red Hat 员工开发的 CRI 运行时。 相反,其只为容器环境提供 Podman、Buildah 以及 CRI-O。 https://github.com/cri-o/cri-o CRI-O 的优势在于其采用极简风格,或者说它的设计本身就是作为“纯 CRI”运行时存在。 不同于作为 Docker 组成部分的 containerd,CRI-O 在本质上属于纯 CRI 运行时、因此不包含除 CRI 之外的任何其他内容。 从 Docker 迁移至 CRI-O 往往更为困难,但无论如何,CRI-O 至少可以支持 Docker 容器在 Kubernetes 上的正常运行。
例如,OpenShift 4.x自2019年6月以来一直在生产中使用CRI-O运行时。 对于其他示例和参考,您可以查看Cloud Native Computing Foundation(CNCF)下两个容器运行时容器化和cri-o的采用者。 containerd CRI-O 人们一直在引用OCI,是什么? OCI代表开放容器计划,该计划标准化了容器工具与技术之间的许多接口。 它们还以runc的形式维护运行时规范实际实现,这是containerd和CRI-O的基础默认运行时 。CRI建立在这些低级规范的基础上,以提供用于管理容器的端到端的标准。 有关如何在Kubernetes上使用容器化和CRI-O的说明,请参阅容器运行时上的Kubernetes文档。 如果我还有其他问题怎么办?
CRI-O是其中之一,这是去年在开放容器倡议(OCI)符合runtime和Kubernetes kubelets的一个整合路径。 CRI-O被设计成其他runtime选项的“slimmer”替代品。 Red Hat咨询工程师Daniel Walsh在CRI-O 1.0发布的博客文章中称,它不同于其他runtime选项,因为它不会尝试做太多事情。
CRI-O——如果你在网上搜索cri-o是什么东西,你可能会发现它被描述为一种容器引擎。不过,它实际上是一种容器运行时。除了不是容器引擎之外,它也不适合用于“一般”的情况。 前面我说过,CRI-O 实际上不是容器引擎,而是容器运行时。这是因为 CRI-O 没有提供诸如镜像推送之类的特性,而这些特性是容器引擎应该具备的。CRI-O 在内部使用 runc 来运行容器。 因此,除非你正在运行 Kubernetes 集群(或 OpenShift 集群——CRI-O 已经是默认设置了),否则不应该接触这个。 它是 Kubernetes 容器运行时接口的一个实现(与 CRI-O 一样),因此它是 Kubernetes 集群运行时的一个很好的候选对象。 它由 Red Hat 公司开发,可以与 Buildah、Podman 和 CRI-O 配套使用。
然而,Kubernetes 的架构允许它使用不同的容器运行时,包括 CRI-O 和 containerd 等。 为什么 Kubernetes 弃用 Docker? 直接使用 containerd 或 CRI-O 可以减少资源消耗,提高性能。 维护成本:Kubernetes 团队需要维护 dockershim 以保证与 Docker 的兼容性。 开发者仍然可以使用 Docker 来构建容器镜像,并通过 CRI-O 或 containerd 来运行这些镜像。 Q: 我需要做什么改变? A: 如果你在使用 Kubernetes 1.20 或更高版本,并且依赖于 Docker 作为容器运行时,需要切换到兼容 CRI 的运行时,如 containerd 或 CRI-O。 containerd 和 CRI-O 的广泛应用,将进一步提升 Kubernetes 集群的性能和稳定性。
“https://github.com/containerd/containerd/ ” CRI-O CRI-O 是主要由 Red Hat 员工开发的 CRI 运行时。 相反,其只为容器环境提供 Podman、Buildah 以及 CRI-O。 “https://github.com/cri-o/cri-o ” CRI-O 的优势在于其采用极简风格,或者说它的设计本身就是作为“纯 CRI”运行时存在。 不同于作为 Docker 组成部分的 containerd,CRI-O 在本质上属于纯 CRI 运行时、因此不包含除 CRI 之外的任何其他内容。 从 Docker 迁移至 CRI-O 往往更为困难,但无论如何,CRI-O 至少可以支持 Docker 容器在 Kubernetes 上的正常运行。
在Kubernetes中,常见的CRI包括Docker、containerd和CRI-O等。这些CRI实现了CRI标准API,并提供了一些额外的功能和扩展。 containerd还可以与其他容器运行时一起使用,例如CRI-O和rkt等。 CRI-O:CRI-O是一个专门为Kubernetes设计的容器运行时,它实现了CRI标准API,并提供了一些额外的功能和扩展。 CRI-O使用runc作为容器运行时引擎,可以与Kubernetes集成得非常好。rkt:rkt是一个安全的容器运行时,它提供了丰富的功能和安全特性,例如支持硬件隔离、数字签名验证和可信启动等。