Kubernetes cgroup配置

2023-11-30 78

Kubernetes cgroup驱动配置是Kubernetes中用于管理容器资源分配和限制的重要机制。通过配置cgroup驱动,可以对容器的资源使用进行精细的控制,从而实现更高效的资源利用和更好的性能优化。

学习本教程之前请阅读《Kubernetes容器运行时》。

接下来将详解如何配置 kubelet 的 cgroup 驱动以匹配 kubeadm 集群中的容器运行时的 cgroup 驱动。

一、容器运行时cgroup驱动配置

《Kubernetes容器运行时》中提到过,由于 kubeadm 把 kubelet 视为一个 系统服务来管理, 所以对基于 kubeadm 的安装, 我们推荐使用 systemd 驱动, 不推荐 kubelet 默认的 cgroupfs 驱动。本教程还详述了如何安装若干不同的容器运行时,并将 systemd 设为其默认驱动。

二、配置kubelet的cgroup驱动

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

注意:

  • 在版本 1.22 及更高版本中,如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段, kubeadm 会将它设置为默认值 systemd;
  • 在 Kubernetes v1.28 中,可以以 Alpha 功能启用 cgroup 驱动的自动检测。

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

# 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 驱动,必须显式声明它的值。 此方法应对的场景为:在将来某个版本的 kubeadm 中,不想使用默认的 systemd 驱动。

四、迁移到systemd驱动

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

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>,以 取消节点隔离。

在节点上依次执行上述步骤,确保工作负载有充足的时间被调度到其他节点。流程完成后,确认所有节点和工作负载均健康如常。

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

  • 广告合作

  • QQ群号:707632017

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。