Docker三剑客之Docker Swarm

1、什么是Docker Swarm?

Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些。

Docker Swarm 包含两方面:一个企业级的 Docker 安全集群,以及一个微服务应用编排引擎。集群方面,Swarm 将一个或多个 Docker 节点组织起来,使得用户能够以集群方式管理它们。Swarm 默认内置有加密的分布式集群存储(encrypted distributed cluster store)、加密网络(Encrypted Network)、公用TLS(Mutual TLS)、安全集群接入令牌 Secure Cluster Join Token)以及一套简化数字证书管理的 PKI(Public Key Infrastructure)。

我们可以自如地添加或删除节点。编排方面,Swarm 提供了一套丰富的 API 使得部署和管理复杂的微服务应用变得易如反掌。通过将应用定义在声明式配置文件中,就可以使用原生的 Docker 命令完成部署。此外,甚至还可以执行滚动升级、回滚以及扩缩容操作,同样基于简单的命令即可完成。

以往,Docker Swarm 是一个基于 Docker 引擎之上的独立产品。自 Docker 1.12 版本之后,它已经完全集成在 Docker 引擎中,执行一条命令即可启用。到 2018 年,除了原生 Swarm 应用,它还可以部署和管理 Kubernetes 应用。

2、Docker Swarm节点

运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。从集群角度来说,一个 Swarm 由一个或多个 Docker 节点组成。这些节点可以是物理服务器、虚拟机、树莓派(Raspberry Pi)或云实例。唯一的前提就是要求所有节点通过可靠的网络相连。节点会被配置为管理节点(Manager)或工作节点(Worker)。管理节点负责集群控制面(Control Plane),进行诸如监控集群状态、分发任务至工作节点等操作。

节点分为管理 (manager) 节点和工作 (worker) 节点。

管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。

工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。工作节点接收来自管理节点的任务并执行。Swarm 的配置和状态信息保存在一套位于所有管理节点上的分布式 etcd 数据库中。该数据库运行于内存中,并保持数据的最新状态。关于该数据库最棒的是,它几乎不需要任何配置,作为 Swarm 的一部分被安装,无须管理。

下图 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系:

img

关于集群管理,最大的挑战在于保证其安全性。搭建 Swarm 集群时将不可避免地使用 TLS,因为它被 Swarm 紧密集成。在安全意识日盛的今天,这样的工具值得大力推广。Swarm 使用 TLS 进行通信加密、节点认证和角色授权。自动密钥轮换(Automatic Key Rotation)更是锦上添花!其在后台默默进行,用户甚至感知不到这一功能的存在。关于应用编排,Swarm 中的最小调度单元是服务。它是随 Swarm 引入的,在 API 中是一个新的对象元素,它基于容器封装了一些高级特性,是一个更高层次的概念。当容器被封装在一个服务中时,我们称之为一个任务或一个副本,服务中增加了诸如扩缩容、滚动升级以及简单回滚等特性。综上所述,从概括性的视角来看 Swarm,如下图所示:

img

3、Docker Swarm服务和任务

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

replicated services 按照一定规则在各个工作节点上运行指定个数的任务;

global services 每个工作节点上运行一个任务;

两种模式通过 docker service create 的 –mode 参数指定。

下面 Docker 官网的这张图片形象的展示了容器、任务、服务的关系:

img

4、初始化集群

通过docker-machine create -d virtualbox manager 命令创建一个Docker Swarm Manager节点:

img

然后我们通过docker-machine ssh manager 命令登录到manager节点上去、然后通过 docker swarm init –advertise-addr 192.168.99.101 命令初始化一个Docker Swarm集群:

img

5、增加工作节点

下面我们通过 docker-machine create -d virtualbox worker1命令初始化两个个工作节点worker1和worker2:

img

创建完worker1和worker2工作节点以后、我们通过初始化集群的提示命令:docker swarm join –token SWMTKN-1-2mjy24mlp9mpnlb4321iz1qnawkn9h150lsv4rzrklgv53fcxi-d2nqk6eoxki050qi28p520yxk 192.168.99.101:2377 把工作节点添加到集群中去。首先通过docker-machine ssh worker1命令进入worker1工作节点、然后执行上面的docker swarm join –token SWMTKN-1………命令、他会自动把worker1节点添加到Docker Swarm集群(worker2同样操作):

img

6、查看集群

经过上边的两步,我们已经拥有了一个最小的 Swarm 集群,包含一个管理节点和两个工作节点。 在管理节点使用 docker node ls 查看集群:img

下面我们通过docker service create –replicas 3 -p 80:80 –name nginx nginx:latest命令在manager节点创建一个三副本的nginx服务、并把宿主机的80端口映射到Docker的80端口,docker service ls可以查看服务状态、也可以通过docker service ps nginx 来查看nginx服务的状态,还可以通过 docker service logs 来查看某个服务的日志。 完成之后我们可以通过任意节点的IP地址+80端口访问nginx服务(为了能更快的完成服务创建、这里需要提前在每个节点下载好nginx镜像):

img

然后我们通过任意节点的80端口进行验证、发现nginx服务已经正常启动、如下图:

img

7、删除服务

我们可以使用 docker service rm 命令来从 Swarm 集群移除某个服务:

img

推荐文章