当前位置: 首页 > 科技观察

为什么Kubernetes更喜欢使用Systemd作为CgroupDriver?

时间:2023-03-16 14:13:18 科技观察

什么是cgroupCgroup是Linux内核的一个特性,可以限制、审计和隔离一组进程的资源使用(CPU、内存、磁盘I/O、网络等)。cgroups(ControlGroups)是linux内核提供的一种机制。这种机制可以将一系列系统任务及其子任务按照需求整合(或分离)到不同的资源组中,从而为系统资源管理提供了一个统一的框架。简单来说,cgroups可以限制和记录任务组使用的物理资源。cgroups本质上是内核附加在程序上的一系列钩子,在程序运行时通过资源的调度触发相应的钩子,达到资源跟踪和限制的目的。什么是cgroupfsdocker默认的CgroupDriver是cgroupfs$dockerinfo|grepcgroupCgroup驱动:cgroupfsCgroup提供了原生接口,通过cgroupfs提供(从这句话可以知道cgroupfs是对Cgroup的接口封装)。类似于procfs和sysfs,是一个虚拟文件系统。而cgroupfs是可以挂载的,默认挂载在/sys/fs/cgroup目录下。什么是Systemd?Systemd也是Cgroup接口的包装器。systemd在系统启动时以PID1的形式运行,并提供一组系统管理守护进程、库和实用程序来控制和管理Linux计算机操作系统资源。为什么要用systemd而不是croupfs下面是kubernetes官方的话[1]:?当一个Linux系统发行版使用systemd[2]作为它的初始化系统时,初始化过程会生成并使用一个根控制组(cgroup),并作为作为cgroup经理。Systemd与cgroups紧密集成,将为每个systemd单元分配一个cgroup。您还可以配置容器运行时和kubelet以使用cgroupfs。将cgroupfs与systemd一起使用意味着将有两个不同的cgroups管理器。单个cgroup管理器将简化已分配资源的视图,并且默认情况下将具有更一致的可用资源和正在使用的资源视图。当两个管理器在一个系统中共存时,您最终会得到这些资源的两个视图。在这方面已经报告了一些案例,其中某些节点配置让kubelet和docker使用cgroupfs,而节点上运行的其余进程使用systemd;这些节点在资源压力下会变得不稳定。ubuntu系统、debian系统、centos7系统都使用systemd来初始化系统。systemd已经有一组cgroup管理器。如果containerruntime和kubelet使用cgroupfs,就会有两个cgroupmanager,cgroups和systemd。这意味着操作系统中存在两种资源分配视图。当操作系统上的CPU、内存等资源不足时,操作系统上的进程就会变得不稳定。我们可以简单地理解为一山难容二虎,一国只能一王。注意:请勿尝试修改集群中节点的cgroup驱动程序。如有必要,最好删除该节点并重新加入。如何修改dockerdefaultcgroupdriver加入"exec-opts":["native.cgroupdriver=systemd"]配置,重启docker$cat/etc/docker/daemon.json{"exec-opts":["native.cgroupdriver=systemd"],"registry-mirrors":["https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"],"max-concurrent-下载”:10,“日志驱动程序”:“json文件”,“日志级别”:“警告”,“日志选项”:{“最大大小”:“10m”,“最大文件”:"3"},"data-root":"/var/lib/docker"}Kubelet配置cgroup驱动参考官方[3]?注意:在1.22版本中,如果用户没有在KubeletConfiguration中设置cgroupDriver字段,kubeadminit会将其设置为默认systemd。#kubeadm-config.yamlkind:ClusterConfigurationapiVersion:kubeadm.k8s.io/v1beta3kubernetesVersion:v1.21.0---kind:KubeletConfigurationapiVersion:kubelet.config.k8s.io/v1beta1cgroupDriver:systemd然后使用kubeadminit$kubeadminit--configkubeadm-配置文件