k8s中Cgroup:systemd cgroupfs 区别
k8s中Cgroup:systemd cgroupfs 区别
对于cgroup的操作驱动,大多数linux发行版上,默认的驱动都为systemd
systemd与cgroupfs都是CGroup管理器。systemd是大多数Linux发行版原生的。当选择systemd作为Linux发行版的init system时,init proccess生成并使用root控制组
(/sys/fs/cgroup),并充当CGroup管理器。systemd与CGroup紧密集成,并为每个system unit分配一个CGroup。
简单了解到的两个驱动的区别:
cgroupfs是文件驱动修改,内核功能没有提供任何的系统调用接口,而是对 linux vfs 的一个实现,因此可以用类似文件系统的方式进行操作。
systemd封装了 cgroups 的软件也能让你通过它们定义的接口控制 cgroups 的内容,因此是通过接口调用驱动修改。
1 Cgroupfs
Cgroup提供了一个原生接口并通过cgroupfs提供(从这句话我们可以知道cgroupfs就是Cgroup的一个接口的封装)。类似于procfs和sysfs,是一种虚拟文件系统。并且cgroupfs是可以挂载的,默认情况下挂载在/sys/fs/cgroup目录。
可以看到这里有很多控制文件,其中以cpuset开头的控制文件都是cpuset子系统产生的,其他文件则由Cgroup产生。tasks文件记录了这个Cgroup的所有进程(包括线程),在系统启动后默认没有对Cgroup做任何配置的情况下,cgroupfs只有一个根目录,并且系统所有的进程都在这个根目录中,即所有进程pid都在根目录的tasks文件中,如下图所示:
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 KaTeX parse error: Expected 'EOF', got '#' at position 37: …set/demo/tasks #̲ 表示当前进程id
2 Systemd
Systemd也是对于Cgroup接口的一个封装。systemd以PID1的形式在系统启动的时候运行,并提供了一套系统管理守护程序、库和实用程序,用来控制、管理Linux计算机操作系统资源。通过systemd-cgls命令我们可以看到systemd工作的进程PID是1,而目录/sys/fs/cgroup/systemd是systemd维护的自己使用的非subsystem的cgroups层级结构。
Systemd限制CPU、内存的简单操作方法、
#限制计划任务的CPU占用为0.1个CPU,内存为200MB
systemctl set-property cron.service CPUShares=100 MemoryLimit=200M
3 Docker
通过docker-daemon.json文件可配置启动参数,修改对应的cgroupdriver=systemd
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4 K8s
更改kubelet的CGroup驱动(配置文件位于/var/lib/kubelet/config.yaml)
或者
vim /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS=“–cgroup-driver=systemd”
systemctl daemon-reload
systemctl restart kubelet
cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl daemon-reload
systemctl restart kubelet
更多推荐
所有评论(0)