Linux Cgroups
Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
在 Linux 中,Cgroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
查看linux支持哪些Cgroups
mount -t cgroup
ls /sys/fs/cgroup/cpu
如何使用Cgroups
1. cd /sys/fs/cgroup/cpu
2. mkdir container #创建一个控制组,这个目录就称为一个“控制组”
3. ls container/
4. 启动一个占用大量cpu的进程
while : ; do : ; done &
5. 向 container 组里的 cfs_quota 文件写入 20 ms(20000 us)
它意味着在每 100 ms 的时间里,被该控制组限制的进程只能使用 20 ms 的 CPU 时间,也就是说这个进程只能使用到 20% 的 CPU 带宽
echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
把被限制的进程的 PID 写入 container 组里的 tasks 文件,上面的设置就会对该进程生效
echo 226 > /sys/fs/cgroup/cpu/container/tasks
递归显示 Cgroups的内容
systemd-cgls #默认显示所有资源组
systemd-cgls cpu #显示指定资源的
Linux Cgroups 的设计还是比较易用的,简单粗暴地理解呢,它就是一个子系统目录加上一组资源限制文件的组合。而对于 Docker 等 Linux 容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了。
Docker Cgroups
对于 Docker 等 Linux 容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了
在这些控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定了,比如这样一条命令
docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash
在启动这个容器后,我们可以通过查看 Cgroups 文件系统下,CPU 子系统中,“docker”这个控制组里的资源限制文件的内容来确认
cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_period_us
100000
cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_quota_us #这就意味着这个 Docker 容器,只能使用到 20% 的 CPU 带宽。
20000
docker cgroup位置
docker的cgroup控制组是建立在docker文件夹下的
注意!不同情况时,路径会有所区别
未安装k8s,只有docker时路径:
/sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_period_us
已安装k8s时路径:
/sys/fs/cgroup/cpu/system.slice/docker-5d5c9f67d2fb8c8820dff8e837ef1a1dc7bd91232842a4984d2de8dc67b2638f.scope
kubernetes Cgroups
kubelet与linux cgroup交互
k8s的cgroup控制组是建立在kubepods.slice文件夹下的,实际上kubernetes yaml文件中的limits也就是通过这样的方式去实现的
这三个文件夹代表 Kubernetes 中的不同服务质量(QoS)类别的 Pod cgroups:
1. kubepods-besteffort.slice:包含所有被标记为“BestEffort”的Pod,这意味着这些Pod没有明确的资源请求或限制。
2. kubepods-burstable.slice:包含所有“Burstable”类型的Pod,这些Pod至少有一个容器有资源请求或限制,但不满足“Guaranteed”级别的要求。
3. kubepods-pod6014b081_627f_45df_a58f_e618196da944.slice:是一个特定Pod的cgroup目录,这个Pod的ID是6014b081-627f-45df-a58f-e618196da944。这个目录下包含了该Pod内所有容器的资源限制信息。
Kubernetes利用这些cgroup来实现对Pod资源使用的限制和隔离,确保每个Pod按照配置的资源限制运行。