脑洞大开的探求者总是想同时获得容器的方便与虚拟机的安全,本文将解析几款成熟的容器与虚拟机结合产物。
序言
容器技术起源于虚拟化技术的发展,欣欣向荣的Docker着实是容器技术时尚中一朵非常炫目的浪花。在Docker诞生之初,它往往被置于虚拟机技术的对立面,甚至还有过Docker将取代虚拟机的夸大宣传,在许多集群以及虚拟化方案设计的讨论中,也总会将二者用来比较一番优劣。
现现在Docker早已比较普及,这种以前的传闻不攻而破。容器以及Docker并没有取代虚拟机,而是与之和谐共存,三者各自具有不同的特点和相应适宜的应用场景。但脑洞大开的探求者们总想同时获得容器的方便性和虚拟机的安全性,因此在二者的边界上进行了许多创造性的尝试。在这篇文章里,我们将沿着这个话题,谈谈当下比较成熟的几款虚拟机和容器的结合产物。
容器式的虚拟机,虚拟机式的容器
关于容器与虚拟机的差别linux 输入法,具有普遍共识的特点,归纳上去大致有以下几点:
倘若从这种非常清晰的定义来看,近一年来开源界出现的一些虚拟化“边界破坏者”们早已完全无视了这种规则。它们要么是运行在虚拟机中的操作系统,却有着容器一样的使用体验,要么是基于容器技术的运行时隔离,却应当当做虚拟机使用。因而,虽然这种技术的实现细节上差别巨大,但它们都有一个共同特点:携带着容器和虚拟机各一部份的基因,具备二者优势的结合。
这种闪亮的群星我们没法逐一细辨,只能通过窥一斑而知全豹的技术敏感力和洞察力,从这种虚拟化技术的新星中,选购比较明亮的几颗,与你们共同鉴赏。
小而美的Linux系统:RancherOS
RancherOS是RancherLabs公司设计的一款专为运行Docker而订制的Linux发行版。它的订制到了哪些程度呢?在最初发布后的近一年时间里,Docker就是整个RancherOS系统PID为1的根进程,虽然说白了就是将一个Docker后台进程托管在Linux内核上。与其说它是Linux发行版,倒不如说是一个运行在硬件设备上的Docker进程,而内核的存在仅仅是为了使用它的驱动,让Docker有个运行的地方。
RancherOS系统的设计结构如图1所示,这是一个双Docker进程的运行结构,所有的系统服务,包括管理操作系统设备的udev服务,管理系统网路的netconf、dhcpcd服务,管理日志的rsyslogd服务,以及与用户交换使用的Shell进程,都以容器的方式运行于上层的SystemDocker中。而与那些服务一起的还有另一个Docker服务进程,称之为UserDocker,用以非root用户方法运行用户自定义的应用级服务。
图1RancherOS系统结构
因为Docker进程有时会发生意外崩溃,而根进程一旦奔溃将造成所有程序状态不可逆中止的严重后果,在2016年2月发布的v0.4.3版本中,加入了一个只有几行代码的极简init进程取代了Docker的根进程位置,但是这并没有改变Docker在RancherOS系统中的地位。RancherOS操作系统本身非常轻巧,最新版本的系统ISO镜像文件只有区区32.5M。这儿面的主要内容虽然只有三个部份:Linux内核、一个压缩过的Docker二补码文件,以及一个外置所有系统服务文件的Docker镜像。
从常规的定义来说,这是一个自带内核的操作系统,因而RancherOS须要根据虚拟机的形式运行和管理。事实上也正是这么,RancherOS可以直接运行在KVM、Xen、VMware和VirtualBox等主流的虚拟机和硬件虚拟化平台之上。但是RancherOS的使用,不仅须要利用一些工具(比如cloud-init和ros),完全如同是在使用Docker:整个操作系统的Shell是基于Docker的BusyBox镜像制做的,用户要是用不爽了可以拿Ubuntu或则Debian的Shell镜像换掉。若须要添加编译内核模块所需的内核头文件,也只需下载指定的Docker镜像之后启动相应服务即可。
在RancherLabs构建的生态圈中,还有一个重要成员是Docker容器的调度管理平台Rancher。这个去年3月底刚才完成1.0版本发布的项目,才能运行在包括RancherOS在内的各类主流Linux系统之上,实现虚拟机和容器的同步可视化管理,因而也填补了RancherOS在使用和管理方法上与主流系统的差别性带来的学习成本,因而将其轻量、高效的优势充分放大,将Docker的效力发挥到极至。
运行在硬件上的Docker:Hyper
假如说RancherOS还只是个运行了Docker的Linux操作系统的话,Hyper则是真正地将容器的运行直接搬进了硬件虚拟层上。
hyperpullubuntu
hyperrun-d-t--namemachineubuntu
hyperexecmachinels
见到这组命令的时侯你想到了哪些?这是在启动一个Docker容器吗?
事实上刚才这组命令启动了一个KVM/Xen虚拟机(具体是哪一种在Hyper安装时就确定了),之后在这个虚拟机里执行了一次ls命令。这么第一条命令中的那种hyperpull是在做哪些呢?脑洞大开的时侯到了,这条命令下载了DockerHub库房里的官方Ubuntu镜像,而以后启动虚拟机使用的正是这个Docker镜像!
正如上反例所演示的那样,Hyper是一个才能把Docker镜像当作虚拟机镜像,将其直接运行在KVM或Xen的虚拟化硬件资源上的强悍工具。它使用了一个高度精简的Linux内核,系统的启动时间仅为大概20ms,达到了与容器同一级别的启动速率。如表1所展示的那样,它结合了容器与虚拟机的主要优点。
表1虚拟机、容器与Hyper的比较
Hyper的使用体验实在太像Docker,它除了支持从官方的DockerHub或则自建的私有Docker库房获取镜像,还支持将本地的虚拟机镜像推送回Docker的镜像库房中,甚至还能支持推送到这些须要登陆验证的库房。假如将Hyper制做成平台化的工具,用户将很难感知其前端运行的到底是容器还是虚拟机,因而在提高隔离安全性的同时获得容器一样的方便体验。
目前Hyper的发展分成了两个版本,即开源版本和平台版本。后者准许用户在自己的Linux主机上安装和配置Hyper服务,前者则是将主机托管在Hyper的平台上,用户需按使用的时间和节点的规模付费,价钱大概只有同等配置的传统虚拟机的一半。开源的版本单独构建了官方网站,而最初的官方站点现今则作为平台版Hyper的依据地。
在Hyper的生态圈中,包含了好多来自OpenStack以及Kubernetes社区的元素。诸如才能将Hyper运行在OpenStack上的Nova驱动插件Hypernova,将Hyper与Kubernetes进行整合的项目Hypernetes,以及将OpenStack的网路模块Neutron用于Kubernetes以易于建立Hyper集群的Kubestack项目等。借助那些现成的平台,站在巨人的右臂上linux操作系统论文,Hyper早已构筑出了一片属于自己的天地。
用户态的操作系统隔离:LXD
LXD是一种提供虚拟化主机的形式,这一类工具虽然并不算新鲜,早在Linux-VServer和OpenVZ的时代它们就非常风光。这么这个一年多前才诞生的长辈有何值得圈点之处呢?
实际上,之所以将LXD列为容器和虚拟机的结合产物,是由于它的实现主要基于LXC,而Docker最早的实现也是基于LXC的。这意味着它虽是用于虚拟主机的解决方案,但骨子里的实现机制却与容器本质上如出一辙。值得注意的是,LXD并不兼容Docker的容器镜像,也没有采用AUFS那个层级式的不可变基础设施模式,仅仅是支持对虚拟主机的运行状态快照和还原,但它有自己的另一个杀手锏:服务热迁移。
服务热迁移指的是将服务在不中断当前运行状态的情况下,从一个数学节点联通到另一个数学节点,图2中跃起的乌龟非常形象地展示了这些服务迁移的形式。这一功能依赖于Canonical公司创造的CRIU技术,CRIU全称是Checkpoint/RestartInUserspace,这是一种才能将特定服务的所有运行时信息保存成c盘文件数据,之后在另一个地方进行原貌还原的技术。同时正如它的名子所叙述的那样,这项技术仅仅通过用户态的代码实现,无需对Linux内核做任何更改。
图2服务热迁移
相比于OpenVZ更改内核以实现软件虚拟化的做法,LXD所用的两个核心技术都是在用户态实现的。类似Docker这样即装即用的省心设计,致使它的施行门槛比起初期的虚拟主机方案要低得多,因而普及上去愈发容易。至于LXD与Docker的关系似乎非常微妙,二者本也算是同门师兄弟,却因为各自抱负不同,踏上不同的公路。Docker一般是拿来运行特定服务的,属于PaaS层的服务,在一个Docker容器中启动许多后台进程并不是值得被赞誉的实践。而LXD注重虚拟主机层面上的应用,属于IaaS层的服务,用户可以在里面安装好多Linux应用,并运行好多的进程,甚至可以在其中像普通Linux那样安装Docker并使用它创建服务的容器。
不过须要强调的是,直至目前,LXD还仅才能运用在Ubuntu系统上,它是Canonical主导的LinuxContainers开源技术栈中的一部份,这个技术栈还包括PaaS层的容器实现LXC、专用的文件系统LXCFS,以及实现CGroup嵌套的后台服务CGManager,在网站上有更详尽的介绍。Canonical正在积极地让LXD才能在其他Linux发行版中运行上去,这项技术的未来发展仍然值得期盼。
总结
天下大势分久必合,合久必分,容器与虚拟机这对以前的欢喜冤家现在已碰撞出了不少创意的火花。不论是RancherOS的“容器式的操作系统”,还是Hyper的“容器式虚拟机”ubuntu 虚拟机联网ubuntu 虚拟机联网,又或则LXD那样的“虚拟机式容器”,技术的融合总是能创造出许多新的机遇和惊喜。
当你们还在谈论容器化服务的时侯,技术的先知者们早就早已开始了新的探求。随着容器生态圈的继续扩大,容器技术正在与越来越多的行业搭界,不论是过去八杆子打不着的大数据、物联网领域,还是早已闹得沸沸腾腾的微服务、虚拟化,一个愈发宽广的后容器技术时代正在到来,让我们拭目以待。
作者简介:
林帆,ThoughtWorks公司DevOps技术咨询师。热衷于对DevOps和容器技术应用的推广,在容器规模化运维方面有较丰富实践经验。著有《CoreOS实践之路》一书。
责编: