深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
22715 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (5讲)
开篇词 | 打通“容器技术”的任督二脉
免费
01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐
02 | 预习篇 · 小鲸鱼大事记(二):崭露头角
03 | 预习篇 · 小鲸鱼大事记(三):群雄并起
04 | 预习篇 · 小鲸鱼大事记(四):尘埃落定
容器技术概念入门篇 (5讲)
05 | 白话容器基础(一):从进程说开去
06 | 白话容器基础(二):隔离与限制
07 | 白话容器基础(三):深入理解容器镜像
08 | 白话容器基础(四):重新认识Docker容器
09 | 从容器到容器云:谈谈Kubernetes的本质
Kubernetes集群搭建与实践 (3讲)
10 | Kubernetes一键部署利器:kubeadm
11 | 从0到1:搭建一个完整的Kubernetes集群
12 | 牛刀小试:我的第一个容器化应用
容器编排与Kubernetes作业管理 (15讲)
13 | 为什么我们需要Pod?
14 | 深入解析Pod对象(一):基本概念
15 | 深入解析Pod对象(二):使用进阶
16 | 编排其实很简单:谈谈“控制器”模型
17 | 经典PaaS的记忆:作业副本与水平扩展
18 | 深入理解StatefulSet(一):拓扑状态
19 | 深入理解StatefulSet(二):存储状态
20 | 深入理解StatefulSet(三):有状态应用实践
21 | 容器化守护进程的意义:DaemonSet
22 | 撬动离线业务:Job与CronJob
23 | 声明式API与Kubernetes编程范式
24 | 深入解析声明式API(一):API对象的奥秘
25 | 深入解析声明式API(二):编写自定义控制器
26 | 基于角色的权限控制:RBAC
27 | 聪明的微创新:Operator工作原理解读
Kubernetes容器持久化存储 (4讲)
28 | PV、PVC、StorageClass,这些到底在说啥?
29 | PV、PVC体系是不是多此一举?从本地持久化卷谈起
30 | 编写自己的存储插件:FlexVolume与CSI
31 | 容器存储实践:CSI插件编写指南
Kubernetes容器网络 (8讲)
32 | 浅谈容器网络
33 | 深入解析容器跨主机网络
34 | Kubernetes网络模型与CNI网络插件
35 | 解读Kubernetes三层网络方案
36 | 为什么说Kubernetes只有soft multi-tenancy?
37 | 找到容器不容易:Service、DNS与服务发现
38 | 从外界连通Service与Service调试“三板斧”
39 | 谈谈Service与Ingress
Kubernetes作业调度与资源管理 (5讲)
40 | Kubernetes的资源模型与资源管理
41 | 十字路口上的Kubernetes默认调度器
42 | Kubernetes默认调度器调度策略解析
43 | Kubernetes默认调度器的优先级与抢占机制
44 | Kubernetes GPU管理与Device Plugin机制
Kubernetes容器运行时 (3讲)
45 | 幕后英雄:SIG-Node与CRI
46 | 解读 CRI 与 容器运行时
47 | 绝不仅仅是安全:Kata Containers 与 gVisor
Kubernetes容器监控与日志 (3讲)
48 | Prometheus、Metrics Server与Kubernetes监控体系
49 | Custom Metrics: 让Auto Scaling不再“食之无味”
50 | 让日志无处可逃:容器日志收集与管理
再谈开源与社区 (1讲)
51 | 谈谈Kubernetes开源社区和未来走向
答疑文章 (1讲)
52 | 答疑:在问题中解决问题,在思考中产生思考
特别放送 (1讲)
特别放送 | 2019 年,容器技术生态会发生些什么?
结束语 (1讲)
结束语 | Kubernetes:赢开发者赢天下
特别放送 | 云原生应用管理系列 (1讲)
基于 Kubernetes 的云原生应用管理,到底应该怎么做?
深入剖析Kubernetes
登录|注册

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

张磊 2018-09-05
你好,我是张磊。我今天和你分享的主题是:白话容器基础之隔离与限制。
在上一篇文章中,我详细介绍了 Linux 容器中用来实现“隔离”的技术手段:Namespace。而通过这些讲解,你应该能够明白,Namespace 技术实际上修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容。但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。
说到这一点,相信你也能够知道我在上一篇文章最后给你留下的第一个思考题的答案了:在之前虚拟机与容器技术的对比图里,不应该把 Docker Engine 或者任何容器管理工具放在跟 Hypervisor 相同的位置,因为它们并不像 Hypervisor 那样对应用进程的隔离环境负责,也不会创建任何实体的“容器”,真正对隔离环境负责的是宿主机操作系统本身:
所以,在这个对比图里,我们应该把 Docker 画在跟应用同级别并且靠边的位置。这意味着,用户运行在容器里的应用进程,跟宿主机上的其他进程一样,都由宿主机操作系统统一管理,只不过这些被隔离的进程拥有额外设置过的 Namespace 参数。而 Docker 项目在这里扮演的角色,更多的是旁路式的辅助和管理工作。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(128)

  • 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
    1
    216
  • Jeff.W
    可怜的容器,被Namespace欺骗,又被Cgroups限制,在这样的环境下,还发挥着自己生命的意义-与应用程序同生命周期,同生共死~
    2018-09-13
    1
    86
  • monkey
    对cgroup有了更深的了解,作者能帮所有订阅的同学建个微信群方便大家交流心得吗?买的其他课程很多老师都建了交流群氛围挺好的哈。

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

    2018-09-05
    6
    37
  • snakorse
    不太明白,既然都是用的宿主内核,那容器内还有不同的操作系统(centos,ubuntu)之分吗?如果有,那是如何做到的呢?
    2018-09-05
    1
    32
  • atompi
    1. 把宿主机的 /var/lib/lxcfs/proc/* 文件挂载到容器的/proc/*
    2. 既然有人提到了Windows运行容器的疑问,那就从这里说开。虚拟机可以通过vbox、VMware、Hyper-V直接运行在各种支持虚拟化的操作系统上,而 Linux 容器只能运行在Linux内核的操作系统之上,而且内核版本也有所限制(详见namespace、Cgroups在Linux内核中的发展史)。对于前面仁兄所说的Docker可以在Windows10上运行,并不是直接运行在Windows操作系统中,而是通过Hyper-V的支持,借助docker-machine,相当于是在Linux内核的虚拟机上运行的容器,实际上还是跑在Linux内核之上。
    2018-09-05
    26
  • 天秤vs永恒
    对 Namespace 和 Cgroups 的理解又加深了很多!
    2018-09-05
    17
  • 三七
    /proc文件系统的问题我好像遇到过这个坑..当时在容器上运行的java应用,由于当时jvm参数没正确配置上,就用默认的,而容器设置的内存为4g,最后oom了,当时用命令查看容器的内存占用情况,竟然发现内存竟然有60多g。 那应该显示的是宿主机的内存了,jvm按照宿主机内存大小分配的默认内存应该大于4g 所以还没full gc 就oom了

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

    2018-09-10
    15
  • lesliexlxiao
    参照老师的教程在 /sys/fs/cgroup/cpu 下建立了 container 目录,做完实践想删除该文件夹。
    执行:rm -rf container/
    报错:cannot remove ‘container/cpu.rt_period_us’: Operation not permitted
    执行:lsattr
    报错:lsattr: Inappropriate ioctl for device While reading flags on ./container
    请教下老师,该如何删除该目录。为什么现在 root 权限也删除不了该目录呢
    2018-09-21
    4
    14
  • 把复杂的问题讲得如此简单易懂,这才叫专家,👍
    2018-09-14
    11
  • A-
    这篇文章写的真不错,终于明白cgroup是干嘛的了。再有,我能在这里打招聘广告吗?

    作者回复: 不太好,这里还是交流技术为主

    2018-09-05
    10
  • paingain
    是不是可以理解:一个docker里面跑的进程都是docker这个进程的子进程?

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

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

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

    2018-09-08
    7
  • 淸曉
    运行完docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash
    并没有在容器里和外面的/sys/fs/cgroup/cpu/ 找到docker/ 目录。
    容器里:
    root@21e3e814d573:/# cat /sys/fs/cgroup/cpu/
    cgroup.clone_children cpu.shares
    cgroup.event_control cpu.stat
    cgroup.procs cpuacct.stat
    cpu.cfs_period_us cpuacct.usage
    cpu.cfs_quota_us cpuacct.usage_percpu
    cpu.rt_period_us notify_on_release
    cpu.rt_runtime_us tasks

    容器外:
    [root@adsl-172-0-194-80 ~]# cat /sys/fs/cgroup/cpu/
    cgroup.clone_children cpu.rt_period_us
    cgroup.event_control cpu.rt_runtime_us
    cgroup.procs cpu.shares
    cgroup.sane_behavior cpu.stat
    container/ notify_on_release
    cpuacct.stat release_agent
    cpuacct.usage system.slice/
    cpuacct.usage_percpu tasks
    cpu.cfs_period_us user.slice/ cpu.cfs_quota_us

    请问老师这是什么情况?
    2018-12-25
    5
    6
  • Bob
    请教个问题,cgroups除了限制资源上限,能否锁定下限?如果不能,那不是很容易被抢资源?

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

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

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

    2018-09-05
    6
  • 岁月~静好
    相对于虚拟机来说,容器没有专门的cpu内存等,没有虚拟的操作系统,只是通过namespace重命名的进程运行买物理机上,没有实质性的隔离,会发生容器内的应用越狱等情况。但可以通过cgroup来限制容器的cpu内存等的使用,现有问题是top,/pro下查看到的还是物理界机的相关信息。不知道理解的是否正确?

    作者回复: 是的呢

    2018-09-05
    6
  • pytimer
    为什么容器不添加磁盘限制?

    作者回复: 技术上没有问题,但对上层编排系统的挑战比较大

    2018-09-05
    6
  • microshaoft
    讲讲端口,环境变量,网络如何复用隔离的,容器内执行关机命令是如何被限制的
    2018-09-07
    5
  • 彼岸
    老师好,想问下,linux中的非容器进程与容器进程,实际根本没啥区别,只是通过cgroup与namspace的限制后,使得进程满足了容器制定的规范后,我们就可以把此进程称为容器了。其容器本质还是进程,只是是个有限定的特殊进程而已
    2018-09-13
    4
  • Liam
    如果docker run时没有指定cpu quota,默认是不限制的吧 (-1)

    作者回复: 对

    2018-09-05
    4
收起评论
99+
返回
顶部