容器运行时
您需要在集群中的每个节点上安装一个 容器运行时,以便 Pod 可以在那里运行。本页概述了相关内容,并描述了设置节点的相关任务。
Kubernetes 1.31 要求您使用符合 容器运行时接口 (CRI) 的运行时。
有关更多信息,请参阅 CRI 版本支持。
本页概述了如何在 Kubernetes 中使用几种常见的容器运行时。
注意
v1.24 之前的 Kubernetes 版本包括与 Docker Engine 的直接集成,使用名为 dockershim 的组件。这种特殊的直接集成不再是 Kubernetes 的一部分(该移除已在 v1.20 版本发布时 宣布)。您可以阅读 检查 Dockershim 移除是否会影响您 以了解此移除可能如何影响您。要了解有关从使用 dockershim 迁移的知识,请参阅 从 dockershim 迁移。
如果您运行的是除 v1.31 以外的 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 上,控制组 用于约束分配给进程的资源。
无论是 kubelet 还是底层容器运行时,都需要与控制组交互以执行 Pod 和容器的资源管理 并设置资源,例如 cpu/内存请求和限制。为了与控制组交互,kubelet 和容器运行时需要使用 cgroup 驱动程序。至关重要的是,kubelet 和容器运行时必须使用相同的 cgroup 驱动程序,并且配置一致。
有两个可用的 cgroup 驱动程序
cgroupfs 驱动程序
cgroupfs
驱动程序是 kubelet 中的默认 cgroup 驱动程序。使用 cgroupfs
驱动程序时,kubelet 和容器运行时将直接与 cgroup 文件系统交互以配置 cgroup。
当 systemd 是 init 系统时,不建议 使用 cgroupfs
驱动程序,因为 systemd 预期系统上只有一个 cgroup 管理器。此外,如果您使用 cgroup v2,请使用 systemd
cgroup 驱动程序,而不是 cgroupfs
。
systemd cgroup 驱动程序
当 systemd 被选为 Linux 发行版的 init 系统时,init 进程会生成和使用一个根控制组 (cgroup
),并充当 cgroup 管理器。
systemd 与 cgroup 紧密集成,并为每个 systemd 单元分配一个 cgroup。因此,如果您使用 systemd
作为 init 系统,并使用 cgroupfs
驱动程序,系统将获得两个不同的 cgroup 管理器。
两个 cgroup 管理器会导致系统中对可用资源和正在使用资源的两种不同视图。在某些情况下,配置为使用 cgroupfs
作为 kubelet 和容器运行时的节点,但使用 systemd
作为其他进程的节点,在资源压力下会变得不稳定。
缓解这种不稳定的方法是在选择 systemd 作为 init 系统时,将 systemd
用作 kubelet 和容器运行时的 cgroup 驱动程序。
要将 systemd
设置为 cgroup 驱动程序,请编辑 KubeletConfiguration
选项的 cgroupDriver
,并将其设置为 systemd
。例如
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
...
cgroupDriver: systemd
注意
从 v1.22 及更高版本开始,在使用 kubeadm 创建集群时,如果用户未在KubeletConfiguration
下设置 cgroupDriver
字段,kubeadm 会将其默认为 systemd
。如果您将 systemd
配置为 kubelet 的 cgroup 驱动程序,则还必须将 systemd
配置为容器运行时的 cgroup 驱动程序。有关说明,请参阅容器运行时的文档。例如
在 Kubernetes 1.31 中,启用 KubeletCgroupDriverFromCRI
特性门控 并且容器运行时支持 RuntimeConfig
CRI RPC 时,kubelet 会自动从运行时检测到适当的 cgroup 驱动程序,并忽略 kubelet 配置中的 cgroupDriver
设置。
警告
更改已加入集群的节点的 cgroup 驱动程序是一个敏感操作。如果 kubelet 使用一个 cgroup 驱动程序的语义创建了 Pod,则将容器运行时更改为另一个 cgroup 驱动程序可能会在尝试为这些现有 Pod 重新创建 Pod 沙盒时导致错误。重新启动 kubelet 可能无法解决此类错误。
如果您有可以实现自动化的工具,请用使用更新配置的另一个节点替换该节点,或使用自动化重新安装该节点。
在 kubeadm 管理的集群中迁移到 systemd
驱动程序
如果您希望在现有的 kubeadm 管理的集群中迁移到 systemd
cgroup 驱动程序,请按照 配置 cgroup 驱动程序 的步骤操作。
CRI 版本支持
您的容器运行时必须至少支持 v1alpha2 版本的容器运行时接口。
Kubernetes 从 v1.26 版本开始 仅与 v1 版本的 CRI API 一起工作。早期版本默认为 v1 版本,但是如果容器运行时不支持 v1 API,kubelet 会回退到使用(已弃用)的 v1alpha2 API。
容器运行时
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 驱动程序
要在 /etc/containerd/config.toml
中使用 runc
使用 systemd
cgroup 驱动程序,请设置
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".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 配置可能包含不兼容的配置参数。考虑使用 containerd config default > /etc/containerd/config.toml
重置 containerd 配置,如 getting-started.md 中所述,然后相应地设置上面指定的配置参数。
如果您应用了此更改,请确保重新启动 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.2"
更新配置文件后,您可能还需要重新启动 containerd
:systemctl restart containerd
。
请注意,kubelet 声明匹配的 pod-infra-container-image
是最佳实践。如果没有配置,kubelet 可能会尝试垃圾回收 pause
镜像。目前正在 containerd 中进行工作以固定 pause 镜像,不再需要 kubelet 上的此设置。
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
,在使用 CRI-O 与 cgroupfs
时,必须将其设置为 pod
值。通常需要使 kubelet(通常通过 kubeadm 完成)和 CRI-O 的 cgroup 驱动程序配置保持同步。
在 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.6"
此配置选项支持实时配置重新加载以应用此更改:systemctl reload crio
或通过向 crio
进程发送 SIGHUP
。
Docker Engine
注意
这些说明假设您正在使用cri-dockerd
适配器将 Docker Engine 集成到 Kubernetes 中。在您的每个节点上,请根据 安装 Docker 引擎 为您的 Linux 发行版安装 Docker。
安装
cri-dockerd
,请遵循文档安装部分中的说明。
对于 cri-dockerd
,CRI 套接字默认情况下为 /run/cri-dockerd.sock
。
Mirantis 容器运行时
Mirantis 容器运行时 (MCR) 是一种商业化的容器运行时,以前称为 Docker Enterprise Edition。
您可以使用 Mirantis 容器运行时与 Kubernetes,使用开源的 cri-dockerd
组件(包含在 MCR 中)。
要了解有关如何安装 Mirantis 容器运行时的更多信息,请访问 MCR 部署指南。
检查名为 cri-docker.socket
的 systemd 单位以找出 CRI 套接字的路径。
覆盖沙盒 (pause) 镜像
cri-dockerd
适配器接受一个命令行参数,用于指定要作为 Pod 基础设施容器(“pause 镜像”)使用的容器镜像。要使用的命令行参数是 --pod-infra-container-image
。
下一步
除了容器运行时,您的集群还需要一个有效的 网络插件。
此页面上的项目引用了由 Kubernetes 需要的功能的第三方产品或项目。Kubernetes 项目作者对这些第三方产品或项目不负责任。有关更多详细信息,请参阅 CNCF 网站指南。
在提出添加额外第三方链接的更改之前,您应该阅读 内容指南。