写点什么

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:198532

评论

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

电商网站商品管理(三)group by+avg+sort等聚合分析

escray

elasticsearch elastic 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

2021年-iOS面试进阶资料总结(备战年后)

iOSer

学习 面试 iOS Developer iOS 架构RxSwift

【CSS】文字特效(text-shadow)

德育处主任

CSS css3 html/css CSS小技巧 28天写作

深入理解nodejs中的异步编程

程序那些事

多线程 nodejs 异步编程 程序那些事 回调

案例研究之聊聊 QLExpress 源码 (八-1)

小诚信驿站

聊聊架构 28天写作 QLExpress源码 聊聊源码

为什么越南不会成为世界工厂?

JiangX

供应链 工业 28天写作 制造

突破瓶颈,“iOS开发”,跳槽面试必备题(针对年后面试者)

Geek_24a3d9

面试 简历 ios开发

python自学 第二章 python语言基础之语法特点(注释、代码缩进、编码规范)

WEB前端修行日志

Python 编码格式

架构师训练营第八周课后作业

万有引力

Java虚拟机内存模型

xcbeyond

Java JVM Java虚拟机 28天写作

2021年“区块链+”将会如何发展?

CECBC

区块链

听过闰年闰月,听过闰秒吗?

艾小仙

后端

如何轻松面过阿里社招Java岗,九大核心模块为你保驾护航!(知识点+面经)

Java架构追梦

Java 架构 面试

网络攻防: 爬虫的钳形攻势

杨东冬

大数据 安全攻防 网络安全 爬虫 安全

Spring Boot 中的全局异常处理

武哥聊编程

Java springboot SpringBoot 2 异常处理 28天写作

线上问题排查学习总结

原来不悔

Java Linux

沉寂唯品会3年,毅然辞职冲刺阿里,我是怎么备战金三银四的?

比伯

Java 编程 架构 面试 程序人生

不愧是Github上疯传的腾讯Java全栈进阶笔记!总结的太全啥都有!

Java架构之路

Java 程序员 架构 面试 编程语言

python自学 第三章 python语言基础之保留字、标识符与内置函数

WEB前端修行日志

Python 编码格式

区块链赋能物流行业:“圈子文化”下,网络货运的数字化转型之路

CECBC

区块链 区块链物流

餐饮品牌资产上链,产业区块链史诗级浪潮已到来

CECBC

餐饮

有些软件,听着听着就没了...

艾小仙

互联网

做事情的三条边

石云升

28天写作 基线 极限

使用 JSX 建立 Markup 组件风格

三钻

大前端 组件化

编程语言学习心得 (完全版) -- 不要害怕遗忘和混淆

蔡超

程序员 个人成长 编程语言 Go 语言

架构师训练营 - 第三周作业

Mark

Redis 学习笔记 04:跳跃表

架构精进之路

redis 七日更 28天写作

阿里首推的“SpringBoot+Vue全栈项目”有多牛X?

Java架构之路

Java 程序员 架构 面试 编程语言

爱了爱了!阿里爆款Spring进阶宝典,涵盖其所有技术栈(源码+实战彻底玩转Spring框架)

Java架构之路

Java 程序员 架构 面试 编程语言

是什么可以在Github上标星85.4K,揭秘阿里Springboot项目笔记!

996小迁

Java 架构 面试 springboot

week8-conclusion

J

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