容器运行时

注意: 自 1.24 版本起,Dockershim 已从 Kubernetes 项目中移除。请阅读 Dockershim 移除常见问题解答以了解详情。

你需要在集群中的每个节点上安装一个 容器运行时,以便 Pod 可以在其上运行。本页面概述了相关内容,并描述了设置节点的任务。

Kubernetes 1.36 要求你使用符合 容器运行时接口 (CRI) 的运行时。

有关更多信息,请参阅 CRI 版本支持

本页面提供了关于如何将几种常见的容器运行时与 Kubernetes 一起使用的概述。

说明

v1.24 之前的 Kubernetes 版本包含与 Docker Engine 的直接集成,使用的是一个名为 dockershim 的组件。该特殊的直接集成不再是 Kubernetes 的一部分(该移除已作为 v1.20 版本的一部分发布)。你可以阅读 检查 Dockershim 移除是否影响你,以了解此移除可能对你产生的影响。要了解关于从 dockershim 迁移的信息,请参阅 从 dockershim 迁移

如果你运行的不是 v1.36 版本的 Kubernetes,请查看该版本的文档。

安装和配置前提条件

网络配置

默认情况下,Linux 内核不允许在接口之间路由 IPv4 数据包。大多数 Kubernetes 集群网络实现会(在需要时)更改此设置,但有些可能期望管理员为其完成。 (有些可能还期望设置其他 sysctl 参数、加载内核模块等;请咨询你特定网络实现的文档。)

启用 IPv4 数据包转发

手动启用 IPv4 数据包转发

# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

使用以下命令验证 net.ipv4.ip_forward 是否设置为 1

sysctl net.ipv4.ip_forward

cgroup 驱动程序

在 Linux 上,控制组 (cgroups) 用于限制分配给进程的资源。

kubelet 和底层的容器运行时都需要与控制组交互,以强制执行 Pod 和容器的资源管理,并设置如 cpu/内存请求和限制等资源。为了与控制组交互,kubelet 和容器运行时需要使用 cgroup 驱动程序。kubelet 和容器运行时使用相同的 cgroup 驱动程序且配置相同至关重要。

有两种可用的 cgroup 驱动程序

cgroupfs 驱动程序

cgroupfs 驱动程序是 kubelet 中的默认 cgroup 驱动程序。当使用 cgroupfs 驱动程序时,kubelet 和容器运行时直接与 cgroup 文件系统交互以配置 cgroups。

systemd 是初始化系统时,建议使用 cgroupfs 驱动程序,因为 systemd 期望系统上只有一个 cgroup 管理器。此外,如果你使用 cgroup v2,请使用 systemd cgroup 驱动程序而不是 cgroupfs

systemd cgroup 驱动程序

当选择 systemd 作为 Linux 发行版的初始化系统时,初始化进程会生成并消耗一个根控制组 (cgroup) 并充当 cgroup 管理器。

systemd 与 cgroups 紧密集成,并为每个 systemd 单元分配一个 cgroup。因此,如果你使用 systemd 作为初始化系统而使用 cgroupfs 驱动程序,系统就会有两个不同的 cgroup 管理器。

两个 cgroup 管理器会导致系统内可用资源和已用资源的两种视图。在某些情况下,为 kubelet 和容器运行时配置使用 cgroupfs,但为系统其余进程使用 systemd 的节点在资源压力下会变得不稳定。

缓解这种不稳的方法是,当选择 systemd 作为初始化系统时,将 systemd 用作 kubelet 和容器运行时的 cgroup 驱动程序。

要将 systemd 设置为 cgroup 驱动程序,请编辑 KubeletConfigurationcgroupDriver 选项并将其设置为 systemd。例如

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
...
cgroupDriver: systemd

说明

从 v1.22 及更高版本开始,在使用 kubeadm 创建集群时,如果用户没有在 KubeletConfiguration 下设置 cgroupDriver 字段,kubeadm 默认将其设置为 systemd

如果你为 kubelet 配置了 systemd 作为 cgroup 驱动程序,你也必须为容器运行时配置 systemd 作为 cgroup 驱动程序。请参阅你的容器运行时文档以获取说明。例如

在 Kubernetes 1.36 中,启用了 KubeletCgroupDriverFromCRI 特性门控,并且使用了支持 RuntimeConfig CRI RPC 的容器运行时,kubelet 会自动从运行时检测合适的 cgroup 驱动程序,并忽略 kubelet 配置中的 cgroupDriver 设置。

然而,旧版本的容器运行时(特别是 containerd 1.y 及更低版本)不支持 RuntimeConfig CRI RPC,可能无法正确响应此查询,因此 Kubelet 会回退到使用其自身 --cgroup-driver 标志中的值。

在 Kubernetes 1.37 中,这种回退行为将被弃用,旧版本的 containerd 将无法与较新的 kubelet 配合使用。

注意

更改已加入集群的节点的 cgroup 驱动程序是一个敏感操作。如果 kubelet 使用了一个 cgroup 驱动程序的语义创建了 Pod,将容器运行时更改为另一个 cgroup 驱动程序可能会在尝试为这些现有 Pod 重新创建 Pod 沙箱时导致错误。重启 kubelet 可能无法解决此类错误。

如果你有可行的自动化手段,请使用更新后的配置替换节点,或使用自动化工具重新安装它。

在 kubeadm 管理的集群中迁移到 systemd 驱动程序

如果你希望在现有的 kubeadm 管理的集群中迁移到 systemd cgroup 驱动程序,请遵循 配置 cgroup 驱动程序

CRI 版本支持

你的容器运行时必须支持 v1 版本的容器运行时接口。

Kubernetes 从 v1.26 开始 仅与 CRI API v1 版本一起工作。如果容器运行时不支持 v1 API,kubelet 将无法注册为节点。

容器运行时

注意: 本节链接到提供 Kubernetes 所需功能的第三方项目。Kubernetes 项目作者不对这些项目负责,项目按字母顺序排列。要将项目添加到此列表,请在提交更改之前阅读 内容指南更多信息。

containerd

本节概述了使用 containerd 作为 CRI 运行时的必要步骤。

要在你的系统上安装 containerd,请按照 containerd 入门 指南中的说明操作。在你创建了有效的 config.toml 配置文件后,返回此步骤。

你可以在路径 /etc/containerd/config.toml 下找到此文件。

你可以在路径 C:\Program Files\containerd\config.toml 下找到此文件。

在 Linux 上,containerd 的默认 CRI 套接字是 /run/containerd/containerd.sock。在 Windows 上,默认的 CRI 端点是 npipe://./pipe/containerd-containerd

配置 systemd cgroup 驱动程序

要使用 runc/etc/containerd/config.toml 中使用 systemd cgroup 驱动程序,请根据你的 Containerd 版本设置以下配置

Containerd 版本 1.x

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

Containerd 版本 2.x

[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc]
  ...
  [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]
    SystemdCgroup = true

如果你使用 cgroup v2,建议使用 systemd cgroup 驱动程序。

说明

如果你通过软件包(例如 RPM 或 .deb)安装了 containerd,你可能会发现 CRI 集成插件默认是禁用的。

你需要启用 CRI 支持才能将 containerd 与 Kubernetes 一起使用。确保 cri 没有包含在 /etc/containerd/config.toml 中的 disabled_plugins 列表中;如果你更改了该文件,也请重启 containerd

如果你在初始集群安装后或安装 CNI 后遇到容器崩溃循环,则包中提供的 containerd 配置可能包含不兼容的配置参数。考虑按照 getting-started.md 中的说明,使用 containerd config default > /etc/containerd/config.toml 重置 containerd 配置,然后相应地设置上面指定的配置参数。

如果你应用了此更改,请务必重启 containerd

sudo systemctl restart containerd

使用 kubeadm 时,请手动配置 kubelet 的 cgroup 驱动程序

在 Kubernetes v1.28 中,你可以将自动检测 cgroup 驱动程序作为 alpha 特性启用。有关更多详细信息,请参阅 systemd cgroup 驱动程序

覆盖沙箱(pause)镜像

在你的 containerd 配置 中,你可以通过设置以下配置来覆盖沙箱镜像

[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.k8s.io/pause:3.10"

更新配置文件后,你可能还需要重启 containerdsystemctl restart containerd

CRI-O

本节包含将 CRI-O 安装为容器运行时的必要步骤。

要安装 CRI-O,请遵循 CRI-O 安装说明

cgroup 驱动程序

CRI-O 默认使用 systemd cgroup 驱动程序,这很可能对你有效。要切换到 cgroupfs cgroup 驱动程序,请编辑 /etc/crio/crio.conf 或在 /etc/crio/crio.conf.d/02-cgroup-manager.conf 中放置一个插入式配置文件,例如

[crio.runtime]
conmon_cgroup = "pod"
cgroup_manager = "cgroupfs"

你还应该注意更改后的 conmon_cgroup,在使用带有 cgroupfs 的 CRI-O 时,它必须设置为值 pod。通常有必要保持 kubelet 的 cgroup 驱动程序配置(通常通过 kubeadm 完成)和 CRI-O 同步。

在 Kubernetes v1.28 中,你可以将自动检测 cgroup 驱动程序作为 alpha 特性启用。有关更多详细信息,请参阅 systemd cgroup 驱动程序

对于 CRI-O,CRI 套接字默认是 /var/run/crio/crio.sock

覆盖沙箱(pause)镜像

在你的 CRI-O 配置 中,你可以设置以下配置值

[crio.image]
pause_image="registry.k8s.io/pause:3.10"

此配置选项支持实时配置重新加载以应用此更改: systemctl reload crio 或向 crio 进程发送 SIGHUP

Docker Engine

说明

这些说明假设你正在使用 cri-dockerd 适配器将 Docker Engine 与 Kubernetes 集成。
  1. 在你的每个节点上,按照 安装 Docker Engine 的说明为你的 Linux 发行版安装 Docker。

  2. 按照文档安装部分的说明,安装 cri-dockerd

对于 cri-dockerd,CRI 套接字默认是 /run/cri-dockerd.sock

Mirantis Container Runtime

Mirantis Container Runtime (MCR) 是一种商用容器运行时,以前称为 Docker Enterprise Edition。

你可以使用 MCR 随附的开源 cri-dockerd 组件,将 Mirantis Container Runtime 与 Kubernetes 一起使用。

要了解有关如何安装 Mirantis Container Runtime 的更多信息,请访问 MCR 部署指南

检查名为 cri-docker.socket 的 systemd 单元,以找到 CRI 套接字的路径。

覆盖沙箱(pause)镜像

cri-dockerd 适配器接受命令行参数,用于指定使用哪个容器镜像作为 Pod 基础容器(“pause 镜像”)。要使用的命令行参数是 --pod-infra-container-image

接下来

除了容器运行时之外,你的集群还需要一个可工作的 网络插件


最后修改于 2026 年 2 月 8 日下午 5:27 (PST): 修复过时的 CRI 文档 (1969092f14)

此页面上的项目涉及提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者不对这些第三方产品或项目负责。有关详细信息,请参阅 CNCF 网站指南

在提出添加额外的第三方链接的更改之前,您应该阅读 内容指南