深入剖析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
登录|注册

07 | 白话容器基础(三):深入理解容器镜像

张磊 2018-09-07
你好,我是张磊。我在今天这篇文章的最后,放置了一张 Kubernetes 的技能图谱,希望对你有帮助。
在前两次的分享中,我讲解了 Linux 容器最基础的两种技术:Namespace 和 Cgroups。希望此时,你已经彻底理解了“容器的本质是一种特殊的进程”这个最重要的概念。
而正如我前面所说的,Namespace 的作用是“隔离”,它让应用进程只能看到该 Namespace 内的“世界”;而 Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙。这么一折腾,进程就真的被“装”在了一个与世隔绝的房间里,而这些房间就是 PaaS 项目赖以生存的应用“沙盒”。
可是,还有一个问题不知道你有没有仔细思考过:这个房间四周虽然有了墙,但是如果容器进程低头一看地面,又是怎样一副景象呢?
换句话说,容器里的进程看到的文件系统又是什么样子的呢?
可能你立刻就能想到,这一定是一个关于 Mount Namespace 的问题:容器里的应用进程,理应看到一份完全独立的文件系统。这样,它就可以在自己的容器目录(比如 /tmp)下进行操作,而完全不会受宿主机以及其他容器的影响。
那么,真实情况是这样吗?
“左耳朵耗子”叔在多年前写的一篇关于 Docker 基础知识的博客里,曾经介绍过一段小程序。这段小程序的作用是,在创建子进程时开启指定的 Namespace。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(111)

  • Geek_6ef93d 置顶
    有读者反映,咱们重新挂载/tmp目录的实验执行完成后,在宿主机上居然可以看到这个挂载信息。。这是怎么回事呢?实际上,大家自己装的虚拟机,或者云上的虚拟机的根目录,很多都是以share方式的挂载的。这时候,你在容器里做mount也会继承share方式。这样就会把容器内挂载传播到宿主机上。解决这个问题,你可以在重新挂载/tmp之前,在容器内先执行一句:mount(“”, “/“, NULL, MS_PRIVATE, “”) 这样,容器内的根目录就是private挂载的了。
    2018-09-08
    2
    55
  • Cloud*
    1. 上面的读写层通常也称为容器层,下面的只读层称为镜像层,所有的增删查改操作都只会作用在容器层,相同的文件上层会覆盖掉下层。知道这一点,就不难理解镜像文件的修改,比如修改一个文件的时候,首先会从上到下查找有没有这个文件,找到,就复制到容器层中,修改,修改的结果就会作用到下层的文件,这种方式也被称为copy-on-write。

    2. 查了一下,包括但不限于以下这几种:aufs, device mapper, btrfs, overlayfs, vfs, zfs。aufs是ubuntu 常用的,device mapper 是 centos,btrfs 是 SUSE,overlayfs ubuntu 和 centos 都会使用,现在最新的 docker 版本中默认两个系统都是使用的 overlayfs,vfs 和 zfs 常用在 solaris 系统。

    欢迎补充和指正。

    作者回复: 课代表又出现啦

    2018-09-07
    188
  • Jeff.W
    继Namespace构建了四周的围墙(进程隔离),Cgroups构建了受控的天空优先使用阳光雨露(资源限制),Mount namespace与rootfs构建了脚下的大地,这片土地是你熟悉和喜欢的,不管你走到哪里,都可以带着它,就好像你从未离开过家乡,没有丝毫的陌生感(容器的一致性)~

    作者回复: 于是,你就做了一句诗

    2018-09-13
    95
  • 栖枝
    whiteout,这就是我每次想把之前不需要的东西删了,但是镜像也没变小的原因啊,手动捂脸
    2018-09-07
    56
  • asdf100
    目录联合挂载时,如果A和B目录里的x文件内容不一样,这时如何处理?

    作者回复: 好问题。aufs是一层一层往上盖的,所以我给的例子里,A里面的x会覆盖B里面的x。

    2018-09-07
    2
    43
  • oddrock
    请问老师,听了您今天的课,认识到容器使用的内核是和宿主机内核一致的,但如果容器需要不同的内核怎么办?

    作者回复: 没!办!法!所以我去年一直在搞katacontainers,这种基于虚拟化的容器是有独立内核的。

    2018-09-07
    34
  • A-
    女朋友1 3 5追电视剧,我1 3 5追k8s。

    作者回复: 女朋友应该很开心😃

    2018-09-07
    28
  • 汤尼房
    老师你好,很好奇dockerhub上关于系统镜像的制作过程,比如对于centos7.4的镜像,首先能想到的是应该依据centos官方发布的centos7.4的系统镜像,然后将此镜像中的内核给去掉,仅保留剩下的文件、配置和目录或者是保留必要的文件、配置和目录;但通过查看centos7.4的Dockerfile之后发现其依赖的base image是scratch,然后在scratch的基础上添加centos-7.4.1708-docker.tar.xz,后来查看ubuntu镜像发现其base image也是scratch,老师能简单说下scratch基础镜像吗(镜像文件的制作过程等),猜想scratch应该是包含了多个系统之间共同的东西,否则为啥多个版本的系统镜像以及不同版本的系统镜像的基础镜像都用的是scratch,所以对scratch基础镜像很好奇,望老师指点一下

    作者回复: 很简单啊,因为scratch本身就是个空镜像。你想想,假如你是centos公司,你在发布centos镜像的时候总得FROM吧?所以docker公司就给你做了个scratch:万能的base镜像。

    2018-09-10
    1
    24
  • snakorse
    精彩到炸裂!!!
    2018-09-07
    20
  • Hans
    我使用的ubuntu系统使用docker时没有/var/lib/docker/aufs目录,只有/var/lib/docker/overlay2目录,通过docker inspect命令可以查看到镜像在该目录下生成的各种目录文件,
    LowerDir:指向镜像层;
    UpperDir:指向容器层,在容器中创建文件后,文件出现在此目录;
    MergedDir:容器挂载点 ,lowerdir和upperdir整合起来提供统一的视图给容器,作为根文件系统;
    WorkDir:用于实现copy_up操作。
    2018-11-21
    19
  • ╯梦深处゛
    喜欢这种从出现到发展、由浅入深、由一小段代码讲述某种实现的讲述,既容易理解,也深入了解了原理。娓娓道来,很有条理,就像身临当时docker的实现场景!

    作者回复: 我一向反对源码分析。那是偷懒的态度。

    2018-09-27
    12
  • shupian418
    ns.c 启动失败
    Parent - start a container
    Parent - container stopped

    作者回复: 得看看报错,八成是依赖之类的

    2018-09-10
    2
    9
  • silencedoctor
    老师你好我想请问一下 我的系统是Ubuntu16.04.4 docker是18.06.0 /var/lib/docker下并没有aufs这个文件夹 执行docker image他又确实分了层这是什么原因呢
    2018-09-07
    9
  • 武坤
    在容器中修改文件时,Docker会从上到下依次在各镜像层中查找比文件。找到后,会把此文件复制到容器层(可读写层),然后修改。这就是 Copy on Write.
    2018-09-07
    9
  • 请教一个低级的问题,我现在用docker部署,在多次部署以后,会导致磁盘占用空间急剧的增大,老是需要扩容,虽然对不使用的镜像定时做了删除,但还是会出现这样的问题,产生的文件也不敢在生产环境随便进行删除,只能清理镜像和容器。

    作者回复: 用kubernetes ,打开GC功能,定时清理

    2018-09-07
    9
  • Hunsbiously
    你好,这个视频是我看到的一个很好的视频,希望老师能够找机会,详细分析下.
    https://m.youtube.com/watch?v=90kZRyPcRZw#fauxfullscreen

    作者回复: 好

    2018-09-09
    8
  • long904
    请教老师,以我理解容器镜像依赖宿主机内核。那么如果镜像是基于Linux的系统制作而成(线上运行环境就是Linux),那么如果在Windows系统上它是不能运行这个镜像了,对吗?甚至目标机器如果内核跟镜像制作不同(比如centos5和centos7)如果是,请问该怎么理解容器跨平台部署一说?谢谢。

    作者回复: 如果你的应用依赖内核版本,那果断跨不了平台,除非再创建对应的虚拟机出来做宿主。说跨平台其实是因为大多数应用没有内核依赖。windows系统会给容器外面套一个vm,所以也能运行linux容器。

    2018-09-07
    6
  • 王由华
    被whiteout遮挡的文件会被清除吗?用什么命令清除的?否则镜像不是就膨胀了。

    作者回复: 哈哈,是会膨胀啦。可以压缩镜像,做法网上可以搜到。

    2018-09-13
    5
  • 从一路
    同样遇到 ./ns 启动失败
    Parent - start a container
    Parent - container stopped

    我切换到root用户就好了
    2018-09-11
    4
  • Kaer
    老师你好,如果依赖了内核运行的应用,必须得重新在跟宿主机相同内核下重新打包镜像才行吗?有没有完美解决方案:比如在镜像打包的时候,打一个兼容内核的补丁。

    作者回复: 重新打包也解决不了问题,你的宿主机必须跟开发环境一致才行。linuxkit这个工具就是干这个的。

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