swarm号称docker三剑客之一,用来实现docker的集群服务。
docker swarm对于docker来说是一个本地化集群,它把多个的docker hosts聚集在一起,对外只提供一个虚拟化的docker主机,由于docker swarm遵从标准的dockerAPI,任何可以与dockers组合的应用都可以用swarm透明的扩展多个服务。
(Docker Swarm is native clustering for Docker. It turns a pool of Docker hosts into a single, virtual Docker host. Because Docker Swarm serves the standard Docker API, any tool that already communicates with a Docker daemon can use Swarm to transparently scale to multiple hosts. )
本文将介绍docker swarm的基本架构,以及各个模块的功能
swarm架构
最上层的对外接口包括:
docker API用于管理镜像的生命周期。
swarm CLI 用于集群管理。
LeaderShip提供集群的HA(high avaliable),防止单点故障,具体实施请参见官网(High avilability for docker swarm)
discovery service是warm的发现服务,它会在每个node中注册一个angent将各个节点的IP端口上报,manager会从发现服务读取各节点信息,发现服务的实现方式有四种:
Hosted Discovery with Docker Hub,Docker Hub提供的发现服务,需要连接外网。
docker run -d -p <manager_port>:2375 swarm manage token://<cluster_id>
基于KV分布式存储系统,支持etcd,consul,zookeeper
swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>
静态文件描述
swarm manage -H tcp://<swarm_ip:swarm_port> file:///tmp/my_cluster
静态IP列表
swarm manage -H <swarm_ip:swarm_port> nodes://<node_ip1:2375>,<node_ip2:2375>
(详情见官网 Discovery)
schedule调度模块,用于容器调度时选择最优节点,主要分如下两步(filter和strategy)。
filter(过滤),当创建或运行容器时,它会告诉调度器哪些节点是可用的(符合要求的)。filter可以分为两类,节点过滤和基于容器配置的过滤。
节点过滤:
Constraints,约束过滤器,可以根据当前操作系统类型、内核版本、存储类型等条件进行过滤,当然也可以自定义约束,在启动Daemon的时候,通过Label来指定当前主机所具有的特点。Health filter,会根据节点状态进行过滤,会去除故障节点。
基于容器配置的过滤:
Affnity,亲和性过滤器,支持容器亲和性和镜像亲和性,比如一个web应用,我想将DB容器和Web容器放在一起,就可以通过这个过滤器来实现。Dependency,依赖过滤器。如果在创建容器的时候使用了–volume-from/–link/–net某个容器,则创建的容器会和依赖的容器在同一个节点上。
Ports filter,会根据端口的使用情况过滤。
strategy 根据策略选择最优节点:
Binpack,在同等条件下,选择资源使用最多的节点,通过这一个策略,可以将容器聚集起来。
Spread,在同等条件下,选择资源使用最少的节点,通过这一个策略,可以将容器均匀分布在每一个节点上。
Random,随机选择一个节点。
参考:
http://www.wtoutiao.com/p/D8efmk.html
https://docs.docker.com/swarm/