阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用Docker Swarm模式搭建Swarm集群

121次阅读
没有评论

共计 7746 个字符,预计需要花费 20 分钟才能阅读完成。

目录

  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 集群节点时
  • 当任务在另外一个活动状态节点出现失败时

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148377.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计7746字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中