Docker、Kubernetes和Apache Mesos: 谁会是容器领域的霸主?

当下有无数的文章和大量的社区讨论在对比Docker、Kubernetes和Mesos这三个开源容器项目。如果只听部分内容,你会认为三者正在为争夺容器的霸主地位而战。你也会相信,选择只能是一个,就像宗教信仰的唯一选择一样:真正的信徒们拥护他们的信仰并坚决抵制选择其他的异教徒。

其实这都是胡扯。

尽管这三种技术都可以解决容器技术在部署、管理和扩展应用程序上的要求,但实际上它们各自解决了不同的问题,并扎根于非常不同的环境。事实上,这三种被广泛采用的技术,没有一种与其他两者完全相同。

与其比较这些快速发展的技术的重叠性,不如来回顾一下每项技术初创时的使命、体系结构以及它们如何相互补充和作用。

Docker

今天的Docker inc.是由一家名为“dotCloud”的平台即服务(PaaS)初创公司发展而来的。dotCloud团队发现,管理应用程序的二进制文件及其所依赖的系统组件需要投入巨大的精力。因此,他们将Linux cgroups和namespaces的一些功能组合到一个单一且易于使用的包中,这样应用程序就可以在任何基础设施上持续运行。这个包就是Docker镜像,它提供以下功能:

  • 将应用程序和库打包在单个包中(Docker镜像),因此应用程序可以跨环境部署;
  • 提供诸如“docker推送”、“docker提交”等类似于“Git”的语义,让应用程序开发人员可以轻松地采用新技术,并将其集成到现有工作流中;
  • 将Docker镜像定义为一个隔离的层,使之与基础结构分开。提交的更改只在本层执行和存储,这使得重复使用镜像和跟踪更改变得很容易。层还通过传输更新而不是整个镜像来节省磁盘空间和网络流量;
  • Docker容器可以临时存储运行中的更改,从而可以快速部署和扩展应用程序的多个实例。

Docker越来越受欢迎,开发人员逐渐从笔记本电脑上运行容器转而向生产环境中运行。如果想在多个机器之间协调这些容器则需要额外的工具,这被称为容器编排(orchestration)。有意思的是,第一批用来支持Docker镜像(2014年6月)的容器编排工具是Apache Mesos的Marathon (我们将在下面详细介绍)。那一年,Docker的创始人兼首席技术官Solomon Hykes 评价Mesos为“生产集群的黄金标准”。不久之后,除了Mesos、Marathon之外,涌现了许许多多容器编排技术:Nomad,Kubernetes和Docker Swarm(现在是Docker引擎的一部分)。

随着Docker将开源文件格式商业化,该公司也开始推出工具以补充核心Docker文件格式和运行时引擎,包括:

  • Docker hub:公有云储存Docker镜像;
  • Docker registry:在本地存储的注册中心;
  • Docker  cloud:一种用于构建和运行容器的云托管服务;
  • Docker数据中心:作为一项商业服务,融合了许多Docker技术。
 

Docker将软件及其依赖包封装在单个包中的模式,就好像mp3的推出重塑了音乐产业,对软件行业来说完全改变了游戏规则;Docker文件格式已成为行业标准,促使容器技术供应商(包括Docker、Google、Pivotal、Mesosphere等)形成了两大组织Cloud Native Computing Foundation (CNCF)和Open Container Initiative(OCI)。今天,CNCF和OCI的目标是确保跨容器技术的互操作性和接口标准化,并确保任何使用任何工具构建的Docker容器能够在任何运行时或基础设施上运行。

Enter Kubernetes

Google在早期就意识到了Docker镜像的潜力,并希望在Google云平台上提供“as-a-service”的服务。谷歌在容器方面有丰富的经验(他们在Linux中引入了cgroups)。但是,Google现有的内部容器和分布式计算工具如Borg直接与他们的基础设施连接。因此,谷歌没有从现有系统中使用任何代码,而是从零开始设计了Kubernetes来编排Docker集群。Kubernetes在2015年2月发布了以下目标和考量:

  • 为应用开发人员提供编排Docker容器的强大工具,而无需与底层基础设施进行交互;

  • 为应用程序部署的一致性体验和跨云的API提供标准的部署接口;
  • 构建一个模块化的API核心,允许供应商围绕核心的Kubernetes技术做集成系统。

到2016年3月,谷歌将Kubernetes捐赠给了CNCF,并在今天仍然是该项目的主要贡献者(其次是Redhat、CoreOS和其他供应商)。

Kubernetes对应用程序开发人员非常有吸引力,因为它减少了对基础设施和运维团队的依赖。厂商也喜欢Kubernetes,因为它提供了一种简单的方式来支持容器技术的发展,并针对运行自行部署的Kubernetes操作时面临的挑战提供了一个商业解决方案 (这仍然是一个不平凡的举措)。另外,Kubernetes更强的吸引力,是因为它是CNCF下的开源项目。与Docker Swarm相比,后者虽然是开源项目,但是受到Docker公司的严格控制。

Kubernetes的核心优势在于为应用程序开发人员提供了强大的工具,用于编排无状态的Docker容器。目前尽管有多个计划将Kubernetes项目的范围扩展到更多的工作负载(如分析和状态数据服务),但是这些计划仍然处于非常早期的阶段,还有待观察它们的成功与否。

Apache Mesos
Apache Mesos最初是加州大学伯克利分校的一个项目,目的是创建下一代集群管理器(cluster manager)。这个项目借鉴了从诸如Google的Borg和Facebook的“Tupperware”等云计算、分布式计算基础设施中学习到的经验教训。Borg 和 Tupperware是单一的体系结构,而且是与物理基础设施相关的封闭的专有技术,而Mesos引入了一种模块化的体系结构,采用开源的开发方法,被设计为完全独立于底层基础设施。Mesos很快被Twitter、Apple(Siri)、Yelp、Uber、Netflix和许多领先的科技公司所接受,并被用于微服务、大数据、实时分析和到弹性伸缩等领域。

作为集群管理器,Mesos的架构是为了解决一套截然不同的挑战:

  • 将数据中心资源抽象为单个池,以简化资源配置,同时提供跨私有或公共云的一致性的应用程序和操作经验;
  • 在相同的基础设施上使用不同的工作负载,比如分析、无状态的微服务、分布式数据服务和传统应用程序,以提高利用率和降低成本和占用空间;

  • 针对上线后的应用运维进行自动化,例如部署、自愈、扩展和升级,提供高可用的容错基础设施;
  • 在不修改集群管理器或任何现有应用程序的基础上,提供运行新应用程序和技术的永久的可扩展性;
  • 弹性地将应用程序和底层基础设施从少数几个,扩展到数十个乃至数万个节点。
Mesos具有独特的能力,即可以单独管理各种不同的工作负载,包括传统的应用程序,如Java、无状态的Docker微服务、批处理工作、实时分析和有状态的分布式数据服务。Mesos的广泛工作负载得益于它的两层架构,它支持“应用程序”的调度。应用程序感知的调度是通过将特定于应用程序的操作逻辑封装在“Mesos框架”中(类似于操作中的runbook)来完成的。资源管理器 Mesos Master,在保持隔离的情况下,为这些框架提供了底层基础设施的一部分。这种方法允许每个工作负载都有自己专用的应用程序调度器,可以承接它的部署、扩展和升级的特定操作需求。应用程序调度程序也独立开发、管理和更新,使得Mesos具有高度的可扩展性,支持新的工作负载,或者随着时间的推移添加更多的操作能力。

以一个团队如何管理升级为例。无状态应用程序可以从“blue/green”部署方法中获益;这款应用的另一个完整版本在旧版本还运行着的时候就会上线部署,当用户准备好时,流量会切换到新应用,旧应用也会被销毁。但是,升级像HDFS或Cassandra这样的数据工作负载,需要把每个node依次下线处理。这样做的目的是:保持本地的数据量以避免数据丢失,执行特定的序列升级,并在升级之前和之后对每个节点类型执行特殊的检查和命令。这些步骤中的所有环节针对特定的应用程序或服务,甚至是特定版本进行的。使用传统的容器编排调度程序在用以上这些操作在来管理数据服务是异常困难的。

Mesos能够管理每一个工作负载的能力,使得许多公司都将Mesos作为一个统一的平台,将微服务和数据服务结合在一起。运行数据密集型应用程序的一个通用参考架构是“SMACK STACK”。

注意
请注意,我们在描述Apache Mesos时,没有提起任何容器编排的内容。那么,为什么人们会自动将Mesos与容器编制联系起来呢? 容器编排是一个可以在Mesos的模块化体系结构上运行的工作负载的例子,它使用了一个专门的“编排”框架Marathon。Marathon最初是为了在cgroup容器中编排应用程序存档(如jar、tarball、ZIP文件)而开发的,并在2014年成为首批支持Docker容器的容器编排器之一。

因此,当人们将Docker、Kubernetes和Mesos进行比较时,他们实际上是在对比Kubernetes、Docker Swarm和Mesos上运行的Marathon。

为什么这很重要?因为坦白地说Mesos它不关心上面运行的是什么。Mesos可以为Java应用服务器、Docker容器编排、Jenkins CI任务、Apache Spark分析、Apache Kafka流,以及更多的共享基础设施提供弹性的集群服务。Mesos甚至可以运行Kubernetes或其他容器的组合器,尽管目前还没有公开集成。

Mesos的另一个考虑(以及为什么它对许多企业架构师有吸引力)是它在运行任务关键工作负载时的成熟度。Mesos已经在大规模生产环境(数万台服务器)中,使用超过7年的时间,这就是为什么我们说,在市场上它比其他许多的容器支持(container-enable)的技术更成熟,更可靠。

如何选择
总之,这三种技术都与Docker容器有关,并为应用程序的可移植性和规模提供了容器编排。那么如何在三者之间做出选择呢?归根到底在于为工作选择合适的工具(对于不同的工作,可能是不同的工具)。如果您是一名应用程序开发人员,寻找一种现代的方式来构建和打包应用程序,或者加速微服务计划,那么Docker容器格式和开发工具就是最好的方法。

如果你是一个dev / devops团队, 想要构建一个专门的docker容器编排系统,并愿意亲手搭建底层基础设施集成解决方案(或依赖于公共云基础设施如谷歌引擎或Azure容器服务),Kubernetes不失为一个很好的技术值得考虑。

如果您想构建一个可靠的平台,可以运行多个任务关键的工作负载,包括Docker容器、传统应用程序(例如:Java)和分布式数据服务(例如:Spark、Kafka、Cassandra、Elastic),并希望所有的数据都能在云服务提供商和/或数据中心可移植,那么Mesos(或者我们自己的Mesos分布,Mesosphere DC/OS)是正确的选择。

无论您如何选择,您都将采用一组工具,这些工具可以使您更有效地利用服务器资源、简化应用程序的可移植性,并提高开发人员的敏捷性。你的选择不容有失。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>