配置 cgroup 驱动
本页介绍如何为 kubeadm 集群配置 kubelet 的 cgroup 驱动程序,使其与容器运行时 cgroup 驱动程序匹配。
开始之前
你应该熟悉 Kubernetes 容器运行时要求。
配置容器运行时 cgroup 驱动程序
容器运行时 页面解释说,对于基于 kubeadm 的设置,推荐使用 systemd
驱动程序,而不是 kubelet 默认的 cgroupfs
驱动程序,因为 kubeadm 将 kubelet 作为 systemd 服务 进行管理。
该页面还详细说明了如何为多种不同的容器运行时默认设置 systemd
驱动程序。
配置 kubelet cgroup 驱动程序
kubeadm 允许你在执行 kubeadm init
时传递一个 KubeletConfiguration
结构。这个 KubeletConfiguration
可以包含 cgroupDriver
字段,用于控制 kubelet 的 cgroup 驱动程序。
说明
在 v1.22 及更高版本中,如果用户未在 KubeletConfiguration
下设置 cgroupDriver
字段,kubeadm 会将其默认为 systemd
。
在 Kubernetes v1.28 中,你可以启用 cgroup 驱动程序的自动检测功能(这是一个 alpha 特性)。有关更多详细信息,请参阅systemd cgroup driver。
显式配置该字段的最小示例
# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta4
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
然后可以将此类配置文件传递给 kubeadm 命令
kubeadm init --config kubeadm-config.yaml
说明
Kubeadm 对集群中的所有节点使用相同的 KubeletConfiguration
。该 KubeletConfiguration
存储在 kube-system
命名空间下的一个 ConfigMap 对象中。
执行子命令 init
、join
和 upgrade
将导致 kubeadm 将 KubeletConfiguration
写入 /var/lib/kubelet/config.yaml
文件并将其传递给本地节点的 kubelet。
使用 cgroupfs
驱动程序
要使用 cgroupfs
并防止 kubeadm upgrade
修改现有设置上的 KubeletConfiguration
cgroup 驱动程序,你必须显式指定其值。这适用于你不想让未来版本的 kubeadm 默认应用 systemd
驱动程序的情况。
有关如何显式设置该值的详细信息,请参阅下面关于“修改 kubelet ConfigMap”的章节。
如果你想配置容器运行时使用 cgroupfs
驱动程序,你必须查阅所选容器运行时的文档。
迁移到 systemd
驱动程序
要将现有 kubeadm 集群的 cgroup 驱动程序从 cgroupfs
原地变更为 systemd
,需要执行类似于 kubelet 升级的过程。这必须包括下面概述的两个步骤。
说明
或者,可以将集群中的旧节点替换为使用systemd
驱动程序的新节点。这只需要在加入新节点之前执行下面的第一个步骤,并确保工作负载可以安全地迁移到新节点后再删除旧节点。修改 kubelet ConfigMap
调用
kubectl edit cm kubelet-config -n kube-system
。修改现有的
cgroupDriver
值,或者添加一个如下所示的新字段:cgroupDriver: systemd
此字段必须位于 ConfigMap 的
kubelet:
部分之下。
在所有节点上更新 cgroup 驱动程序
对于集群中的每个节点:
- 使用
kubectl drain <node-name> --ignore-daemonsets
排空节点 - 使用
systemctl stop kubelet
停止 kubelet - 停止容器运行时
- 将容器运行时 cgroup 驱动程序修改为
systemd
- 在
/var/lib/kubelet/config.yaml
中设置cgroupDriver: systemd
- 启动容器运行时
- 使用
systemctl start kubelet
启动 kubelet - 使用
kubectl uncordon <node-name>
解除节点封锁
在节点上一次执行一个步骤,以确保工作负载有足够的时间调度到不同的节点。
进程完成后,确保所有节点和工作负载都健康。