深入刨析容器(三):容器的隔离与限制

这篇具有很好参考价值的文章主要介绍了深入刨析容器(三):容器的隔离与限制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker容器因为还是共用的宿主机的内核,看似隔离了,其实还是隔离不彻底,只不过是被宿主机隐藏的进程,但是容器却没有虚拟机似的那么大消耗,虽然“敏捷”、“高性能”是容器较于虚拟机最大的优势,但是隔离不彻底也是它的最大缺点,共享内核那么暴露也会越多,不安全性就会越多,还有很多的资源和对象是不能够被Linux的Namespace化的,如时间,如果容器调用系统函数修改了时间,那么宿主机也会进行时间的修改,这是不科学也是不安全,所以就要为容器做一个限制。

为什么需要对容器进行限制呢?

进程虽然隔离了,但是资源还是使用的是宿主机进行共享,如CPU、内存等等,那就会出现危险的事情,如容器的进程将宿主机的资源全部用光,然后宿主机全部的内容处理不了,所以这样危险的事情,一个未来成树的容器是绝对不允许的。

那么linux 的Cgroups就是linux内核用来为进程设置资源限制的一个功能,Namespace解决隔离性问题,cgroup解决了资源限制问题。

Linux Cgroups的全称是linux controller group:它最主要的作用就是限制一个进程组能够使用的资源上线,包括CPU、内存、磁盘、网络带宽等等。除此之外,Cgroups还能够对进程进行优先级设置、审计,以及将进程挂起和恢复等操作,不过本章只想讲“限制",看看他是如何限制进程使用的。

1.Cgroups实践

我们着重讲Cgroups的限制能力,我们可以实践操作一下来认识下Cgroups

在linux中Cgroups给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作接口是文件系统,以文件和目录的方式组织在操作系统的sys/fs/cgroup路径下,作者是Ubuntu 16.04 机器里,用mount指令把它们展示出来,这条命令是:

$ mount -t cgroup 
cpuset on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cpu on /sys/fs/cgroup/cpu type cgroup (rw,nosuid,nodev,noexec,relatime,cpu)
cpuacct on /sys/fs/cgroup/cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct)
blkio on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
memory on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
...

输出的结果是一系列文件系统目录,可以看到有一系列cpuset,cpu,cpucct,blkio,memory等目录也叫子系统,这些都是这台机器当前可以被 Cgroups 进行限制的资源种类,而在子系统对应的资源下可以对该类资源具体被限制的方法,指令如下:

$ ls /sys/fs/cgroup/cpu
cgroup.clone_children cpu.cfs_period_us cpu.rt_period_us  cpu.shares notify_on_release
cgroup.procs      cpu.cfs_quota_us  cpu.rt_runtime_us cpu.stat  tasks

对CPU的限制,cfs_period:可以用来限制进程在长度为 cfs_period 的一段时间。

cfs_quota:被分配的总量为cfs_quota的CPU时间,这两个参数需要组合使用。

配置文件又如何使用呢?

对应的子系统下面创建一个目录,比如,我们现在进入 /sys/fs/cgroup/cpu 目录下:

root@ubuntu:/sys/fs/cgroup/cpu$ mkdir container
root@ubuntu:/sys/fs/cgroup/cpu$ ls container/
cgroup.clone_children cpu.cfs_period_us cpu.rt_period_us  cpu.shares notify_on_release
cgroup.procs      cpu.cfs_quota_us  cpu.rt_runtime_us cpu.stat  tasks

这个目录就称为”控制组“,操作系统会在你新创建的container下,自动生成该子系统对应的限制资源文件。

我们在后台执行这样的一个脚本:

$ while : ; do : ; done &
[1] 226

这个进程PID是226,它执行了一个死循环,所以肯定是不会释放CPU,一直进行CPU的消耗,使用TOP指令查看CPU的状态:

$ top
%Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

CPU的使用率已经100了,这时我们可以去看我们在资源限制里的文件是没有任何限制,查看 container 目录下的文件,看到 container 控制组里的 CPU quota 还没有任何限制(即:-1),CPU period 则是默认的 100 ms(100000 us)

$ cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us 
-1
$ cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us 
100000

我们可以通过修改配置来进行资源的限制

像cfs_quota_us设置20ms(20000us),这个设置是在100MS的时间里,操作系统限制此进程只能使用20ms的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 

还是运行刚刚程序,用top指令再查询一下:

$ top
%Cpu0 : 20.3 us, 0.0 sy, 0.0 ni, 79.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

计算机的CPU使用被控制在了20%。

除 CPU 子系统外,Cgroups 的每一个子系统都有其独有的资源限制能力

  • blkio,为​​​块​​​设​​​备​​​设​​​定​​​I/O 限​​​制,一般用于磁盘等设备
  • cpuset,为进程分配单独的 CPU 核和对应的内存节点;
  • memory,为进程设定内存使用的限制。

那么Docker也是一样的操作,它只需要在子系统目录下创建一个控制组,启动容器之后把进程PID写入到task里就可以了,然后指定CPU的限制则可以在docker启动时指定参数,如:

$ docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash

总结:Cgroups主要是对进程资源的限制,毕竟不是虚拟机如果不加限制使用宿主机的资源可能会导致宿主机的事故,那么如何实现对进程资源的限制呢,按规定在指定好的文件目录及配置文件里配置下你对资源的限制即可。 

本文章学习深入剖析 Kubernetes-张磊而整理的笔记资料。文章来源地址https://www.toymoban.com/news/detail-485260.html

到了这里,关于深入刨析容器(三):容器的隔离与限制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker限制容器内存

    我们使用docker时,经常会遇到docker容器使用内存大于docker宿主机内存,导致宿主机奔溃,从而影响其他宿主机上容器的运行。 因此我们在使用docker容器的时候需要限制内存。 备注:命令详解 (1) 错误表现: (2)解决方案 (1)错误表现 (2)错误原因 ocker 默认没有启用memory-swap交换内

    2024年02月13日
    浏览(44)
  • Docker实战07|Docker增加容器资源限制

    上一篇文章中,讲解了Docker run的具体流程以及Docker是如何改变PID为1的底层原理。 具体文章可见《Docker就应该这么学-06》 有需要的小伙伴可以回顾一下。 接下来本文会详细介绍一下Docker 是如何增加容器的资源限制 获取代码 上一节中,已经可以通过命令行  docker run -ti 的方

    2024年02月02日
    浏览(36)
  • docker限制容器内存的方法

    在服务器中使用 docker 时,如果不对 docker 的可调用内存进行限制,当 docker 内的程序出现不可预测的问题时,就很有可能因为内存爆炸导致服务器主机的瘫痪。而对 docker 进行限制后,可以将瘫痪范围控制在 docker 内。 因此,本文将介绍使用 docker 进行容器内存限制的方法。

    2024年02月01日
    浏览(34)
  • Docker中如何限制容器可用的 CPU

    默认情况下容器可以使用的主机 CPU 资源是不受限制的。和内存资源的使用一样,如果不对容器可以使用的 CPU 资源进行限制,一旦发生容器内程序异常使用 CPU 的情况,很可能把整个主机的 CPU 资源耗尽,从而导致更大的灾难。本文将介绍如何限制容器可以使用的 CPU 资源。

    2024年02月09日
    浏览(37)
  • 【云原生】Docker容器资源限制(CPU/内存/磁盘)

    目录 ​编辑 1.限制容器对内存的使用 2.限制容器对CPU的使用 3.block IO权重 4.实现容器的底层技术 1.cgroup 1.查看容器的ID 2.在文件中查找 2.namespace 1.Mount 2.UTS 3.IPC 4.PID 5.Network 6.User 1.限制容器对内存的使用 ⼀个 docker host 上会运⾏若⼲容器,每个容器都需要 CPU、内存和 IO 资源。对

    2024年02月14日
    浏览(41)
  • 【Docker】限制已运行容器的Cpu和内存

    docker限制已运行容器的Cpu和内存 本文首发于 慕雪的寒舍 最近云服务器的内存经常不够用,而且是 莫名其妙 的增多,在腾讯云的控制台里面看,4g的内存占用了3.2g,就卡到连ssh都连不上了 PS: 已换过网络和设备,确认不是网络问题导致无法ssh 实在没辙了,只能把我的几个不

    2023年04月25日
    浏览(32)
  • Docker 基础知识解析:容器与传统虚拟化对比:资源利用、启动时间、隔离性和部署效率

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(33)
  • ubuntu 如何在docker容器内部查看允许使用的cpu详细信息以及管理员是否限制了docker容器可使用的cpu核心范围

    如题。最近在跑强化学习代码,发现自己的代码跑的好慢好慢好慢,怀疑是可使用的cpu数量被管理员限制了,于是去学习了一下如何查看docker容器中cpu的相关信息。 这将输出关于系统处理器的详细信息,包括每个 CPU 的数量、型号和速度。 在 Docker 容器中,默认情况下,可以

    2024年02月13日
    浏览(43)
  • 深入理解 Docker 容器卷

    Docker 容器卷是一种强大的功能,可以实现容器之间数据共享和持久化存储。本篇博客将介绍 Docker 容器卷的概念、用途和操作步骤,帮助读者更好地理解和使用容器卷。 容器卷是一种 Docker 提供的数据管理机制,于在容器和宿主机之间共享数据。 容器卷可以提供持久化存储,

    2024年02月16日
    浏览(25)
  • 【docker系列】深入理解 Docker 容器管理与清理

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年03月25日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包