cgroup driver设置为cgroupfs和systemd的区别

1、在说Cgroupfs与Systemd之间的区别之前,我们需要先了解一下什么是Cgroup?

Cgroup,全称Control Group(控制组),是Linux系统内核提供的一个特性(Linux 2.6.24内核开始将Cgroup加入主线),主要用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS。可控制的资源主要包括CPU、内存、block I/O、网络带宽等等。


2、什么是Cgroupfs?

Cgroup提供了一个原生接口并通过cgroupfs提供(从这句话我们可以知道cgroupfs就是Cgroup的一个接口的封装)。类似于procfs和sysfs,是一种虚拟文件系统。并且cgroupfs是可以挂载的,默认情况下挂载在/sys/fs/cgroup目录。

如下图所示,我们可以看到对应的总资源管理及细节的资源管理:

可以看到这里有很多控制文件,其中以cpuset开头的控制文件都是cpuset子系统产生的,其他文件则由Cgroup产生。tasks文件记录了这个Cgroup的所有进程(包括线程),在系统启动后默认没有对Cgroup做任何配置的情况下,cgroupfs只有一个根目录,并且系统所有的进程都在这个根目录中,即所有进程pid都在根目录的tasks文件中,如下图所示:


3、下面我们就来说一下Cgroupfs限制CPU、内存的简单操作方法:

#创建Cgrou,通过mkdir创建一个新的目录,也就是常见了一个新的Cgroup
mkdir /sys/fs/cgroup/cpuset/demo
#配置Cgrou,配置这个Cgroup的资源配额,通过以下命令,可以先哲这个Cgroup的进程只能在0号cpu上运行,并且只能在0号内存节点分配内存。
echo 0 > /sys/fs/cgroup/cpuset/demo/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/demo/cpuset.mems
#使能Cgroup,通过将进程id写进tasks文件,将整个进程移动到Cgroup中,Cgroup真正起作用了
echo $$ > /sys/fs/cgroup/cpuset/demo/tasks # $$表示当前进程id

4、什么是Systemd?

Systemd也是对于Cgroup接口的一个封装。systemd以PID1的形式在系统启动的时候运行,并提供了一套系统管理守护程序、库和实用程序,用来控制、管理Linux计算机操作系统资源。通过systemd-cgls命令我们可以看到systemd工作的进程PID是1,而目录/sys/fs/cgroup/systemd是systemd维护的自己使用的非subsystem的cgroups层级结构。


5、下面我们就来说一下Systemd限制CPU、内存的简单操作方法:

#限制计划任务的CPU占用为0.1个CPU,内存为200MB
systemctl set-property cron.service CPUShares=100 MemoryLimit=200M

6、总结说明

从以上的[Cgroupfs限制CPU、内存参考操作方法]及[Systemd限制CPU、内存参考操作方法]来看,相对来说Systemd更加简单,而且目前已经被主流Linux发行版所支持(Red Hat系列、Debian系列等),而且经过几个版本的迭代已经很成熟了,所以不管是Docker本身还是在K8S中建议使用Systemd来进行资源控制与管理,详细设置可以参考官方教程。

更多的关于Cgroup的资源管理,可以参考Red Hat 7的管理文档:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/index

希望以上回答对您有所帮忙,砖字不易,欢迎关注转发,谢谢!

在 Kubernetes 集群中,`kubelet` 启动失败并提示 `cgroup driver systemd vs cgroupfs mismatch with Docker` 错误,通常是由于 `kubelet` Docker 使用的 cgroup 驱动不一致导致的。cgroup(Control Groups)是 Linux 内核用于限制、记录隔离进程组资源使用的机制,Docker Kubernetes 均依赖于它来管理容器的资源。 ### 原因分析 - Docker 默认使用 `cgroupfs` 作为其 cgroup 驱动。 - `kubelet` 默认使用 `systemd` 作为其 cgroup 驱动。 - 如果两者配置不一致,则会导致 `kubelet` 无法正常启动,并抛出 `systemd vs cgroupfs mismatch` 错误[^2]。 ### 解决方案 #### 方法一:修改 kubelet 的 cgroup 驱动以匹配 Docker 1. 编辑 `kubelet` 的配置文件,通常位于 `/etc/default/kubelet` 或 `/etc/sysconfig/kubelet`(取决于系统发行版)。 2. 添加或修改以下环境变量: ```bash KUBELET_EXTRA_ARGS=--cgroup-driver=cgroupfs ``` 3. 保存文件后重启 `kubelet` 服务: ```bash systemctl daemon-reload systemctl restart kubelet ``` #### 方法二:修改 Docker 的 cgroup 驱动以匹配 kubelet 1. 编辑 Docker 的配置文件 `/etc/docker/daemon.json`。 2. 添加或修改以下内容: ```json { "exec-opts": ["native.cgroupdriver=systemd"] } ``` 3. 保存文件后重启 Docker 服务: ```bash systemctl restart docker ``` 4. 然后重启 `kubelet` 服务: ```bash systemctl restart kubelet ``` #### 方法三:使用 kubeadm 初始化时指定 cgroup 驱动 如果使用 `kubeadm` 初始化集群,可以在配置文件中指定 `cgroupDriver`: ```yaml apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration nodeRegistration: kubeletExtraArgs: cgroup-driver: systemd ``` 然后执行初始化命令: ```bash kubeadm init --config=kubeadm-config.yaml ``` ### 验证配置 确认 `kubelet` Docker 的 cgroup 驱动是否一致: 1. 查看 Docker 的驱动: ```bash docker info | grep -i cgroup ``` 2. 查看 `kubelet` 的驱动: ```bash ps -ef | grep kubelet ``` 应该能看到 `--cgroup-driver=systemd` 或 `--cgroup-driver=cgroupfs`。 确保两者一致后,`kubelet` 应该能够正常启动。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值