第 7 章 操作容器

7.1. 了解容器

OpenShift Container Platform 应用程序的基本单元称为容器Linux 容器技术是一种轻量型机制,用于隔离运行中的进程,使它们只能跟指定的资源交互。

许多应用程序实例可以在单一主机上的容器中运行,而且相互之间看不到对方的进程、文件和网络等。通常,每个容器都提供单一服务(通常称为“微服务”),如 Web 服务器或数据库,但容器可用于任意工作负载。

多年来,Linux 内核一直在整合容器技术的能力。OpenShift Container Platform 和 Kubernetes 增加了在多主机安装之间编排容器的功能。

7.1.1. 关于容器和 RHEL 内核内存

由于 Red Hat Enterprise Linux(RHEL)行为,CPU 使用率高的容器可能比预期消耗的内存多。较高的内存消耗可能是由 RHEL 内核中的 kmem_cache 造成的。RHEL 内核为每个 cgroup 创建一个 kmem_cache。为添加性能,kmem_cache 包含 cpu_cache 以及任何 NUMA 节点的节点缓存。这些缓存都消耗内核内存。

保存在这些缓存中的内存量与系统使用的 CPU 数量成比例。因此,有大量 CPU 会导致更多的内核内存被保存在这些缓存中。这些缓存中有大量内核内存可导致 OpenShift Container Platform 容器超过配置的内存限值,从而导致容器被终止。

为了避免因为内核内存问题而丢失容器,请确保容器请求足够的内存。您可以使用以下公式来估算 kmem_cache 所消耗的内存数量,其中 nprocnproc 命令报告的可用处理单元数。容器请求的下限应该是这个值加上容器内存要求:

$(nproc) X 1/2 MiB

7.1.2. 关于容器引擎和容器运行时

容器引擎是处理用户请求的软件,包括命令行选项和镜像拉取。容器引擎使用 容器运行时 (也称为 较低级别的容器运行时 )来运行和管理部署和运行容器所需的组件。您可能需要与容器引擎或容器运行时交互。

注意

OpenShift Container Platform 文档使用 容器运行时 来引用低级别容器运行时。其他文档可以将容器引擎引用为容器运行时。

OpenShift Container Platform 使用 CRI-O 作为容器引擎,并运行C 或 crun 作为容器运行时。默认容器运行时为 runC。两个容器运行时遵循 开放容器项目(OCI) 运行时规格。

CRI-O 是 Kubernetes 的原生容器引擎实现,可与操作系统紧密集成来提供高效和优化的 Kubernetes 体验。CRI-O 容器引擎作为 systemd 服务在每个 OpenShift Container Platform 集群节点上运行。

runc 由 Docker 开发并由 Open Container Project 维护,它是一个轻量级、可移植的容器运行时,使用 Go. crun 编写,由红帽开发的快速且低内存容器运行时完全使用 C 编写。从 OpenShift Container Platform 4.12 开始,您可以选择两者。

重要

crun 容器运行时支持只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

crun 与 runC 相比有几个改进,包括:

  • 较小的二进制文件
  • 可以更快地进行处理
  • 内存占用较低

runc 与 crun 相比有一些优点,包括:

  • 最常用的 OCI 容器运行时。
  • 在生产环境更长。
  • CRI-O 的默认容器运行时。

您可以根据需要在两个容器运行时之间移动。

有关设置要使用的容器运行时的详情,请参考 创建一个 ContainerRuntimeConfig CR 来编辑 CRI-O 参数