先看docker官网上的一句话:Docker Swarm mode is built into the Docker Engine. Do not confuse Docker Swarm mode with Docker Classic Swarm which is no longer actively developed.
翻译过来意思是:Docker Swarm 模式内置在Docker引擎中。不要将Docker Swarm模式与Docker Classic Swarm模式混淆,后者已不再积极开发。
老的Docker Swarm使用独立的外部KV存储(比如Consul、etcd、zookeeper),搭建独立运行的Docker主机集群,用户像操作单台Docker 机器一样操作整个集群,Docker Swarm把多台Docker主机当做一台Docker主机来管理。在docker 1.12版之前,只有搭建Docker Swarm集群,没有Swarm mode之说。
新的Swarm mode
是在docker 1.12版本中集成到 Docker 引擎中的,引入服务的概念,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得Docker 原生的Swarm mode集群具备与Mesos、Kubernetes叫板的实力。更适合中小型企业。
一句话来说,忘记Docker Swarm,要用就用Docker Swarm Mode。前者已经很少维护了
1.Docker Swarm是什么
Docker Swarm 是由 Docker 公司推出的 Docker 的原生集群管理系统,它将一个 Docker主机池变成了一个单独的虚拟主机,用户只需通过简单的 API 即可实现与 Docker 集群的通信。Docker Swarm 使用 GO 语言开发。从 Docker 1.12.0 版本开始,Docker Swarm 已经 内置 于Docker 引擎中,无需再专门的进行安装配置。
Docker Swarm 在 Docker 官网的地址为:https://docs.docker.com/engine/swarm/
2.节点架构
(1)架构图
(2) swarm node
从物理上讲,一个 Swarm 是由若干安装了 Docker Engine 的物理机或者虚拟机组成,这 些主机上的 Docker Engine 都采用 Swarm 模式运行。
从逻辑上讲,一个 Swarm 由若干节点 node 构成,每个 node 最终会落实在一个物理Docker 主机上,但一个物理 Docker 主机并不一定就是一个 node。即 swarm node 与 Docker主机并不是一对一的关系。
swarm node 共有两种类型:manager 与 worker。
(3)Manager
Manager 节点用于维护 swarm 集群状态、调试 servcie、处理 swarm 集群管理任务。为了防止单点故障问题,一个 Swarm 集群一般都会包含多个 manager。这些 manager 间通过Raft 算法维护着一致性。
(4)Worker
Worker 节点用于在其 Contiainer 中运行 task 任务,即对外提供 service 服务。默认情况 下,manager 节点同时也充当着 worker 角色,可以运行 task 任务。
(5) 角色转换
manager 节点与 worker 节点角色并不是一成不变的,它们之间是可以相互转换的。
- manager 转变为 worker 称为节点降级
- worker 转变为 manager 称为节点升级
3.服务架构
(1) 架构图
(2) service
搭建 docker swarm 集群的目的是为了能够在 swarm 集群中运行应用,为用户提供具备更强抗压能力的服务。docker swarm 中的服务 service 就是一个逻辑概念,表示 swarm 集群对外提供的服务。
(3) task
一个 service 最终是通过任务 task 的形式出现在 swarm 的各个节点中,而每个节点中的task 又都是通过具体的运行着应用进程的容器对外提供的服务。
(4) 编排器
在 swarm manager 中具有一个编排器,用于管理副本 task 任务的创建与停止。例如,当在swarm manager 中定义一个具有 3 个 task 副本任务的 service 时,编排器首先会创建 3个 task,为每个 task 分配一个 taskID,并通过分配器为每个 task 分配一个虚拟 IP,即 VIP。然后再将该 task 注册到内置的 DNS 中。当 service 的某 task 不可用时,编排器会在 DNS 中注销该 task。
(5) 分发器
在 swarm manager 中具有一个分发器,用于完成对副本 task 任务的监听、调度等操作。在上边的服务架构图中,当编排器创建了 3 个 task 副本任务后,会调用分发器为每个 task 分配节点。分发器首先会在 swarm 集群的所有节点中找到 3 个 available node 可用节点,每个节点上分配一个 task。而每个 task 就像是一个“插槽”,分发器会在每个“插槽”中放入一个应用容器。每个应用容器其实就是一个具体的 task 实例。一旦应用容器运行起来,分发器就可以监测到其运行状态,即 task 的运行状态。
如果容器不可用或被终止,task 也将被终止。此时编排器会立即在内置 DNS 中注销该task,然后编排器会再生成一个新的 task,并在 DNS 中进行注册,然后再调用分发器为之分配一个新的 available node,然后再该节点上再运行应用容器。编排器始终维护着 3 个 task副本任务。
分发器除了为 task 分配节点外,还实现了对访问请求的负载均衡。当有客户端来访问swarm 提供的 service 服务时,该请求会被 manager 处理:根据其内置 DNS,实现访问的负载均衡。
4.服务部署模式
(1)架构图
service 以副本任务 task 的形式部署在 swarm 集群节点上。根据 task 数量与节点数量的关系,常见的 service 部署模式有两种:replicated
模式与 global
模式。
(2)replicated 模式
replicated 模式,即副本模式,service 的默认部署模式。需要指定 task 的数量。当需要的副本任务 task 数量不等于 swarm 集群的节点数量时,就需要使用 replicated 模式。manager中的分发器会找到指定 task 个数的 available node 可用节点,然后为这些节点中的每个节点分配一个或若干个 task。
(3)global 模式
global 模式,即全局模式。分发器会为每个 swarm 集群节点分配一个 task,不能指定 task的数量。swarm 集群每增加一个节点,编排器就会创建一个 task,并通过分发器分配到新的节点上。