当Unikernels遇上Docker!

jopen 9年前
 

【编者的话】

本文主要是对在巴塞罗那举办的DockerCon大会上介绍的unikernels总结。unikernels是一种新的容器化发展方向,使用 Rump Kernels构建Rump Kernels微服务,可以像传统的容器一样管理使用,能充分利用到现有容器生态系统的优点。

今天,在欧盟巴塞罗那举办的DockerCon大会上,unikernels闪亮登场!

作为闭幕黑科技主题keynote的一部分, Anil Madhavapeddy( MirageOS 项目负责人),展示了如何像其他任何容器一样使用unikernels。他先用Docker创建了一个unikernel微服务,然后接着部署了一个真正的Web应用,数据库、Web服务和PHP代码运行在使用 Rump Kernels 构建的隔离的unikernel微服务上。Docker像管理Linux容器一样管理unikernels,但是不用再部署一个传统的操作系统!

这种集成使得各地的开发者都可以使用unikernels,并把容器生态中熟悉的工具和实际工作流与unikernels改进的安全性、效率和专 业化结合起来。在这篇文章中我们会透露让你如何参与其中的更多细节,不过在我们进入Anil演示的更多细节前,我们先了解一些关于unikernels的 背景以及为什么可以这样使用Docker。

为什么是Unikernels?

随着公司开始使用云计算,对单一用途的机器映像一直处于增长趋势,但很显然这还有巨大的改进余地。当前,每台运行应用的虚拟机都必须有一个操作系统副本,特别是对隔离要求高的应用。

运行在虚拟机上的应用程序也受到操作系统漏洞影响,包括那些与应用日常功能毫无关系的漏洞。例如,USB驱动-存在于操作系统但是与云部署毫无关系-这个驱动有 多个漏洞 ,允许执行任意代码。修补这样的漏洞是一个完全没必要的维护负担。

Unikernels采取不同的方法:应用代码只与它需要用来创建一个专业,单地址空间机器镜像相关的OS组件链接— 这样就减少了不必要的代码。使用'操作系统库'的技术创建,与传统的操作系统相比unikernels提供很多好处,包括:

  • 改进的安全性 - unikernels不包含与部署无关的代码,大大减少应用程序的攻击面。
  • 更小的空间 - unikernel代码通常要比传统当量小几个数量级,并且可以更容易地进行管理。
  • 细粒度优化 - 由于unikernels通过一个关联的编译器工具链构建,可以在设备驱动程序和应用程序逻辑层面进行全系统优化,无形中更提高了专业化。
  • 快速启动时间 - 由于unikernels可以在不到一秒钟启动,资源分配会变得更加动态。

这些好处与 微服务 和'不可变基础设施'发展理念尤其相关-虚拟机被视为一次性消耗品并可定期从版本库的代码重新分配。这样的虚拟机是不允许直接修改的:所有的更改必须通过修改源代码进行。

Unikernels自然借用了微服务架构和不可变基础设施的概念:源代码和生成的二进制是紧密关联的,可以轻松控制版本。如果说传统的栈,使我们走向微服务,那么unikernels将推动我们走向不变的nanoservices世界。

虽然unikernels提供了一种方式,但是在生产配置中采用它们还有很大的挑战。unikernel生态系统才刚刚兴起,并且这种新技术需要适应现有的工作流程和工具。

进入Docker!

为什么是Docker?

Linux的容器通过允许在传统操作系统为其上的多个'容器化'应用程序提供功能,已经让开发者更快地迈向微服务。这些容器相互隔离,因此可以单独替换或修改,这也是微服务架构模式的核心。

虽然容器技术出来已经有一段时间了,而且应用的步伐也在快速增长。从过去几年可以看到,工具的激增包括镜像库,编排工具等等,使得容器更易于大规模使用。在Docker的带领和培育下,建设了一个充满活力、开放和欣欣向荣的生态系统,帮助改善了每个人的开发工作流程。

随着越来越多的支持工具和基础设施,可以明确看出生态系统已经不仅仅是Linux容器本身了。unikernels是否适合这个生态系统?如果适合,unikernels与容器有什么关联?

容器和unikernels其实是一体的。一方面,在最上层,我们使用传统方法在一个VM中运行一个包括单一应用的全OS栈。下一步自然是在OS 上使用容器,这会有更好的资源使用体验并允许每个应用更加自包含。如果从这个角度来看,unikernels只是在这条道路上又迈出的一步,可以被看作是 极端的、自包含的应用程序。现在我们面临的挑战是让unikernels与容器一样简单易用。

当Unikernels遇上Docker!

应对这一挑战的第一步是将unikernels与现有容器基础设施,特别是Docker工具和生态系统集成。

利用广泛使用和大家都理解的包模型和运行框架,把unikernels看作只是另一种类型的容器,这将帮助我们让各地的开发人员都用上unikernels。

它还使得unikernels可以使用整个容器生态的工具,包括业务流程和其他任何可用的。采用现有的工具链将加速unikernels的进程, 同时也展现了Docker生态系统的灵活性和广度。通过使用Docker抽象掉了底层操作系统的复杂性,开发人员可以选择如何 'containerise'他们的应用程序,无论是针对一个传统的Linux容器,或者一个新的unikernel'容器'。

DockerCon演示

也正是这些最初的步骤使开发人员能够利用现有的Docker工具,构建和运行unikernel微服务,正像今天Anil在DockerCon的演示一样!

首先,他用Docker创建一个unikernel微服务,然后他启动unikernels集群部署包括数据库,Web服务和PHP代码的Web 应用。整个构建系统包含在一个易于使用的Dockerfile,每个微服务变成一个专门unikernel。这些unikernels在自己有硬件保障的 KVM虚拟机上运行。Docker像管理Linux容器一样管理unikernel容器和网络!

这些早期的工作使得unikernels实现了像Docker部署方式一样的可用目标!既然现在unikernels可以通过Docker进行管理,那么它就可以为unikernels带来所有现有生态系统编排和管理方面的优点。

该演示包括Nginx,MySQL和PHP,LAMP环境典型的几个组件。这些没有改动过的,现成的组件采用Docker工具链使用 unikernels创建,而不是用典型的操作系统!为了运行这些特定的应用,为这些unikernels创建了一个集群。观看下面视频了解更多详情!

视频

参与其中!

这里描述的演示仅仅是个开始。unikernels实现有很多种,并有大量的工作要做,以确保它们都能获得集成后的好处,同样提升Docker充分利用这些新技术的能力。 查看相关的unikernel项目,并向这篇博客贡献你的体验吧!

感谢 AnilBalrajDavid , Jeremy 、、、他们对初稿的意见。