【编者的话】随着以Docker引领的容器化模型持续升温,现在很有必要关注一下持续快速发展的Unikernel领域。
Unikernel是精简专属的库操作系统(LibraryOS),它能够使用高级语言编译并直接运行在商用云平台虚拟机管理程序之上。
相比于容器技术它们有很多的优点,不仅仅是超快的启动时间和更小的攻击面。还有很多技术仍然处于研究阶段,例如微软研发的Drawbridge、MirageOS和HaLVM等,与无服务器架构技术可以无缝结合。目前,Docker已收编了Unikernel。
Docker,已经被证实是一种有效的应用管理技术。它方便了不同环境的应用程序部署,解决了“在这里正常工作,但在别的环境不行”这类问题,类似于gradle的包装器。
我们已经看到了使用Docker的热潮,以及特别是围绕Docker的生态圈的形成,这使得Docker的应用已经超出了开发/测试环境而进入了生产环境。它逐步从一个工具进化成了复杂的技术平台。
开发团队之所以喜爱Docker是因为Docker的镜像格式更容易实现开发和生产环境之间的对等。
与虚拟机相比,容器有着轻量级、启动速度快、隔离性好等优点,它也在一定程度上提高了不同应用之间共享云基础设施时的安全性。此外容器技术对于在同一操作系统之中运行多个应用提供了专门的安全和兼容性上的优化。
在云端运行的应用程序大多数并不是针对在云端运行而经过优化的。通常一个容器的大小通常在MB甚至GB级别,显而易见真正的应用只占了这其中很小的一个部分。容器本身假设需要依附底层操作系统,太过笨重,其中包括安全漏洞和臃肿软件,即使已经进行了简化实际上也依旧如此。
将大型服务器分隔成一个个小型虚拟机让许多新的公司得以成功创办起来、实现规模化。这对新服务来说是好事,可是那些虚拟机有许多是单一用途的,不过含有基本上整个操作系统,在进行操作系统复制时所有的服务和子系统不管有用没用都被复制了,这种操作系统本身像Web服务器那样运行应用程序。这就意味着,占用的一大部分资源没有被使用,也没有必要,这不仅导致成本高昂,还带来了安全风险(更大的攻击面)。
容器技术对于传统操作系统的依赖可能会导致它的败亡。
Unikernel使用户可以从一个服务库中选择应用需要的操作系统服务而无须整个操作系统,用户选择的服务则会成为应用的一部分。
Unikernel是与某种语言紧密相关的,一种Unikernel只能用一种语言写程序,这个LibraryOS加上你自己写的程序最终被编译成成一个操作系统,这个操作系统只跑你的程序,里面也只有你这一个程序,没有其它冗余的程序,没有多进程切换,所以系统很小也很简单。
虽然Docker容器的image比传统的虚拟机(以G计)要小很多,但是一般也是好几百兆,而Unikernel由于不包含其它不必要的程序(ls、echo、cd、tar等),体积非常小,通常只有几兆甚至可以更小。比如mirageOS的示例mirage-skeleton编译出来的xen虚拟机只有2M。
Unikernel在整个服务器的架构中取消了操作系统,应用直接运行在hypervisor或者硬件上。试图抹去现代操作系统带来的一些复杂性。因为“通用”的操作系统(就像任何Linux和Windows的发行版),通常会伴随着带来一些对你的应用来说并不需要的驱动、依赖包、服务、等等。
这就使得它获得了下面几个优势:
上面所列举的四个优势完全符合微服务的发展趋势。Docker和CoreOS已经在很大程度上改变了我们消费基础设施的方式然而它们能否适应Unikernel的崛起还未可知。
今后五年Unikernel有可能完全取代容器技术,就算不能取代它也会成为容器技术的强力补充,值得关注。
成熟些的有MirageOS(OCaml)、RumpRun(C、NetBSD)。
其他的有HaLVM(Haskell)、Clive(Go)、IncludeOS(cpp)、Ling(Erlang)、Runtime.js(JavaScript)等。
Unikernel是容器技术发展的必然产物,小、简单、安全、高效,当你看到云客户端时就像看到单应用硬件一样,那就是Unikernel试图解决的:删除应用与硬件中间臃肿的部分,从而让最“精简”的操作系统运行你的代码。
本文转自: http://www.dianrong.com/caifu/597588.html
作者:张高鹏(点融黑帮),FinTech Team。专注于web端开发,涉及p2p业务较多。