张磊是《Docker容器与容器云》的作者,Kubernetes多个核心特性的作者之一。专栏详情可以直接扫码查看,有很详细的内容目录,可以试读。因为在阅读该专栏之前,已经对 Kubernetes 有较多的了解,这里只记录一些填补了盲区的新知识。
在容器中用top
命令看到的是宿主机的状态,要怎样做才能够在容器中看到容器的状态呢?
从评论中得知,可以用lxcfs实现。
top命令是从/proc/stats
目录中读取数据的,因为容器中挂载的是宿主机的目录所以读到的是宿主机信息。
使用lxcfs之后,将lxcfs伪造的proc目录/var/lib/lxcfs/proc/*
挂载到容器中,使top
等命令从lxcfs中读取数据。
注: 还没有尝试 @2018-09-20 23:20:02
这一章的大部分内容对我来说比较容易,很早之前就了解过容器的原理:一个最简容器的实现。
但是镜像部分没有深入了解,后半部对Docker如何应用aufs
的讲解,对我很有用。
image inspect
命令可以查看镜像的分层:
$ docker image inspect ubuntu:latest
...
"RootFS": {
"Type":"layers",
"Layers": [
"sha256:f49017d4d5ce9c0f544c...",
"sha256:8f2b771487e9d6354080...",
"sha256:ccd4d61916aaa2159429...",
"sha256:c01d74f99de40e097c73...",
"sha256:268a067217b5fe78e000..."
]
}
使用AUFS的方式,挂载点在/var/lib/docker/aufs/mnt/
,里面是一个完整的rootfs:
/var/lib/docker/aufs/mnt/6e3be5d2ecccae7cc0fcfa2a2f5c89dc21ee30e166be823ceaeba15dce645b3e
关键是镜像的多个分层是怎样“捏合”成这个挂载点的,可以在/proc/mounts
中找到这个挂载目录的详细信息:
$ cat /proc/mounts| grep "6e3be5d2ecccae7cc0":w
none /var/lib/docker/aufs/mnt/6e3be5d2ecccae7cc0fc... aufs rw,relatime,si=972c6d361e6b32ba,dio,dirperm1 0 0
这里的si=972c6d361e6b32ba
是找到镜像中另外多个分层挂载信息关键,在目录/sys/fs/aufs/
中查找:
$ cat /sys/fs/aufs/si_972c6d361e6b32ba/br[0-9]*
/var/lib/docker/aufs/diff/6e3be5d2ecccae7cc...=rw
/var/lib/docker/aufs/diff/6e3be5d2ecccae7cc...-init=ro+wh
/var/lib/docker/aufs/diff/32e8e20064858c0f2...=ro+wh
/var/lib/docker/aufs/diff/2b8858809bce62e62...=ro+wh
/var/lib/docker/aufs/diff/20707dce8efc0d267...=ro+wh
/var/lib/docker/aufs/diff/72b0744e06247c7d0...=ro+wh
/var/lib/docker/aufs/diff/a524a729adadedb90...=ro+wh
后五个只读层和第一个读写层好理解,详情可以去看专栏。有意思的第二个init=ro+wh
层。
init
层是Docker项目生成的,专门用来存放/etc/hosts、/etc/resolve.conf等信息的层。这些信息需要是可修改的,但不能被提交到镜像中。
Docker单独设计了可修改的init
层,docker commit提交镜像的时候,init层会被忽略,不被包含在镜像中。
如果在读写层中修改下面的只读层中的文件,会使用copy-on-write
的方法,将文件从只读层复制到读写层后,在读写层修改,从上面看起来就覆盖了下面的同名文件。
如果要在读写层中删除下面的只读层中的文件,则是在只读层里创建一个.文件名
的whiteout(ro+wh中的wh)文件,挡住下面的只读层中的文件。
aufs文件系统的知识有必要了解一下,还有devicemapper、btrfs、overlayfs、vfs、zfs等。
这一章给出了一个技能图谱,很实用:
之前阅读Borg论文的时候做过笔记:Borg论文阅读笔记
这里提到的Google Stack很赞!
kubelet通过gRPC 协议同一个叫作 Device Plugin 的插件进行交互。这个插件,是 Kubernetes 项目用来管理 GPU 等宿主机物理设备的主要组件,也是基于 Kubernetes 项目进行机器学习训练、高性能作业支持等工作必须关注的功能。
主要介绍了kubeadm的用法,kubeadm用起来很简单,但还不能用于生产!
推荐使用kops或者 SaltStack 这样更复杂的部署工具。
以前写过一套Ansible部署脚本kubefromscratch-ansible。