浅析容器技术实现原理之Cgroups

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按照配置的资源限制运行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值