构建容器之用户空间为什么重要

原文:Architecting Containers Part 2: Why the User Space Matters

在容器架构第一部分中,我们探讨了用户空间和内核空间的区别。在这篇文章中,我们将继续探讨为什么用户空间对开发人员,管理员和架构师很重要。从功能角度来看,我们将探讨 ISV 应用程序和内部应用程序开发对用户空间的联系。

虚拟机 vs 容器

由于虚拟机很好理解,我们就从比较直接开始。虚拟机时打包虚拟硬件,内核和用户空间的便捷方式。另一方面,容器仅封装用户空间:没有内核或虚拟硬件。

虚拟机(Virtual Machines)

目前,很多基础架构都基于虚拟机。当人们想要就项目进行合作时,有两种主要的方式。可以共享他们正在开发的代码,或者可以共享整个运行代码的虚拟机。虽然这两种方式都很普遍 - 但每种方式也都有各自的优缺点。

开发人员通常只共享代码或二进制文件(而不是整个虚拟机)。这是因为虚拟机的大小和格式不同,而且与其他开发人员共享整个虚拟机也不太方便。共享代码在大小方面非常有利(代码一般都不会特别多)- 缺点是当软件部署到生产环境时就需要额外的步骤。开发人员通常需要基于底层模块的代码(例如用 Ruby,PHP PECL,Python,Perl 等写的)。其中一些模块以操作系统中的软件包方式提供,但通常他们是从外部存储库中提取 - 有些甚至需要从 C/C++ 编译出来。然后,其他开发人员,管理员和架构师就会知道如何安装这些需求。诸如 RPM,git 和 RVM 之类的工具已经被开发出来协助管理 … 但是构建和部署步骤可能还是很复杂,并且通常需要一定程度的专业知识(除了正在开发的应用程序)。

另一方面,架构师和系统管理员经常共享整个虚拟机。这样做可以很容易地保留他们为了核心版本或镜像所做的工作。虚拟机通常由两个文件组成 - 第一个是用户空间和内核的副本(我们称之为磁盘)- 第二个是包含定制的资源(CPU,RAM,显卡,等等)在虚拟机启动时使用。这种方法的优点是只需要几个步骤进行部署,但随着时间的推移,很容易丢失虚拟机镜像中的内容。当独立软件开发商提供虚拟镜像时,客户经常关注其创建背后的方法,以及如何维护,配置和修改。每个供应商都有(例如)不同的登陆方式,更改密码,配置时间服务器和配置网络。更糟的是 - 这些配置几乎都是手动过程。

所以,共享 ”代码“ 和 ”完整虚拟机“ 方法都不怎么完美。这毫不奇怪,已经开发了一些工具尝试将这两个方法结合起来。诸如 Kickstart,Puppet 和 Chef 等工具试图像代码一样构建服务器(用代码实现基础架构),而像 Vagrant 这样的工具已经开发出来,可以简化开发中的笔记本构建完整的虚拟机的过程。

代码或整个虚拟机共享是协作的通行货币吗?还有没有另外的方式?请继续阅读!

以容器作为货币(Containers as Currency)

当容器首次实例化时,容器主机的用户空间将对应的系统调用放入内核中,以便在内核中创建特殊的数据结构(cgroups,svirt,namespace)。容器主机可以是红帽企业版 Linux 7 的完整安装,也可以是容器优化的版本,如红帽企业版 Linux 原子主机。但它们的系统调用都是通过相同的方式。

请注意,在下图中,当创建一个容器时,会使用 clone() 系统调用来创建一个新的进程。克隆和 fork 类似,但允许在内核命名空间中设置新进程。内核命名空间允许新进程拥有自己的主机名,IP 地址,文件系统挂载点,进程 ID 等。可以为每个新容器创建一个新的命名空间 - 允许它们每个的外表像和整个感受与虚拟机非常相似。

一旦容器被实例化,一个或多个过程在从安装容器镜像创建的原始用户空间内执行。容器内的进程正常地进行系统调用。内核负责限制容器中的进程可以执行的操作。从下图可以看出,第一个命令直接从主机的用户空间执行 open() 系统调用,第二个命令通过挂载命名空间(containerized)执行 open()系统调用,第三个命令执行 getpid(),通过 PID 命名空间容器化。

当容器停止时,内核命名空间计数会减少并且通常会被删除。一旦终止,用户可以选择放弃已完成的工作,或将容器保存为新的镜像。

只要在环境之间实现基础架构奇偶校验(CPU,内存,网络,内核兼容性),就可以在开发人员的笔记本电脑,数据中心中的服务器或云中的虚拟机上启动并运行相同的容器镜像。容器的优势在于为开发人员,架构师,质量工程师,发布工程师和系统管理员提供了一种协助时通用的货币,使整个用户空间以方便易用的格式打包并发布。

结论(Conclusion)

用户空间很重要,因为它是大多数开发人员和架构师的关注焦点。无论是开发需要底层 C 库的 Ruby on Rails 应用程序,Java 或 PHP PECL 模块 - 容器都是围绕应用程序机器所有用户空间相关性进行打包和装运的便捷方式。

用户空间也很重要,因为这是提供所有工具来与容器镜像进行交互,构建新镜像以及实例化新容器的工具。

无论是开发或者部署传统应用程序还是现代微服务架构,都将容器镜像(用户空间)作为协作货币,从开发人员和系统管理员到架构师和发布工程师,每个人都可以获得更高的灵活性和更高效的能力。

在容器架构第三部分:用户空间如何影响你的应用程序,我们将探讨用户空间/内核空间的关系,以及如何影响你的应用程序。如果你有任何想法或疑问,请随时在下面评论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值