目录、参考文献

配置一个 cgroup 驱动

需要为 kubeadm 集群配置 kubelet 的 cgroup 驱动,使其与容器运行时的 cgroup 驱动匹配

前提条件

需要熟悉 Kubernetes 的容器运行时

配置容器运行时的 cgroup 驱动

基于 kubeadm 部署时,更推荐使用 systemd 驱动而不是 cgroupfs 驱动,详见容器运行时 因为 kubeadm 会将 kubelet 当做 systemd 服务进行管理

容器运行时中还提供了如何配置不同的容器运行时,使其默认使用 systemd 驱动的细节

配置 kubelet 的 cgroup 驱动

kubeadm 支持在执行 kubeadm init 时,传递一个 KubeletConfiguration 结构体KubeletConfiguration 包含 cgroupDriver 字段,可用于控制 kubelet 的 cgroup 驱动

说明: 在版本 1.22 中,如果用户没在 KubeletConfiguration 中设置 cgroupDriver 字段kubeadm init 会设置为默认值 systemd

一个最小化的示例,其中显式地配置了此字段

# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
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 驱动 必须显式声明它的值 显式声明使用 cgroupfs 后,kubeadm 不再默认使用 systemd 驱动

修改 kubelet 的 ConfigMap 描述了显式设置该值的方法

如果希望配置容器运行时使用 cgroupfs 驱动,需要参考所选容器运行时的文档

迁移到 systemd 驱动

要将现有 kubeadm 集群的 cgroup 驱动升级为 systemd 需要执行一个与 kubelet 升级类似的过程 该过程包含下面两个步骤:

说明: 还有一种方法,可以用已配置了 systemd 的新节点替换掉集群中的老节点 按这种方法,在加入新节点、确保工作负载可以安全迁移到新节点、删除旧节点一系列操作之前 只需执行下面的第一个步骤

1)修改 kubelet 的 ConfigMap

  • 运行 kubectl edit cm kubelet-config -n kube-system
  • 修改现有 cgroupDriver 的值,或者新增如下字段:
cgroupDriver: systemd

该字段必须出现在 ConfigMap 的 kubelet: 小节下

2)更新所有节点的 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>,以取消节点隔离

在节点上依次执行上述步骤,确保工作负载有充足的时间被调度到其它节点

流程完成后,确认所有节点和工作负载均健康


目录、参考文献