深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
116705 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

06 | 白话容器基础(二):隔离与限制

隔离不彻底
敏捷性和高性能
实验演示
文件系统接口
限制进程资源
容器相对虚拟机的劣势
容器相对虚拟机的优势
宿主机操作系统统一管理
修改应用进程视图
容器与虚拟机的不一致问题
修复容器中的top指令和/proc文件系统信息
Cgroups的不完善之处
容器设计模式
容器是单进程模型
Linux Cgroups
容器与虚拟机对比
Namespace技术
思考题
总结
隔离与限制
容器基础知识

该思维导图由 AI 生成,仅供参考

你好,我是张磊。我今天和你分享的主题是:白话容器基础之隔离与限制。
在上一篇文章中,我详细介绍了 Linux 容器中用来实现“隔离”的技术手段:Namespace。而通过这些讲解,你应该能够明白,Namespace 技术实际上修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。
说到这一点,相信你也能够知道我在上一篇文章最后给你留下的第一个思考题的答案了:在之前虚拟机与容器技术的对比图里,不应该把 Docker Engine 或者任何容器管理工具放在跟 Hypervisor 相同的位置,因为它们并不像 Hypervisor 那样对应用进程的隔离环境负责,也不会创建任何实体的“容器”,真正对隔离环境负责的是宿主机操作系统本身:
所以,在这个对比图里,我们应该把 Docker 画在跟应用同级别并且靠边的位置。这意味着,用户运行在容器里的应用进程,跟宿主机上的其他进程一样,都由宿主机操作系统统一管理,只不过这些被隔离的进程拥有额外设置过的 Namespace 参数。而 Docker 项目在这里扮演的角色,更多的是旁路式的辅助和管理工作。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Linux容器的基础知识,重点讨论了容器的隔离和限制技术。通过Namespace技术,容器作为宿主机上的普通进程,但通过额外设置的Namespace参数实现隔离,从而具有高性能和敏捷性。然而,基于Linux Namespace的隔离机制也存在一些不足,如多个容器共享宿主机内核、无法彻底隔离等问题。另外,文章还介绍了Linux Cgroups用于限制容器内资源使用的技术,包括CPU、内存、磁盘、网络带宽等。Cgroups通过文件系统接口暴露操作接口,用户可以通过创建目录和配置文件来限制进程的资源使用。总的来说,本文通过简洁清晰的语言,深入浅出地介绍了Linux容器的基础知识,为读者快速了解容器技术提供了重要参考。 文章通过介绍Linux容器的基础知识,重点讨论了容器的隔离和限制技术,包括Namespace技术和Linux Cgroups。通过简洁清晰的语言,深入浅出地介绍了容器作为宿主机上的普通进程,但通过额外设置的Namespace参数实现隔离,以及Cgroups用于限制容器内资源使用的技术。同时,文章也指出了基于Linux Namespace的隔离机制存在的不足,以及Cgroups对资源的限制能力的不完善之处。这些内容为读者提供了全面了解容器技术的重要参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(198)

  • 最新
  • 精选
  • blackpiglet
    1 之前遇到过,但是没有考虑如何解决,临时抱佛脚,查了 lxcfs,尝试回答一下。top 是从 /prof/stats 目录下获取数据,所以道理上来讲,容器不挂载宿主机的该目录就可以了。lxcfs就是来实现这个功能的,做法是把宿主机的 /var/lib/lxcfs/proc/memoinfo 文件挂载到Docker容器的/proc/meminfo位置后。容器中进程读取相应文件内容时,LXCFS的FUSE实现会从容器对应的Cgroup中读取正确的内存限制。从而使得应用获得正确的资源约束设定。kubernetes环境下,也能用,以ds 方式运行 lxcfs ,自动给容器注入争取的 proc 信息。 2 用的是vanilla kubernetes,遇到的主要挑战就是性能损失和多租户隔离问题,性能损失目前没想到好办法,可能的方案是用ipvs 替换iptables ,以及用 RPC 替换 rest。多租户隔离也没有很好的方法,现在是让不同的namespace调度到不同的物理机上。也许 rancher和openshift已经多租户隔离。

    作者回复: 课代表出现了!

    2018-09-05
    11
    667
  • 三七
    /proc文件系统的问题我好像遇到过这个坑..当时在容器上运行的java应用,由于当时jvm参数没正确配置上,就用默认的,而容器设置的内存为4g,最后oom了,当时用命令查看容器的内存占用情况,竟然发现内存竟然有60多g。 那应该显示的是宿主机的内存了,jvm按照宿主机内存大小分配的默认内存应该大于4g 所以还没full gc 就oom了

    作者回复: 这个问题确实很普遍

    2018-09-10
    9
    97
  • 公众号:好奇心森林
    是不是可以理解:一个docker里面跑的进程都是docker这个进程的子进程?

    作者回复: 不。是entrypoint进程的子进程。docker基本上是旁路控制的作用。

    2018-09-07
    7
    69
  • monkey
    对cgroup有了更深的了解,作者能帮所有订阅的同学建个微信群方便大家交流心得吗?买的其他课程很多老师都建了交流群氛围挺好的哈。

    作者回复: 我跟编辑沟通一下

    2018-09-05
    31
    67
  • Bob
    请教个问题,cgroups除了限制资源上限,能否锁定下限?如果不能,那不是很容易被抢资源?

    作者回复: 只有上限。所以才需要kubernetes 来帮你做调度嘛。

    2018-09-06
    2
    53
  • 大魔王汪汪
    感觉理解了namespace和cgroup,自己也可以搞一个进程容器了

    作者回复: 所以docker公司其实一直很担心,他知道自己门槛不高

    2018-09-05
    6
    49
  • V V
    为什么说容器中无法同时运行两个不同的应用?实际上可以的。设置CMD参数为一个脚本,脚本中启动多个不同的进程。或者通过exec执行bash进入容器后,手动启动多个在后台运行的进程。

    作者回复: 试想一下,你这么运行起来的后台进程异常退出后,你如何知晓?由于没没有真正的init进程,贸然这么运行起来的孤儿进程是非常棘手的

    2018-09-07
    9
    35
  • 明珠
    老师,讲的太好了,言简易懂,每天都在期待新的一节课。 请教一个问题我们通常dockerpull下来的基础镜像比如:centos 7,这个镜像里面没有内核信息是吧?但是封装了systemd等进程管理工具,使得产生的新的进程都是一号进程的子进程,执行ping netstat命令,也会是这个容器一号进程的子进程? 老师这样理解对吗?

    作者回复: 没毛病

    2018-09-05
    4
    21
  • Joe Black
    既然容器都运行在同一个内核,我在两个容器里挂载了同一个本地目录 ,然后在一个容器里的该目录下建立一个子目录,用mount命令成功挂载远程的nfs到这个子目录上,但是在另一个容器里看还是空子目录,没有nfs服务里的内容。这该怎么解决?是不是我的方法就不对?

    作者回复: 你的mount操作都被隔离在一个容器里了,另一个怎么能看到呢?

    2018-09-05
    4
    18
  • 暮雨
    容器内部还能再做namespace和cgroup么?也就是容器中再做docker

    作者回复: 没问题。但是要挂载对应的文件系统,开启需要的权限。

    2018-09-08
    5
    17
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部