Docker 和 kubelet 的 cgroup driver

在用minikube安装k8s的时候,有一个强烈的要求就是docker与kubelet的驱动,必须是保持一致的,需要都使用system或cgroupfs,一直搞不清这两个驱动的区别在哪。

首先当然要了解cgroup的概念;cgroups,其名称源自控制组群(control groups)的简写,是Linux内核主要用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS。可控制的资源主要包括CPU、内存、block I/O、网络带宽等等。cgroup 是将任意进程进行分组化管理的 linux 内核功能,cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构(各自的细节资源管控下的tasks文件记录了这个Cgroup的所有进程(包括线程))

现在的cgroups适用于多种应用场景,从单个进程的资源控制,到实现操作系统层次的虚拟化;

Cgroups是透过阶层式的方式来管理的,和程序、子群组相同,都会由它们的 parent 继承部份属性。然而,这两个模型之间有所不同

由于k8s官网推荐使用systmed(docker默认安装也是systemd)

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

 

 

 

 那么 systemd 和 cgroupfs 这两种驱动有什么区别呢?

1. systemd cgroup driver 是 systemd 本身提供了一个 cgroup 的管理方式,使用systemd 做 cgroup 驱动的话,所有的 cgroup 操作都必须通过 systemd 的接口来完成,不能手动更改 cgroup 的文件

2. cgroupfs 驱动就比较直接,比如说要限制内存是多少、要用 CPU share 为多少?直接把 pid 写入对应的一个 cgroup 文件,然后把对应需要限制的资源也写入相应的 memory cgroup 文件和 CPU 的 cgroup 文件就可以了

所以可以看出来 systemd 更加安全,因为不能手动去更改 cgroup 文件,当然我们也推荐使用 systemd 驱动来管理 cgroup。

 

 

 

 

 

 

 

posted on 2020-09-28 16:11  Cutecatkk  阅读(2884)  评论(0编辑  收藏  举报