写点什么

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

评论

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

LLM评估:通过7大指标监测并评估大语言模型的表现

Baihai IDP

程序员 AI ChatGPT LLM 白海科技

深入理解技术内容运营

小万哥

程序人生 软件工程 后端开发 技术写作 内容运营

基于深度学习的探地雷达图像去杂波

小酌江风雪

InterSystems 数据库的存储过程存在哪里

HoneyMoose

一文看懂指标管理难题:规范与效率如何兼得?

先锋IT

软件开发

Geek_8da502

一个不会画画的我遇到AI绘画的时代

战场小包

AI AIGC AI绘画 Stable Diffusion controlnet

CodeWhisperer:编码世界中的声音启迪者

亚马逊云科技 (Amazon Web Services)

人工智能 云上探索实验室 Amazon CodeWhisperer

大模型和深度学习的工作总结

6个核桃

浅析RobotFramework工具的使用 | 京东物流技术团队

京东科技开发者

AI大模型时代下运维开发探索第二篇:基于大模型(LLM)的数据仓库

阿里云大数据AI技术

强大的磁盘分析:Disk Xray最新激活版

胖墩儿不胖y

Mac软件 磁盘分析软件 磁盘工具

中国中化、保利集团、中交集团、中国中车……2023年,更多央国企选择用友BIP

用友BIP

数智化转型

坚果的2023年终总结-激流勇进的一年

坚果

年终总结 坚果派

百度CTO王海峰:文心一言用户规模破1亿

飞桨PaddlePaddle

人工智能 深度学习 WAVE SUMMIT

taobao.trades.sold.get( 查询卖家已卖出的交易数据)丨淘宝店铺订单接口

tbapi

淘宝API接口 淘宝店铺订单接口 天猫店铺订单接口 淘宝店铺交易接口 天猫店铺订单交易接口

观测云产品更新 | 智能监控、应用性能监测、场景图表等优化

观测云

APM 智能监控

一款降压型开关模式转换器解决方案

芯动大师

Python笔记三之闭包与装饰器

Hunter熊

Python 装饰器 闭包 装饰器类 装饰器参数

英特尔锐炫显卡暴风成长:游戏领域大放光彩,AI应用表现抢眼

E科讯

记一次JSF异步调用引起的接口可用率降低 | 京东云技术团队

京东科技开发者

华为云CCE集群健康中心:一个有专家运维经验的云原生可观测平台

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟

技术人的 2023 用QCon大会画上完美句号

IT蜗壳-Tango

Qcon

一步一步教你写kubernetes sidecar

华为云开发者联盟

开发 华为云 华为云开发者联盟

江铃晶马 X 袋鼠云:搭建企业级数据资产中心,推进打造“智数晶马”

袋鼠云数栈

大数据 数据中台 数字化转型 案例 大数据平台

IM通讯协议专题学习(十):初识 Thrift 序列化协议

JackJiang

网络编程 即时通讯 IM

携手开发者探索AI PC无限可能,英特尔人工智能创新应用大赛启动

E科讯

一文搞懂Go GC演进史,讲的太细致了!

王中阳Go

Go golang 面试题 垃圾回收 GC

厦门钨业:智慧采购减少采购环节,构建高效产业链

用友BIP

智慧采购

摸鱼摸出来的vue3+element-plus毒蘑菇后台管理:新标签页的实现。

23朵

Vue3 element-plus 后台管理

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