Docker Swarm是Docker公司推出的官方容器集群平台,基于Go语言实现。
目前,包括Rackspace在内的许多平台都采用了Swarm,用户很容易在AWS等公有云平台使用Swarm。
Swarm的前身是Beam项目和libswarm项目,首个正式版本(Swarm V1)在2014年12初发布。
为了提高可扩展性,2016年2月对架构进行重新设计,推出V2版本,支持超过1000个节点。
最新的Docker Engine已经集成了Swarm Kit,加强了对Swarm的协调支持。
作为容器集群管理器,Swarm最大的优势就是100%支持标准的Docker API。
各种基于标准API工具,如Compose、docker.py,各种管理软件,甚至Docker本身都可以很容易地与Swarm集成。
这大大方便了用户将原先基于单节点地系统移植到Swarm上。
同时Swarm内置了对Docker网络插件地支持,用户可以很容易地部署跨主机地容器集群服务。
Swarm是典型地master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager地统一管理。
在v2中,集群会自动通过Raft协议分布式选举manager节点,无需额外地发现服务地支持,避免了单节点瓶颈。
同时v2内置了基于DNS地负载均衡和外部负载均衡机制地集群支持。
对于Docker1.12已经更新的版本,swarm相关命令已经原生嵌入到了Docker Engine中,因此我们可以直接使用。
首先查看docker swarm的帮助信息:
在构建集群之前首先应该保证的是每台机器(不论是虚拟机还是物理机)上面都已经安装Docker Engine并且已经启动,当然你可以使用docker machine来快速构建。
为了更加清晰的使用docker swarm init进行初始化,我们首先依旧是查看帮助信息。
需要说明的是节点可用性的三种状态:
• Active:集群中该Node可以被指派TASK;
• Pause:集群中该Node不可以被指派新的Task,但是其它已经存在的TASK保持运行;
• Drain:集群中该Node不可以被指派新的Task,Swarm Scheduler停掉已经存在的Task;
下面具体代码:
上面–advertise-addr选项指定Manager Node会publish它的地址为192.168.1.107,后续Worker Node加入到该Swarm集群,必须要能够访问到Manager的该IP地址。
该结果中给出了后续操作引导信息,告诉我们如何将Worker Node加入Swarm集群中.
查看帮助信息:
加入test节点:
加入test2节点:
对于token后面的一长串字符是集群初始化的时候生成的令牌,每个想要加入这个集群的机器都需要拿着这个令牌才能加入到该集群.
可以通过docker node查看当前集群的所有节点:
名词解释:
• ID:swarm会为集群中的每台机器分配一个唯一ID;
• HOSTNAME:主机名
• STATUS:当前状态
• AVAILABILITY:节点的可用性
• MANAGER STATUS:是否是管理节点
• ENGINE:Docker的版本
通过查看帮助信息可以知道节点的相关操作:
Swarm支持设置一组Manager Node,通过支持多Manager Node实现HA。
那么这些Manager Node之间的状态的一致性就非常重要了,多Manager Node的Warm集群架构,如下图所示(出自Docker官网):
通过上图可以看出,Swarm使用了Raft协议来保证多个Manager之间状态的一致性.
基于Faft协议,Mananger Node具有一定的容错功能,假设Swarm集群中有N个Manager Node,那么整个集群可以容忍最多(N-1)/2个节点失效,如果是一个三个Manager Node的Swarm集群,最多只能容忍一个Manager Node挂掉.
下面是对一些常规操作的解释:
查看帮助信息:
(1)修改节点的可用性
将test可用性修改为pasue,返回主机名:
再次查看状态信息:
常见的变更操作:
• 设置Manager Node只具有管理功能
• 对服务进行停机维护,可以修改AVAILABILITY为Drain状态
• 暂停一个Node,然后该Node就不再接收新的Task
• 回复一个不可用或暂停的Node
(2)标签操作
每个Node的主机配置情况可能不同,比如有的适合运行CPU密集型应用,有的适合运行IO密集型应用,
Swarm支持给每个Node添加标签元数据,这样可以根据Node的标签,来选择性地调度某个服务部署到期望的一组Node上。
添加或者更新标签:
可以通过docker node inspect 命令来查看标签信息
删除节点标签:
(3)角色操作
Usage: docker node demote/promote NODE [NODE...]
目前集群的状态信息:
将test升级为manager节点:
查看帮助信息:
示例:
查看帮助信息:
在Swarm集群上部署服务,必须在Manager Node上进行操作。
先说明一下Service、Task、Container(容器)这个三个概念的关系,如下图(出自Docker官网)非常清晰地描述了这个三个概念的含义:
在Swarm mode下使用Docker,可以实现部署运行服务、服务扩容缩容、删除服务、滚动升级等功能。
Docker服务的功能比较丰富,通过查看帮助信息可以很清楚的到它有那些操作。
下面是部分命令的讲解:
可以通过docker service ls来查看已经创建的服务。
Docker Swarm支持服务的扩容缩容,Swarm通过 --mode
选项设置服务类型,提供了两种模式:
一种是replicated,我们可以指定服务Task的个数(也就是需要创建几个冗余副本),这也是Swarm默认使用的服务类型;
另一种是global,这样会在Swarm集群的每个Node上都创建一个服务。
格式:
docker service scale 服务ID=服务Task总数
通过docker service ps可以查看各个副本的状况。