Docker Swarm
Docker Swarm 是由 Docker 公司推出的 Docker 的原生集群管理系统,它将一个 Docker 主机池变成了一个单独的虚拟主机,用户只需通过简单的 API 即可实现与 Docker 集群的通信。Docker Swarm 使用 GO 语言开发。从 Docker 1.12.0 版本开始,Docker Swarm 已经内置于 Docker 引擎中,无需再专门的进行安装配置。
Docker Swarm 在 Docker 官网的地址为:Swarm mode overview | Docker Docs
节点架构
架构图
swarm node
从物理上讲,一个 Swarm 是由若干安装了 Docker Engine 的物理机或者虚拟机组成,这些主机上的 Docker Engine 都采用 Swarm 模式运行。
从逻辑上讲,一个 Swarm 由若干节点 node 构成,每个 node 最终会落实在一个物理Docker 主机上,但一个物理 Docker 主机并不一定就是一个 node。即 swarm node 与 Docker主机并不是一对一的关系。
swarm node 共有两种类型:manager 与 worker。
Manager
Manager 节点用于维护 swarm 集群状态、调试 servcie、处理 swarm 集群管理任务。为了防止单点故障问题,一个 Swarm 集群一般都会包含多个 manager。这些 manager 间通过 Raft 算法维护着一致性。
Worker
Worker 节点用于在其 Contiainer 中运行 task 任务,即对外提供 service 服务。默认情况下,manager 节点同时也充当着 worker 角色,可以运行 task 任务。
节点升级与降级
manager 节点与 worker 节点角色并不是一成不变的,它们之间是可以相互转换的。manager 转变为 worker 称为节点降级;worker 转变为 manager 称为节点升级。
服务架构
架构图
service
搭建 docker swarm 集群的目的是为了能够在 swarm 集群中运行应用,为用户提供具备更强抗压能力的服务。docker swarm 中的服务 service 就是一个逻辑概念,表示 swarm 集群对外提供的服务。
task
一个 service 最终是通过任务 task 的形式出现在 swarm 的各个节点中,而每个节点中的 task 又都是通过具体的运行着应用进程的容器对外提供的服务。
编排器
在 swarm manager 中具有一个编排器,用于管理副本 task 任务的创建与停止。例如,当在 swarm manager 中定义一个具有 3 个 task 副本任务的 service 时,编排器首先会创建 3 个 task,为每个 task 分配一个 taskID,并通过分配器为每个 task 分配一个虚拟 IP,即 VIP。然后再将该 task 注册到内置的 DNS 中。当 service 的某 task 不可用时,编排器会在 DNS 中注销该 task。
分发器
在 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,实现访问的负载均衡。
服务部署模式
官方图
service 以副本任务 task 的形式部署在 swarm 集群节点上。根据 task 数量与节点数量的关系,常见的 service 部署模式有两种:replicated 模式与 global 模式。
replicated 模式
replicated 模式,即副本模式,service 的默认部署模式。需要指定 task 的数量。当需要的副本任务 task 数量不等于 swarm 集群的节点数量时,就需要使用 replicated 模式。manager中的分发器会找到指定 task 个数的 available node 可用节点,然后为这些节点中的每个节点分配一个或若干个 task。
global 模式
global 模式,即全局模式。分发器会为每个 swarm 集群节点分配一个 task,不能指定 task 的数量。swarm 集群每增加一个节点,编排器就会创建一个 task,并通过分发器分配到新的节点上。