《基于Kubernetes的容器云平台实战》——1.3.2 容器

举报
华章计算机 发表于 2019/06/02 00:11:11 2019/06/02
【摘要】 本书摘自《基于Kubernetes的容器云平台实战》——书中的第1章,第1.3.2节作者是陆平、左奇、付光、张晗、赵培、单良

1.3.2 容器

容器是Docker引擎的核心服务对象,也是应用的运行环境,需要从以下几个方面来了解其特点。

隔离环境

在Linux下,由创建容器的各个只读镜像层叠加容器可读写层以及运行时准备的特殊目录/文件(比如,/proc、/dev和/sys等),构成了每个容器可访问文件系统的初始边界,并由Mount命名空间来增强其隔离性。通过绑定挂载附加的数据卷,还能动态扩展这个视图的边界。

容器运行时不仅会根据镜像中内容为容器准备好根文件系统视图,还会为容器中的应用准备好/proc、/dev、/sys、/dev/pts和/dev/mqueue等虚拟文件系统;准备好/dev/null、/dev/zero、/dev/full、/dev/tty、/dev/random等各种支持POSIX API所需要的特殊文件;将/proc/asound、/proc/bus、/proc/sys、/proc/fs等路径设置为只读;将/sys/fireware文件,以及/proc下的kcore、keys、scsi、latency_stats、timer_list、timer_stats和sched_debug这几个文件做屏蔽处理,使得应用在容器中对其无法读取到有意义的内容。为了网络应用的正常执行,容器运行时还会准备好/etc/hosts、/etc/resolv.conf和/etc/hostname这几个文件,通过绑定挂载方式将它们链接到容器根文件系统中。容器运行时会根据创建容器时的参数,设置应用的UID、GID、归属的补充gid列表、当前路径、环境变量和oom设置值。

为了实现容器隔离性,在Linux下容器运行时还使用以下一些技术:根据需要启用MOUNT、PID、UTS、IPC、NET和User命名空间;默认为每个容器新建CGroups节点、启用所有的控制器;容器中可用设备文件由白名单配置;进程只具有14个默认Capabilities;使用默认白名单启用seccomp控制,并可控制sysctl列表、selinux应用标签和Apparmor Profile。

总之,容器运行时尽量为应用提供一致和标准的运行环境,尽可能确保在共享内核环境下容器之间的隔离性。用户也可通过API接口参数来控制这一过程。

容器生命周期管理

Docker引擎提供了容器生命周期管理功能,并将容器的运行状态分为created、running、pausing、paused和stopped。容器运行时提供create、start、run、pause、resume、kill、delete等命令来管理容器的运行状态,并通过list、state、ps、events等命令来获取容器运行信息,还能通过update命令动态调整容器的CPU、内存和I/O的资源限制,通过exec在已经启动的容器中执行命令,通过checkpoint和restore命令执行生成检查点和恢复检查点的操作。

容器运行时依靠静态/动态两种json格式元数据实现容器的生命周期管理。静态元数据保存配置信息,动态元数据对应状态信息,两者格式差异不大,后者增加了状态数据。静态数据首先用于创建,而运行时可根据容器ID找到动态数据,再利用进程号、根路径、命名空间路径、CGroup路径等执行进一步操作。启动容器时的create/start两个步骤也据此关联起来,并可执行钩子程序。

另外,元数据中还能够以key/value形式保存注解信息。它的用处很大,典型案例就是Kubernetes中用它们来保存Pod的属性。

Docker引擎的出现不仅为多个应用在同一个宿主机环境中隔离运行提供了可能,还为应用在云端环境中的调度管理提供了可能。

数据卷

与容器可读写层不同的是,数据卷有自己的独立生命周期。Docker引擎已经引入多种类型数据卷,如有名/匿名卷对象和挂载指定路径的卷。在Linux下,它们通过绑定挂载的方式将宿主机路径引入容器文件系统视图中,可以利用数据卷实现容器数据的持久化、共享和动态配置。

数据卷还可以通过插件接口由外部驱动来提供,但是这只是将准备阶段的功能加以自动化和标准化了,实际挂载方式与其他数据卷类似。但从中可以看出,以标准化方式提供用户可灵活定制能力是数据卷功能发展的重点。

容器网络

Linux下容器网络有三种选项:使用独立的网络命名空间、共享其他容器的网络命名空间和使用宿主机的默认网络命名空间,第三种选项实际是第二种的特殊情况。

当使用第一种选项时,Docker引擎会根据定制或默认参数,为此独立命名空间准备好网卡设备、IP地址、路由和对应的iptables规则等各种资源。为了满足不同的组网需求,Docker引擎也支持插件扩展机制,将这些工作委托给插件完成。

第二种选项不仅用于Docker内置网络对象,而且在Kubernetes场景下特别有意义:Pod中只有沙箱容器拥有自己的网络命名空间,其他容器则共享该网络命名空间。

第三种选项通常用于对网络性能有很高要求的场合,但是安全隔离性相对较弱。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。