一、 背景
Docker 是一款开源容器虚拟化实现技术,由DotCloud公司于2014年8月开源,具有简化应用部署和运维的复杂度的优势(比如开发环境是Ubuntu,上线环境是Redhat,可能会因环境异构导致应用环境配置修改,致使部署耗时),已成为时下关注最高的云计算技术。
Docker核心是采用模型驱动方法,固化应用及其运行环境(容器模版),使得应用运维人员只需对容器模版进行启动/停止操作,即可完成应用部署和维护。Docker更像是进程环境的模拟,它采用cgroup技术实现容器进程之间的资源隔离,基于Namespace和端口重映射机制解决容器内应用的配置冲突问题(比如多个应用配置的端口为8080,上述机制会自动映射为主机的空闲端口,防止冲突),利用AUFS分层和增量存储的特性实现容器模版的去冗余。
Swarm是Docker集群解决方案,用以解决Docker服务器统一管理问题,具有:
l 兼容Docker API;
l 维护Docker集群内全局容器视图;
l 自动负载均衡等能力。
鉴于Docker分析的文档已经比较齐全,本文主要介绍Swarm的主体框架。
二、 整体架构
Swarm是基于Master/Slave结构的Docker集群方案。其中, Master节点(Swarm)可运行在任何装有Docker Client组件和Swarm的主机上;Slave节点可运行在任何安装Docker组件的主机上。
用户请求调用Docker原生API,发送给Swarm节点,Swarm采用代理模式,从已有Slave节点选取一个,然后通过Restful的方式将请求发给Slave节点。
因此, Swarm在整体框架中直起到了转发调度的作用,如图1所示。
图1 Swarm框架
其中,Swarm的主要模块包括:
1. node discovery模块
该模块为Docker节点发现模块,采用手工配置方法,即预先在静态文件中填写Docker主机的ip及port。每一个Slave节点都被Swarm以一个engine的结构体保存,其中比较重要的几个参数是client(Slave的restful调用对象)、ip、memory、containers、images、healthy等,以标识Slave节点的信息,Docker info命令查询结果即为该结构体的信息,如图2所示。
图2
2. cluster模块
该模块为集群信息模块,也是Swarm核心模块,该模块以一个cluster结构体表示。结构体中包含engine数组,用来标识集群情况。为了提高效率,Swarm只在每次建立连接时会存储集群中的容器及镜像等信息,当进行查询操作时,会从本地缓存中查询,位于目录.swarm/state/17b24c4286b19f5de9bf11a5ce15de5845db47319c0823f6c35263406e41403d.json中(即可能存在swarm查询容器信息与slave节点不一致的问题),如图3所示。当前,swarm cluster模块中实现了超过80%的Docker原生API的封装。
3. filter和strategy模块
这两个模块是一些调度策略及“强要求”规则。所谓“强要求”规则,例如某个容器必须建立在某个节点上,某个容器必须跟某个容器建立在同一个节点上等调度规则。比如Docker允许容器之间存在link关系,则要求两个容器部署在同一台物理机上。