【编者的话】Swarm项目是Docker公司发布三剑客中的一员,用来提供容器集群服务,目的是更好的帮助用户管理多个Docker Engine,方便用户使用,像使用Docker Engine一样使用容器集群服务。这次分享内容从Swarm项目现状、Swarm社区现状和Swarm未来的一些规划三方面介绍Swarm,目的是能让大家对Swarm有个完整的认识,并且希望更多的人采用到Swarm项目中来。

Swarm背景

现实中我们的应用可能会有很多,应用本身也可能很复杂,单个Docker Engine所能提供的资源未必能够满足要求。而且应用本身也会有可靠性的要求,希望避免单点故障,这样的话势必需要分布在多个Docker Engine。在这样一个大背景下,Docker社区就产生了Swarm项目。

Swarm是什么

Swarm这个项目名称特别贴切。在Wiki的解释中,Swarm behavior是指动物的群集行为。比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavior。

Swarm项目正是这样,通过把多个Docker Engine聚集在一起,形成一个大的docker-engine,对外提供容器的集群服务。同时这个集群对外提供Swarm API,用户可以像使用Docker Engine一样使用Docker集群。

Swarm 特点

  • 对外以Docker API接口呈现,这样带来的好处是,如果现有系统使用Docker Engine,则可以平滑将Docker Engine切到Swarm上,无需改动现有系统。
  • Swarm对用户来说,之前使用Docker的经验可以继承过来。非常容易上手,学习成本和二次开发成本都比较低。同时Swarm本身专注于Docker集群管理,非常轻量,占用资源也非常少。 *“Batteries included but swappable”,简单说,就是插件化机制,Swarm中的各个模块都抽象出了API,可以根据自己一些特点进行定制实现。
  • Swarm自身对Docker命令参数支持的比较完善,Swarm目前与Docker是同步发布的。Docker的新功能,都会第一时间在Swarm中体现。

Swarm框架结构

  • Swarm对外提供两种API, 一种是Docker API,用于负责容器镜像的生命周期管理, 另外一种是Swarm集群管理CLI,用于集群管理。
  • Scheduler模块,主要实现调度功能。在通过Swarm创建容器时,会经过Scheduler模块选择出一个最优节点,里面包含了两个子模块,分别是Filter和Strategy, Filter用来过滤节点,找出满足条件的节点(比如资源足够,节点正常等等),Strategy用来在过滤出的节点中根据策略选择一个最优的节点(比如对找出的节点进行对比,找到资源最多的节点等等), 当然Filter/Strategy用户可以定制。
  • Swarm对集群进行了抽象,抽象出了Cluster API,Swarm支持两种集群,一种是Swarm自身的集群,另外一种基于Mesos的集群。
  • LeaderShip模块用于Swarm Manager自身的HA,通过主备方式实现。
  • Discovery Service 服务发现模块,这个模块主要用来提供节点发现功能。
  • 在每一个节点上,都会有一个Agent,用于连接Discovery Service,上报Docker Daemon的IP端口信息,Swarm Manager会直接从服务发现模块中读取节点信息。

Swarm各个模块介绍

集群管理

Swarm Manager CLI用于集群管理。大家可以看这张图,通过三步就可以将集群创建起来。

Swarm容器集群创建完成后,就可以采用Docker命令,像使用Docker Engine一样使用Swarm集群创建容器了。

服务发现

服务发现,在Swarm中主要用于节点发现,每一个节点上的Agent会将docker-egine的IP端口注册到服务发现系统中。Manager会从服务发现模块中读取节点信息。Swarm中服务发现支持已下3种类型的后端:

第一种,是hosted discovery service,是Docker Hub提供的服务发现服务,需要连接外网访问。

第二种,是KV分布式存储系统,现在已支持etcd、ZooKeeper、Consul三种。

第三种,是静态IP。可以使用本地文件或者直接指定节点IP,这种方式不需要启动额外使用其他组件,一般在调试中会使用到。

Scheduler

调度模块主要用户容器创建时,选择一个最优节点。在选择最优节点过程中,分为了两个阶段: 
第一个阶段,是过滤。根据条件过滤出符合要求的节点,过滤器有以下5种:

  1. Constraints,约束过滤器,可以根据当前操作系统类型、内核版本、存储类型等条件进行过滤,当然也可以自定义约束,在启动Daemon的时候,通过Label来指定当前主机所具有的特点。
  2. Affnity,亲和性过滤器,支持容器亲和性和镜像亲和性,比如一个web应用,我想将DB容器和Web容器放在一起,就可以通过这个过滤器来实现。
  3. Dependency,依赖过滤器。如果在创建容器的时候使用了--volume-from/--link/--net某个容器,则创建的容器会和依赖的容器在同一个节点上。
  4. Health filter,会根据节点状态进行过滤,会去除故障节点。
  5. Ports filter,会根据端口的使用情况过滤。

调度的第二个阶段是根据策略选择一个最优节点。有以下三种策略:

  1. Binpack,在同等条件下,选择资源使用最多的节点,通过这一个策略,可以将容器聚集起来。
  2. Spread,在同等条件下,选择资源使用最少的节点,通过这一个策略,可以将容器均匀分布在每一个节点上。
  3. Random,随机选择一个节点。

Leadership

Leadership模块,这个模块主要用来提供Swarm Manager自身的HA。

为了防止Swarm Manager单点故障,引入了HA机制,Swarm Manager自身是无状态的,所以还是很容易实现HA的。 实现过程中采用主备方式,当主节点故障以后,会从新选主提供服务,选主过程中采用分布式锁实现,现在支持etcd、ZooKeeper、Consul三种类型的分布式存储,用来提供分布式锁。 当备节点收到消息后,会将消息转发给主节点。

以上就是框架中各个模块的相关介绍,下来和大家一起再看一下,Swarm与周边项目的集成。

首先看一下,与三剑客之间的集成。

Swarm与周边项目集成

三剑客是Docker公司去年底发布的三个项目,这三者是可以紧密协作的。可以看一下这张图:

最下面是Machine,通过Machine可以在不同云平台上创建出包含docker-engine的主机。Machine通过driver机制,目前支持多个平台的docker-egine环境的部署,比如亚马逊、OpenStack等。 Docker Engine创建完以后,就该Swarm上场了,Swarm将每一个主机上的docker-egnine管理起来,对外提供容器集群服务。最上面是Compose项目,Compose项目主要用来提供基于容器的应用的编排。用户通过yml文件描述由多个容器组成的应用,然后由Compose解析yml,调用Docker API,在Swarm集群上创建出对应的容器。

我们知道现在围绕Docker已经产生了很大的一个生态圈。 因此Swarm不仅在和自家兄弟集成,也能积极和周边的一些项目集成。比如,Swarm现在已经可以和Mesos进行集成。Swarm与Mesos集成时,也是以Framework方式集成,实现了Framework所需的接口。这个大特性处在experiment阶段。

Swarm社区的现状

Swarm项目去年底发布,发展了短短半年时间,已经到了0.4版本,目前还处于正在快速演进阶段。 Swarm发布版本周期目前是跟着Docker一起发布,基本上两个月一个版本,在开发过程中,采用迭代方式开发,基本上每两个星期完成一轮迭代。参与社区的方法基本上和其他社区一致。当遇到问题时,可以在社区创建issue,然后描述问题,最好能上环境信息以及问题重现的步骤,这样有利于问题的定位。当然也可也直接通过IRC或者邮件直接交流。 Swarm社区很欢迎大家的参与,不论是使用中遇到的问题以及Bug,还是Swarm功能上目前无法满足大家的地方。都欢迎大家提出来,一起讨论。

如果对代码感兴趣的话,可以参考Docker社区的提交代码流程来提交代码,也非常欢迎大家能够参与到Swarm社区中提交代码。

Swarm未来规划

  1. 首先是支持所有的Docker API,现在支持率大概在95%,其中一些实现还存在问题,需要改进。
  2. 第二块是网络部分,通过Libnetwork项目,实现overlay network。
  3. 第三块是Self healing,通过这一个功能可以实现,当一个节点故障以后,会将故障节点上的容器在另外一些节点上创建。
  4. 第四块是Global Scheduler。这个特性主要用来将一个容器在每一个节点上进行创建。比如,想将一个log容器在每一个节点创建,用来记录日志,则可以通过这一特性实现。
  5. 最后是volume,这一块社区最近在讨论。

Q&A

Q:Kubernetes和Swarm 相比较来看如何选择呢?
A:一个很Open的话题,根据特点,选择适合自己的就OK。Swarm对外提供Docker API,自身轻量、学习成本、二次开发成本都比较低,自身是插件式框架。从功能上讲,Swarm是Q:Kubernetes的一个子集,个人感觉,Compose+Swarm =Kubernetes。

Q:Swarm最终目标是什么,只是为了管理容器吗,有没有考虑过提升资源利用率,会把资源弹性伸缩做上来吗,最终把所有机器负载提升,防止有些低负载或空负载浪费资源?
A:Auto-scaling能力,个人感觉后边可能通过Compose来实现,感兴趣的话,可以在Swarm社区提一个proposal。

Q:Swarm对节点的选取是否可定制化,指的是策略选择,感觉只有这三种不够强大?
A:可以,可以根据自己的特点实现对应API。

Q:调用Swarm API及Swarm调Docker API 安全认证是怎么做的?
A:安全这部分是通过SSL协议实现通信安全以及认证,支持Swarm对外(比如与Client)之间的提供通信安全,同时Swarm与Docker Engine之间的也支持通信安全。

Q:Swarm怎么跨节点link?
A:目前不支持跨节点,如果使用了link,创建的容器和link的容器会被调度到同一个节点上。

Q:Swarm的调度系统也是插件形式?可以使用Mesos的资源调度吗?
A:Swarm调度器是插件形式。Mesos采用两层调度框架,第一层,由mesos将符合框架的资源上报给框架,第二层,框架(swarm)自身的调度器将资源分配给任务。

Q:Swarm IP是怎么管理的?Swarm 下的各个节点是动态分配IP的么?
A:当前网络部分还是用docker-engine自身的能力,后续会和libnetwork进行集成,具体怎么管理正在讨论中。

Q: swarm支持根据docker的标签来调度吗?
A: 支持,通过Constraints Filter来实现。

Q:网络部分集成除了libnetwork还有其他计划或者考虑吗?
A:libnetwork自身也提供了plugin机制,个人理解,和其他网络项目很好集成。

DockOne技术分享(二十):Docker三剑客之Swarm介绍的更多相关文章

  1. Docker三剑客之Swarm介绍

    DockOne技术分享(二十): 我用swarm在多台物理机调度管理容器,用ovs实现跨主机的容器互联问题 [编者的话]Swarm项目是Docker公司发布三剑客中的一员,用来提供容器集群服务,目的是 ...

  2. Docker 三剑客 到 k8s 介绍

    一.Docker 三剑客 Docker-Compose Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启 ...

  3. Docker(二十)-Docker容器CPU、memory资源限制

    背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不 ...

  4. php分享二十六:支付系统设计

    一个典型PHP支付系统的设计与实现 参考:blog.sina.com.cn/s/blog_81f6205801017ec8.html 微信支付开发: http://www.cnblogs.com/tx ...

  5. php分享二十九:命名空间

    1:命名空间的命名不区分大小写 2:namespace必须在所有代码之前,除了declare语法以外(不过他之前可以有注释,空行等) 3:只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和t ...

  6. php分享二十八:mysql运行中的问题排查

    一:杀掉mysql连接的方法: kill thread_id:  杀掉当前进程,断开连接 kill query thread_id: 只杀掉某连接当前的SQL,而不断开连接. 批量杀死MySQL连接的 ...

  7. php分享二十五:跨域请求

    问题: 跨域请求有几种方式? jsonp支持哪几种请求方式? 支持post请求吗? 支持get请求吗? 由于浏览器同源策略,凡是发送请求url的协议.域名.端口三者之间任意一与当前页面地址不同即为跨域 ...

  8. php分享二十:mysql优化

    1:垂直分割 示例一:在Users表中有一个字段是家庭地址,这个字段是可选字段,相比起,而且你在数据库操作的时候除了个人信息外,你并不需要经常读取或是改写这个字段.那么,为什么不把他放到另外一张表中呢 ...

  9. JavaSE 学习笔记之反射技术(二十四)

    反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好 ...

随机推荐

  1. Oracle数据库自动启动Shell脚本

      为了保证Oracle在下次系统重启后,能自动启动服务,这里我们可以通过一个Shell脚步来实现这个功能.假定脚步名称为/app/oracle/oraclestart.sh,其内容如下: #!/bi ...

  2. VIM正则表达式。

    看了那个30分钟正则表达式入门.但是是在VIM使用过程中偶尔会出现达不得想要效果的情况.后面百度了下,确然,VIM的正则还是有点区别的. 转自:http://www.cppblog.com/kefen ...

  3. linux安装桌面环境(GNOME)VNC连接Linux

    1.安装Gnome桌面 这里是使用的脚本安装.代码如下:  加附件 #!/bin/sh #This script is FREE and written by www.vpsyou.com   # i ...

  4. (转)Qt Model/View 学习笔记 (六)——在views中选择数据项

    在views中选择数据项 概念 用于新的view类中的选择模型比Qt3中的模型有了很大的改进.它为基于model/view架构的选择提供了更为全面的描述.尽管对提供了的views来说,负责操纵选择的标 ...

  5. The C++ Programming Language 学习笔记 第四章 类型和声明

    1.关于main 函数中的 return 0 C99标准中,main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统).如果 main 函数的最后没有写 return ...

  6. html常用标签表单和表格等及css的简单入门

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 理解运用JS的闭包、高阶函数、柯里化

    JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...

  8. 使用Redis构建支持程序

    在Linux和Unix世界中,有两种常见的记录日志的方法.第一种是将日志记录到文件里面,然后随着时间流逝不断地将一个有一个日志行添加到文件里面,并在一段时间之后创建新的日志文件.包括Redis在内的很 ...

  9. Go语言中异常处理painc()和recover()的用法

    Go语言中异常处理painc()和recover()的用法 1.Painc用法是:用于抛出错误.Recover()用法是:将Recover()写在defer中,并且在可能发生panic的地方之前,先调 ...

  10. 记录GOPATH在GOLAND中的坑

    首先我的环境已配置好: GO的目录结构是: add.go package calc//函数名必须大写首字母,不然外部包找不到 func Add(a int,b int)(int){ return a+ ...