参考:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/
配置容器运行时 cgroup 驱动
容器运行时页面提到: 由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装, 我们推荐使用 systemd 驱动,不推荐 cgroupfs 驱动。
配置 kubelet 的 cgroup 驱动
kubeadm 支持在执行 kubeadm init 时,传递一个 KubeletConfiguration 结构体。 KubeletConfiguration 包含 cgroupDriver 字段,可用于控制 kubelet 的 cgroup 驱动。
FEATURE STATE: Kubernetes v1.21 [stable]
说明: 如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段, kubeadm init 会将它设置为默认值 systemd。
这是一个最小化的示例,其中显式的配置了此字段:
# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta2
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。
迁移到 systemd 驱动
要将现有 kubeadm 集群的 cgroup 驱动就地升级为 systemd, 需要执行一个与 kubelet 升级类似的过程。 该过程必须包含下面两个步骤:
说明: 还有一种方法,可以用已配置了 systemd 的新节点替换掉集群中的老节点。 按这种方法,在加入新节点、确保工作负载可以安全迁移到新节点、及至删除旧节点这一系列操作之前, 只需执行以下第一个步骤。
修改 kubelet 的 ConfigMap
1.用命令 kubectl get cm -n kube-system | grep kubelet-config 找到 kubelet 的 ConfigMap 名称。
2.运行 kubectl edit cm kubelet-config-x.yy -n kube-system (把 x.yy 替换为 Kubernetes 版本)。
3.修改现有 cgroupDriver 的值,或者新增如下式样的字段:
cgroupDriver: systemd
该字段必须出现在 ConfigMap 的 kubelet: 小节下。
更新所有节点的 cgroup 驱动
对于集群中的每一个节点:
1.执行命令 kubectl drain <node-name> --ignore-daemonsets,以 腾空节点
2.执行命令 systemctl stop kubelet,以停止 kubelet
3.停止容器运行时
4.修改容器运行时 cgroup 驱动为 systemd
5.在文件 /var/lib/kubelet/config.yaml 中添加设置 cgroupDriver: systemd
6.启动容器运行时
7.执行命令 systemctl start kubelet,以启动 kubelet
8.执行命令 kubectl uncordon <node-name>,以 取消节点隔离
在节点上依次执行上述步骤,确保工作负载有充足的时间被调度到其他节点。
流程完成后,确认所有节点和工作负载均健康如常。