使用Docker Swarm模式搭建Swarm集群

目录

  1. 概述
  2. 创建和管理Swarm集群
  3. Swarm集群的服务部署实践

1. 概述

Docker Swarm是原生的Docker集群工具。在Docker版本1.12之后,Docker引擎加入了Swarm模式,将Swarm集成进来。大多数用户应该使用集成进Docker引擎的Swarm模式。单独的Docker Swarm仍然可用,只是它没有集成进Docker引擎的API和CLI命令当中。

随着Docker的不断开发,在版本1.12之后,Docker引擎加入了Swarm模式,用户可以通过原生的Docker CLI命令操作Swarm集群。

本篇使用的环境包括3个节点,一个作为Swarm的manager节点,两个为worker节点,机器名和IP地址如下:

  • centos7-Master: 192.168.71.131 (Swarm manager)
  • centos7-WorkerA: 192.168.71.167 (Swarm worker)
  • centos7-WorkerB: 192.168.71.168 (Swarm worker)

在三台主机上,都安装了Docker引擎1.12版,并且主机相互之间可以ping通,主机上的2377、7946、4789端口都打开。

Swarm集群端口, Docker Swarm集群开放了三个端口:

  • 2377端口, 用于集群管理通信
  • 7946端口, 用于集群节点之间的通信
  • 4789端口, 用于overlay网络流量

2. 创建Swarm集群

2.1 创建swarm管理节点

下面开始创建swarm。登录到centos7主机上,执行如下命令:

[root@centos7-Master ~]# docker swarm init --advertise-addr 192.168.71.131
Swarm initialized: current node (41atspd62he1vshs4jmhpyufj) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-49ueborzkg0v6l3xu2g1d5zfgsjn1xobqvctwozq14m07n1ak0-2llwi551ii09zeyus5r3zi3un \
    192.168.71.131:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。

如果你不知道或者忘记了Swarm Manager节点的Token信息, 你可以在Manager节点上执行以下命令查看Worker节点连接所需要的Token信息。

[root@centos7-Master ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-35z0vriry09vkm17vn1tvj0wzmbv1xfy77c0po7c5op2lyhkgk-635ho8efqfhrm817gpyjkho9x \
    192.168.202.15:2377

使用docker infodocker node ls查看集群中的相关信息:

[root@centos7-Master ~]# docker info
...
Swarm: active
NodeID: 41atspd62he1vshs4jmhpyufj
Is Manager: true
ClusterID: 5nl0kyz1dfmkgg2sx04vr8zoi
Managers: 1
Nodes: 1
Orchestration:
Task History Retention Limit: 5
...

[root@centos7-Master ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
41atspd62he1vshs4jmhpyufj *  centos7   Ready   Active        Leader

node ID旁边那个*号表示现在连接到这个节点上。

2.2 将Worker节点加入swarm集群

登录到centos7-WorkerA主机上,执行前面创建swarm时输出的命令:

[root@centos7-workerA ~]# docker swarm join \
>     --token SWMTKN-1-49ueborzkg0v6l3xu2g1d5zfgsjn1xobqvctwozq14m07n1ak0-2llwi551ii09zeyus5r3zi3un \
>     192.168.71.131:2377
This node joined a swarm as a worker.

如果当时创建swarm时没有记下命令的输出,可以通过在manager节点上运行docker swarm join-token worker命令来获取如何加入swarm的命令。

在另一台主机centos7-WorkerB上也执行相同的命令,最后在manager节点上看一下集群节点的状态:

[root@centos7-Master ~]# docker node ls
ID                           HOSTNAME         STATUS  AVAILABILITY  MANAGER STATUS
0b57ews522yiz8xyhy3jz34ci    centos7-WorkerB  Ready   Active        
41atspd62he1vshs4jmhpyufj *  centos7-Master   Ready   Active        Leader
d1lurs40mlah70spbetcsl9rw    centos7-WorkerA  Ready   Active 

错误处理:

  • 问题描述:

如果在添加Swarm集群节点时,出现错误“Error response from daemon: Timeout was reached before node was joined. The attempt to join the swarm will continue in the background. Use the docker info command to see the current swarm status of your node."

  • 原因分析:

由于Swarm集群中Manager节点中需要设置防火墙的访问权限,将集群管理端口加入防火墙的访问控制策略。

  • 解决办法:

在Manager节点主机的防火墙中加入端口的访问控制策略。

2.3 管理Swarm集群

2.3.1 删除Swarm集群节点

如果想在Docker Swarm集群中删除Docker的节点, 需要在须删除的Docker节点下执行命令:

[root@centos7-WorkerA ~]# docker swarm leave
Node left the swarm.

在Docker Swarm集群中,在删除Docker集群节点后,集群中该节点仍然存在,但是状态显示为Down, 需要在Swarm的Manager节点执行以下命令, 删除已经移除的Worker节点:

[root@centos7-Master ~]# docker node rm --force 4ukr7ghj4iuvb89gu0g5ok1d
4ukr7ghj4iuvb89gu0g5ok1d

2.3.2 更新Swarm集群节点

如果需要对Docker Swarm节点进行更新,需要在manager节点上执行命令:

[root@centos7-Master ~]# docker swarm update 
Swarm updated.

3. Swarm集群的服务部署实践

3.1 在Swarm中部署服务

在centos7-Master也就是manager节点上运行如下命令来部署服务:

[root@centos7-Master ~]# docker service create --replicas 1 --name helloworld alpine ping docker.com
50r6d8w4cwzi45s8865p9pdn4

参数说明:

  • --replicas参数指定启动的服务由几个实例组成;
  • --name参数指定启动服务的服务名;
  • alpine ping docker.com指定了使用alpine镜像创建服务,实例启动时运行ping docker.com命令。

这与docker run命令是一样的。

使用docker service ls查看正在运行服务的列表:

[root@centos7-Master ~]# docker service ls
ID            NAME        REPLICAS  IMAGE   COMMAND
50r6d8w4cwzi  helloworld  1/1       alpine  ping docker.com

3.2 查询Swarm中服务的信息

在部署了服务之后,登录到manager节点,运行下面的命令来显示服务的信息。参数--pretty使命令输出格式化为可读的格式,不加--pretty可以输出更详细的信息:

[root@centos7-Master ~]# docker service inspect --pretty helloworld
ID:        50r6d8w4cwzi45s8865p9pdn4
Name:        helloworld
Mode:        Replicated
Replicas:    1
Placement:
UpdateConfig:
Parallelism:    1
On failure:    pause
ContainerSpec:
Image:        alpine
Args:        ping docker.com
Resources:

使用命令docker service ps <SERVICE-ID>可以查询到哪个节点正在运行该服务:

[root@centos7-Master ~]$ docker service ps helloworld
ID                         NAME          IMAGE   NODE            DESIRED        STATE  CURRENT STATE           ERROR
541qk5jdrb71ypna9y5zw2l33  helloworld.1  alpine  centos7-Master  Running        Running 12 minutes ago  

3.3 在Swarm中动态扩展服务

登录到manager节点,使用命令docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>来将服务扩展到指定的实例数:

[root@centos7 ~]# docker service scale helloworld=5
helloworld scaled to 5

再次查询服务的状态列表:

[root@centos7-Master ~]$ docker service ps helloworld
ID                         NAME          IMAGE   NODE             DESIRED  STATE  CURRENT STATE           ERROR
541qk5jdrb71ypna9y5zw2l33  helloworld.1  alpine  centos7-Master    Running        Running 16 minutes ago  
96s46qpl3qd94ntw3n2bt81m8  helloworld.2  alpine  centos7-WorkerB   Running        Running 17 seconds ago  
6p1u8hj4y31i4pjmwh8zvvf2h  helloworld.3  alpine  centos7-WorkerA   Running        Running 8 seconds ago   
02jn1fxkx8juwizk6fjgv9r9n  helloworld.4  alpine  centos7-WorkerA   Running        Running 9 seconds ago   
btbrvtnjjmgyb8emwmznziho9  helloworld.5  alpine  centos7-Master    Running        Running 27 seconds ago  

可见Swarm集群创建了4个新的task来将整个服务的实例数扩展到5个。这些服务分布在不同的Swarm节点上。

3.4 删除Swarm集群中的服务

在manager节点上运行docker service rm helloworld便可以将服务删除。删除服务时,会将服务在各个节点上创建的容器一同删除,而并不是将容器停止。

此外Swarm模式还提供了服务的滚动升级,将某个worker置为维护模式,及路由网等功能。在Docker将Swarm集成进Docker引擎后,可以使用原生的Docker CLI对容器集群进行各种操作,使集群的部署更加方便、快捷。

3.5 更新Swarm集群中的服务版本

在前面的步骤中, 我们扩展了一个服务的多个实例, 如上所示, 我们扩展了基于Tomcat Server 8.5.8的Docker镜像。 假如,现在我们需要使用Tomcat Server 8.6.0版本做为Docker容器版本来替换原有的Tomcat Server 8.5.8版本。

  1. 在Swarm集群中的Manager节点上执行操作,用于完成服务版本的更新。
[root@centos7-Master ~]# docker service update --image tomcat:8.6.0 tomcat-service
tomcat-service

服务版本更新计划将按以下步骤执行:

  • 停止第一个任务
  • 计划对已停止任务的更新
  • 启动已更新任务的容器
  • 如果任务更新返回“RUNNING”状态,等待指定的延迟时间后,停止下一个任务
  • 如果在任务更新时,任务返回“FAILED”状态,将会暂停更新。

重新启动一个暂停更新的服务, 可以使用docker service update <SERVICE-ID>命令, 例如:

[root@centos7-Master ~]# docker service update tomcat-service
  1. 查看服务版本更新结果
[root@centos7-Master ~]# docker service ps tomcat-service

3.6 停用Swarm集群中的服务节点

如果我们想要停止Swarm集群中某个服务的Worker节点, 我们可以使用docker node update --availability drain <Node-ID>来停止Worker节点上的服务。

[root@centos7-Master ~]# docker node update --availability drain centos7-WorkerA
centos7-WorkerA

在停止Worker节点上的服务后, 我们可以通过docker node inspect --pretty <Node-ID>查看节点状态。

[root@centos7-Master ~]# docker node inspect --pretty centos7-WorkerA
ID:                     ayxx0k8p3hq04zjuemq6p43rq
Hostname:               centos7-WorkerA
Joined at:              2016-12-26 07:07:13.422672934 +0000 utc
Status:
 State:                 Ready
 Availability:          Drain
Platform:
 Operating System:      linux
 Architecture:          x86_64
Resources:
 CPUs:                  4
 Memory:                3.703 GiB
Plugins:
  Network:              bridge, host, null, overlay
  Volume:               local
Engine Version:         1.12.5

使用docker service ps tomcat-service查看当前Tomcat启动的集群信息。

[root@centos7-Master ~]# docker service ps tomcat-service
ID                         NAME                  IMAGE                                         NODE           DESIRED STATE  CURRENT STATE              ERROR
2vmq4yc9rnsx4etb10z0oah66  tomcat-service.1      192.168.202.14:5000/centos-tomcat858:centos7  centos7-Master  Running        Running about an hour ago  
6hjjuw1jp4037yt48cievtxt5  tomcat-service.2      192.168.202.14:5000/centos-tomcat858:centos7  centos7-Master  Running        Running 3 minutes ago      
cpzh34flx1i7e9sksfr1dr3xu   \_ tomcat-service.2  192.168.202.14:5000/centos-tomcat858:centos7  centos7-WorkerA  Shutdown       Shutdown 3 minutes ago     
eaimtl1swkxrnqhs2h8clodrb  tomcat-service.3      192.168.202.14:5000/centos-tomcat858:centos7  centos7-Master  Running        Running 3 minutes ago      
54pdp8oj1ww2mtrw3ac3m0lwb   \_ tomcat-service.3  192.168.202.14:5000/centos-tomcat858:centos7  centos7-WorkerA  Shutdown       Shutdown 3 minutes ago   

如果我们需要重新启用WorkerA的Swarm集群服务, 我们可以通过docker node update --availability active <NODE-ID>来实现对服务节点的启用。

[root@centos7-Master ~]# docker node update --availability active centos7-WorkerA
centos7-WorkerA

[root@centos7-Master ~]# docker node inspect --pretty centos7-WorkerA
ID:                     ayxx0k8p3hq04zjuemq6p43rq
Hostname:               centos7-WorkerA
Joined at:              2016-12-26 07:07:13.422672934 +0000 utc
Status:
 State:                 Ready
 Availability:          Active
Platform:
 Operating System:      linux
 Architecture:          x86_64
Resources:
 CPUs:                  4
 Memory:                3.703 GiB
Plugins:
  Network:              bridge, host, null, overlay
  Volume:               local
Engine Version:         1.12.5

当我们设置Swarm集群的Worker节点为可用时,它便能接收新的任务:

  • 当服务需要进行扩展时
  • 当对服务的版本进行更新时
  • 当我们对停用另外一个Swarm集群节点时
  • 当任务在另外一个活动状态节点出现失败时

推荐阅读更多精彩内容