如果你关注DevOpsWeekly、DevOps主题会议或者对技术非常感兴趣,你可能已经听说过Unikernels很多次了。在过去的几个月里,它似乎越来越受欢迎。 然而,Unikernel到底是什么?是我想要的吗? 这个问题我纠结了好久。不知道如何定义Unikernel以及它存在的意义? 什么是Unikernel?要构建的单地址空间机器映像。开发人员通过选择堆栈模块和一组最小依赖库来运行应用程序,这些依赖库对应于在操作系统中运行应用程序所需的依赖项。 这些库负责编译应用程序和配置代码,并将其构建成一个封闭的、固定用途的镜像(即Unikernel),可以直接运行在虚拟机管理程序的hypervisor或硬件上,不需要对于Linux或Windows这样的操作系统进行干预。 ----维基百科:Unikernel 很清楚,对吧? 好!如果是我,可能上面说的不多。下面是我对Unikernel的解释。 首先,让我们回顾一下这里的例子。假设您是编写PHP应用程序的开发人员。当您运行PHP(其他Ruby、Node、Perl类似)应用程序时,您实际上是在运行: 语言解释器:PHP、Perl、Ruby、... 调用操作系统系统级API。 ◆其中一些API调用需要不同级别的权限,强制应用程序的上下文切换...(用户空间与内核空间)。 ◆所有运行在操作系统上,比如CentOS,Debian,Ubuntu,... ◆也许运行在虚拟机上,比如VMware,Xen,KVM,... ◆也许运行在你的自己的虚拟化管理系统,比如ESXi,XenHypervisor... 通过BIOS或UEFI进行引导 但他们做到了。而且做得很好,性能也不错。但是你必须意识到,从提供应用程序运行环境的硬件到应用程序本身,有很多层。 这就是unikernel试图解决的问题:消除应用程序和硬件之间的膨胀。让最“精简”的操作系统运行您的代码。 这是一篇总结得很好的论文: UnikernelVision:当您看到云客户端时,就像您看到单一应用程序硬件一样。 -操作系统的兴衰 Unikernel试图消除现代操作系统带来的一些复杂性。因为“通用”操作系统(像任何Linux和Windows发行版),通常会附带一些您的应用程序不需要的驱动程序、依赖项、服务等,但这些对于每个应用程序来说都是必需的,在某种程度上是必需的系统。 即使是Linux内核中的核心模块也不需要每次都完全加载。USB驱动程序之类的东西在虚拟化“云”环境中被认为是无用的,但仍包含在内核中。 与容器和虚拟化相比,Unikernel的演进如下: unikernels Unikernel相对于Linux等通用操作系统有很多优势: 提高安全性:只运行操作在系统的核心,丢弃可能成为干扰源的视频和USB驱动器。 ◆低占用空间:想象一下能够擦除内核大小的95%,因为您的应用程序不需要它。 ◆定制化实现:深入理解应用程序,将内核修剪成你想要的部分。 ◆快速准确运行Unikernel实例(就像运行Docker实例一样),启动时间小于1s。 这样一来,我们自然而然地将Unikernel视为微服务的替代品。 使用Unikernel擦除复杂的中间层 如果你想以最小的开销运行你的应用程序,那么你可能需要考虑制作一个unikernel。 为此,使用了图书馆操作系统LibOS。库操作系统将为您提供构建自己的unikernel的方法。最著名的是MirageOS(术语“unikernel”的创造者)和RumpKernels。两者本质上都是一系列标准化的驱动程序和库,因此您无需重新发明TCP堆栈、持久存储层等东西。 Unikernel是用高级语言定制的操作系统内核,作为一个独立的软件组件。完整的应用程序(或应用程序系统)作为分布式系统运行在一组unikernel上。 MirageOS基于OCaml语言,使unikernel运行在Xenhypervisor上。 --queue.acm.org:Unikernels:RiseoftheVirtualLibraryOperatingSystem 目前编写unikernels最流行的语言是: Rust Go(或'golang') ◆OCaml ◆Haskell 这些不全是新的编程语言。除了Go和Rust,其他都有15年以上的历史。 为了让操作系统和应用程序运行得更流畅,这些unikernel库需要使用尽可能小的内核部分。 现在,由于虚拟化技术,虚拟机管理系统如Xen或VMware(注*:原始操作系统)将异构硬件设备抽象成一堆标准的虚拟化设备,unikernel也可以提供优化的定制虚拟化设备。 Unikernel利用虚拟化创建专有的优化操作系统。 想要编译应用程序的“unikernel”,需要依赖MirageOS的库和OCaml语言,结果是这样的: 编译器输出一个完全独立的内核,而不是Unix可执行文件。这些un??ikernel是库操作系统VM,仅为满足特定的应用程序和配置文件而实现,并依赖于管理程序提供的资源重用和隔离。 ---queue.acm.org:Unikernels:虚拟图书馆操作系统的兴起 最后,您通过运行Unikernel(一种简化的专有操作系统)来运行应用程序的一部分。如果您的应用程序和配置需要更新,您需要重新编译源代码以生成新的unikernel并部署新版本。如果是新的安全升级呢?它还需要重新编译和部署。 这将使部署的协调和编排更加困难,但有利于更高效地运行应用程序。 构建不可变基础架构的关键是应用程序不再存储状态,可以轻松丢弃和重建。 一方面,我们可以让Unikernel运行在Docker容器中,但是我们是否应该尽量避免添加其他复杂的中间层?另一方面,Docker在使用和部署上的优势,确实可以弥补这个中间层的开销。 谁应该使用Unikernel? 老实说,这个问题的答案我也不清楚。我觉得如果你现在是在WordPress上部署web应用,使用Unikernel可能还是有一定的差距。 另一方面,unikernel的好处是显而易见的,但需要一个完全不同的模型来管理您的基础设施,需要一套不同的技能来构建这种类型的应用程序和内核,并且需要深入理解一个仍然存在的概念完全陌生:不可变的基础架构。 也许在接下来的5到10年,我们会部署Unikernel作为新规范。目前,我认为它针对的是一小部分需要相当专业和安全的应用程序的用户。对于大多数临时用户,虚拟机(或者,如果您处于技术前沿,则Docker容器)可能是您应该关注的。更多Unikernel相关阅读:如果你对这个话题感兴趣,我推荐你一些相关链接:Unikernels:RiseoftheVirtualLibraryOperatingSystemTheRiseandFalloftheOperatingSystem(pdf)Presentation:TheRoadtoUnikernelsAfterDocker:Unikernels和不可变基础设施Unikernels,遇见Docker!
