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