你需要在集群中的每个节点上安装一个 容器运行时,以便 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 数据包转发
# 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
在 Linux 上,控制组 (cgroups) 用于限制分配给进程的资源。
kubelet 和底层的容器运行时都需要与控制组交互,以强制执行 Pod 和容器的资源管理,并设置如 cpu/内存请求和限制等资源。为了与控制组交互,kubelet 和容器运行时需要使用 cgroup 驱动程序。kubelet 和容器运行时使用相同的 cgroup 驱动程序且配置相同至关重要。
有两种可用的 cgroup 驱动程序
cgroupfs 驱动程序是 kubelet 中的默认 cgroup 驱动程序。当使用 cgroupfs 驱动程序时,kubelet 和容器运行时直接与 cgroup 文件系统交互以配置 cgroups。
当 systemd 是初始化系统时,不建议使用 cgroupfs 驱动程序,因为 systemd 期望系统上只有一个 cgroup 管理器。此外,如果你使用 cgroup v2,请使用 systemd cgroup 驱动程序而不是 cgroupfs。
当选择 systemd 作为 Linux 发行版的初始化系统时,初始化进程会生成并消耗一个根控制组 (cgroup) 并充当 cgroup 管理器。
systemd 与 cgroups 紧密集成,并为每个 systemd 单元分配一个 cgroup。因此,如果你使用 systemd 作为初始化系统而使用 cgroupfs 驱动程序,系统就会有两个不同的 cgroup 管理器。
两个 cgroup 管理器会导致系统内可用资源和已用资源的两种视图。在某些情况下,为 kubelet 和容器运行时配置使用 cgroupfs,但为系统其余进程使用 systemd 的节点在资源压力下会变得不稳定。
缓解这种不稳的方法是,当选择 systemd 作为初始化系统时,将 systemd 用作 kubelet 和容器运行时的 cgroup 驱动程序。
要将 systemd 设置为 cgroup 驱动程序,请编辑 KubeletConfiguration 的 cgroupDriver 选项并将其设置为 systemd。例如
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
...
cgroupDriver: systemd
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 可能无法解决此类错误。
如果你有可行的自动化手段,请使用更新后的配置替换节点,或使用自动化工具重新安装它。
systemd 驱动程序如果你希望在现有的 kubeadm 管理的集群中迁移到 systemd cgroup 驱动程序,请遵循 配置 cgroup 驱动程序。
你的容器运行时必须支持 v1 版本的容器运行时接口。
Kubernetes 从 v1.26 开始 仅与 CRI API v1 版本一起工作。如果容器运行时不支持 v1 API,kubelet 将无法注册为节点。
本节概述了使用 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 驱动程序。
在你的 containerd 配置 中,你可以通过设置以下配置来覆盖沙箱镜像
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause:3.10"
更新配置文件后,你可能还需要重启 containerd: systemctl restart containerd。
本节包含将 CRI-O 安装为容器运行时的必要步骤。
要安装 CRI-O,请遵循 CRI-O 安装说明。
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。
在你的 CRI-O 配置 中,你可以设置以下配置值
[crio.image]
pause_image="registry.k8s.io/pause:3.10"
此配置选项支持实时配置重新加载以应用此更改: systemctl reload crio 或向 crio 进程发送 SIGHUP。
cri-dockerd 适配器将 Docker Engine 与 Kubernetes 集成。在你的每个节点上,按照 安装 Docker Engine 的说明为你的 Linux 发行版安装 Docker。
按照文档安装部分的说明,安装 cri-dockerd。
对于 cri-dockerd,CRI 套接字默认是 /run/cri-dockerd.sock。
Mirantis Container Runtime (MCR) 是一种商用容器运行时,以前称为 Docker Enterprise Edition。
你可以使用 MCR 随附的开源 cri-dockerd 组件,将 Mirantis Container Runtime 与 Kubernetes 一起使用。
要了解有关如何安装 Mirantis Container Runtime 的更多信息,请访问 MCR 部署指南。
检查名为 cri-docker.socket 的 systemd 单元,以找到 CRI 套接字的路径。
cri-dockerd 适配器接受命令行参数,用于指定使用哪个容器镜像作为 Pod 基础容器(“pause 镜像”)。要使用的命令行参数是 --pod-infra-container-image。
除了容器运行时之外,你的集群还需要一个可工作的 网络插件。