速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

Docker Swarm 与 Apache Mesos 的区别

  • 2015-12-27
  • 本文字数:4026 字

    阅读完需:约 13 分钟

Docker Swarm 是目前 Docker 社区原生支持的集群工具,它通过扩展 Docker API 力图让用户像使用单机 Docker API 一样来驱动整个集群;而 Mesos 是 Apache 基金会下的集群资源管理工具,它通过抽象主机的 CPU、内存、存储等计算资源来搭建一套高效、容错、弹性的分布式系统。

显然,这两者功能上有交集,网络上也有很多关于 Docker Swarm, Mesos 和 Kubernetes 之间区别的讨论,作为一个 Mesos 重度用户,最近也抽时间把玩了下 Docker Swarm。一路下来,Docker Swarm 给我的感觉首先是它特别简单、灵活,相较于 Mesos 而言, Docker Swarm 对集群的侵入性更小,从而资源损耗也更低;其次,我特别想强调的是目前看来,虽然它与 Mesos 之间功能有重叠,但是两者关注在不同的东西上了,所以拿这两者作比较没有多大意义。当然,未来这种情况可能会发生变化,这取决于社区的 roadmap 。下面我会从多个角度把 Docker Swarm 和 Mesos 进行比较。

配置

在安装配置方面,Docker Swarm 要比 Mesos 简单的多。使用 Docker Swarm 搭建一套集群,最简单的情况下只需要 3 步:

  1. 通过 shell 命令 swarm create 生成一个集群的 token;
  2. 借助这个 token 将想要添加到集群的主机广播到 Docker Hub 集群发现 的公共服务(Hosted Discovery with Docker Hub)上,这样我们就把主机添加集群中了;
  3. 接下来通过命令 swarm manage 以及相应的 token 我们就可以在任何一台连接到互联网的主机上管理我们的集群了。

进一步,为了安全和性能起见,如果我们想脱离 Docker Hub 集群发现 的公共服务,我们只需要在第 1 步使用 staticfile、consul、etcd 或者 ZooKeeper 中的任意一个,甚至是静态的 IP 列表来做集群发现即可。

与 Docker Swarm 不同,我们必须保证 Mesos 的管理节点(master,相当于上述第 3 步中的 manager 机器)一直正常运行,然后才能向集群中添加 agent/slave 节点;另外向集群中添加节点时还需要配置 resource,containers 等基本参数;最后只搭建好了 Mesos 集群是无法方便的使用集群资源的,我们需要 Marathon、Chronos、Spark 等调度器去调度资源,才能真正使用起这套东西。显然 Mesos 的配置要比 Docker Swarm 复杂的多,当然这主要也是由 Mesos 需要支撑多种资源调度导致的。

易用性

由于 Docker Swarm 对外提供完全标准的 Docker API,只需要理解 docker 命令,用户就可以开始使用 Swarm 集群了; 而对于 Mesos 来说, 我们需要额外了解 Marathon 等调度器的 API 才能真正将 Docker 任务发布到集群上。当然 Marathon 调度器也为我们带来了好处,譬如 docker 容器的健康检查,失败重启机制等。

架构

我们首先参考博客 《 Weave Discovery and Docker Swarm 》里的架构图来分析下 Docker Swarm 的架构。

图中 vm1 和 vm2 代表集群中的计算节点,集群的每个节点上都运行着一个 swarm-agent 的 Docker 容器,这个 swarm-agent 负责向 集群发现的后台(backend)广播节点的 IP,其中 backend 我们在上面的配置部分已经提过,它可以是 Docker Hub 集群发现的公共服务或者是 etcd, consul、ZooKeeper 等一致性中间件;

vmmaster 代表集群中的管理节点,它上面运行着 swarm-manager 的容器,其中 vmmaster 是能够访问 backend 的任意机器, 譬如笔记本等;swarm-manager 通过监听 backend 来获取集群信息, 然后访问 vm1,vm2 的 docker daemon 程序的 REST API 接口部署容器等。

同时,我们借用 http://www.ericsson.com/research-blog/data-knowledge/mesos-meetup-hosted-ericsson-research/ 中的 Mesos 架构图解释下 Mesos 的架构,图中的 Mesos Slave 代表集群中的计算节点,对应于上图的 vm1/vm2;Mesos Master 与 MarathonScheduler 合起来一起对应于上图中 vmmaster;Mesos Master 是主动向其调度器 offer 资源的, 然后由调度器决定是否接受这些资源。

至此,我们已经可以发现两者的不同,Mesos 是支持多种调度器的,Docker 容器型的任务,Hadoop、Spark 的计算任务等都可以运行在 Mesos 框架上,Mesos 强调的是资源混用的能力;而 Docker Swarm 只专注于 Docker 容器型任务。从而,依据不同的调度器,Mesos 的执行器(executor)是可配置的;而 Docker Swarm 只需要 Docker Daemon 一种执行器。

集群高可用/容错

Docker Swarm 与 Mesos 都可以通过一致性中间件构造高可用集群。Mesos 的 Master 节点一般通过 ZooKeeper 保证高可用,而 Docker Swarm 的 manager 节点可以通过 consul、etcd 或 ZooKeeper 中的任意一个来保证高可用。 但是从目前 Docker Swarm 的架构来看,Swarm manager 节点的高可用不是必需的,因为即使 manager 节点宕机了,Swarm 的原有服务也不会受到影响。我还有一种更极端的想法, Swarm 集群平时不需要 manager 节点,只有在需要 metrics 信息,发布新的应用,或者健康检查时再启动 manager 服务即可,这是因为 manager 节点目前的功能非常单一,像容器的健康检查,失败重启等功能还没有实现,文档中提到的资源管理,以及服务中断等机制也都没有详细的介绍,我估计应该还在开发中。

基本的健康检查

截止我写这篇文章时,Docker Swarm 没有提供对其部署的容器进行健康检查的功能,所以需要容器部署方来进行相应的容器的健康检查以及异常重启等;而 Mesos 的调度器 Marathon 是支持健康检查的,它可以每隔一段时间扫描一次应用的绑定端口,并在容忍 3 次或者几次失败后将应用重启,目前支持 HTTP、TCP 协议,当然,这都需要应用提供 health 的接口。

可扩展性 / 可插拔

由于 Docker Swarm 使用标准的 Docker API,从而任何使用 Docker API 与 Docker 进行通讯的工具都可以无缝地和 Docker Swarm 协同工作,譬如与 docker-compose 结合实现多主机 scale 容器,这个与 Kubernetes 的 Pod 非常类似;与 Shipyard 集成等。但这对 Docker Swarm 来说也是一个缺点:你只能做 Docker API 规定的事情。如果 Docker API 不支持某个你要的功能,你就不能直接使用 Docker Swarm 来实现,你可能需要使用一些特别的技巧来实现(也可能完全不能实现)。

Mesos 的可扩展性首先在于它可以承接各种调度器,Spark、Hadoop、Kafka、Cassandra、Marathon、Chronos 等等都可以拿 Mesos 来做资源池;其次,Mesos 可以与 Mesos-DNS 结合来实现内部的服务发现 / 负载均衡。

另外,Docker Swarm 也可以与 Mesos 结合,在 Docker Swarm 的 repo 里面有一个 docker-swarm-on-mesos 子模块 https://github.com/docker/swarm/tree/master/cluster/mesos 。Docker Swarm 可以借助它成为 Mesos 的调度器,使用 Mesos 资源池里面的资源。但是目前我个人还没有发现这种结合的价值,唯一能够想到的一点就是可以借此绕过 Mesos 来直接调度 docker 容器同时集群仍然支持资源混用,毕竟我们通过 Mesos 来直接操纵单个容器没有那么方便。

弹性

Mesos 与 Docker Swarm 都支持的向集群添加新的节点。

调度

Docker Swarm 对容器的调度已经相当丰富:

  • 通过参数 constraint 将容器发布到带有指定 label 的机器上。譬如将 MySQL 发布到 storage==ssd 的机器上来保证数据库的 IO 性能;
  • 通过参数 affinity 将容器发布到已经运行着某容器的机器上,或者已经 pull 了某镜像的机器上;
  • 通过参数 volumes-from, link, net 等将容器自动发布到其依赖的容器所在的机器上;
  • 通过参数 strategy 可以指定 spread,binpack 和 random 3 种不同 ranking node 策略,其中 spread 策略会将容器尽量分散的调度到多个机器上来降低机器宕机带来的损失,反之 binpack 策略会将容器尽量归集到少数机器上来避免资源碎片化,random 策略将会随机部署容器。

由于 Mesos 更加 generic,其在容器调度方面稍显欠缺,目前我们可以通过设置主机 attribute 来将容器调度到指定的机器上。

选择

当你尝试在 Docker Swarm 和 Mesos 之间做选择的时候,可以考虑以下几点。

  • 你要部署的集群只是运行 Docker 容器么?如果是,你可以考虑 Docker Swarm,否则如果你的集群资源需要混用,你最好尝试 Mesos。
  • 你要部署的集群是大型生产环境么?如果是,建议优先考虑 Mesos, 毕竟 Docker Swarm 还在开发中,而 Mesos 已经被国内外很多公司应用于生产环境上了;如果你只是想尝试 Docker 相关的东西,请考虑 Docker Swarm。
  • 你或你的团队有足够丰富的 Linux 和分布式经验么?如果没有,建议考虑 Docker Swarm,毕竟 Docker Swarm 的配置使用都更简单,更易于 troubleshooting;而使用 Mesos 集群,你需要解决 docker 之外的很多问题,Mesos 将成为你额外的负担。

最后,想再强调一遍,Mesos 更多的是从经济学角度出发来提高整个集群的资源利用率,拿它跟 YARN、Google Borg 作比较更合适;而 Docker Swarm 专注于 Docker 的集群管理,拿它跟 Kubernetes 比较可能更合适。 当然,在容器集群管理复杂度的问题上,基于 Mesos 的商业产品 DCOS,如:国外的 Mesosphere,国内的数人云,都已经做的非常简单和易用了。

所以总的来说,如果您想搭建一套集群生产环境,从稳定性和可扩展性来看,建议选择 Mesos;如果是仅想运行 Docker 容器,从易用性角度来看,建议采用 Docker Swarm。

作者简介

周伟涛,现数人科技云平台负责人,曾就职于国际开源解决方案供应商 Red Hat, 红帽认证工程师, Mesos Contributor,高级 Python 开发工程师。 是国内较早一批接触使用 Docker、Mesos 等技术的开发者。

参考

  1. http://technologyconversations.com/2015/11/04/docker-clustering-tools-compared-kubernetes-vs-docker-swarm/
  2. http://stackoverflow.com/questions/27640633/docker-swarm-kubernetes-mesos-core-os-fleet
  3. https://github.com/docker/docker/pull/8859
  4. https://github.com/docker/docker/issues/8781

感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-12-27 17:198465

评论

发布
暂无评论
发现更多内容

大数据培训学习合适吗?

小谷哥

女生参加前端培训,学习不如男生吗?

小谷哥

「Go工具箱」web中想做到cookie值安全?securecookie库的使用和实现原理

Go学堂

golang 开源 程序员 Cookie WEB安全

Git本地提交代码推送远程并未统计贡献量问题分析

Andy

云BI,如何成为了企业的“贴身管家”?

夏日星河

链表只有面试有用?Redis 之父说:我不同意!

图灵教育

算法 链表 Redis 数据结构

链表只有面试有用?Redis 之父说:我不同意!

图灵社区

算法 链表 Redis 数据结构

工业互联网新引擎——灵雀云 × 英特尔 5G融合边缘云解决方案

York

云原生 5G 边缘计算 架构设计 云边端协同

如何实现对象存储?

MatrixOrigin

数据库 分布式数据库 对象存储 MatrixOrigin MatrixOne

React高级特性之Render Props

夏天的味道123

React

react进阶用法完全指南

xiaofeng

React

大咖圆桌|研发想要降本增效?来听听专家们的前沿洞见

万事ONES

react组件深度解读

xiaofeng

React

HummerRisk 快速入门教程

HummerCloud

云安全 云原生安全 11月月更 HummerRisk

开源遇上华为云——DataX for HuaweiCloud OBS

华为云开发者联盟

开源 后端 华为云 企业号十月 PK 榜

豆瓣评分8.0!深入理解Java虚拟机,把GC算法与实现讲得明明白白!

Java永远的神

程序员 面试 JVM GC Java虚拟机

MindStudio模型训练场景精度比对全流程和结果分析

华为云开发者联盟

人工智能 华为云 企业号十月 PK 榜

湘潭等级测评机构有哪些?排名是怎样?

行云管家

等保 等级保护 等保测评 等保测评机构

Nydus | 容器镜像基础

SOFAStack

Nydus

线上kafka消息堆积,consumer掉线,怎么办?

Java永远的神

Java kafka 程序员 程序人生 消息中间件

LED显示屏设计和安装比例有什么联系

Dylan

LED显示屏 户外LED显示屏 led显示屏厂家

大学生想进大厂是通过自学还是java培训

小谷哥

深圳哪所前端培训机构比较靠谱

小谷哥

react-Suspense工作原理分析

夏天的味道123

React

CSS 如何实现五彩斑斓的“呼吸字”?速度拿去装杯!

掘金安东尼

CSS 11月月更

CRAFTS:端对端的场景文本检测器

合合技术团队

人工智能 深度学习 文字识别 端口 文本检测

云资源管理平台有哪些?重点推荐哪家?

行云管家

云计算 云服务 云资源 云管理

React高级特性之Context

夏天的味道123

React

融云「百幄」之视频会议和直播,让办公桌无限延伸

融云 RongCloud

直播 视频会议 通讯

React组件通信

xiaofeng

React

火山引擎钜惠双11开启,云服务器0.71折起

Geek_2d6073

Docker Swarm与Apache Mesos的区别_开源_周伟涛_InfoQ精选文章