Docker Swarm——集群部署

一、机器环境

  • 机器规划
172.16.0.89      swarm的manager节点      manager-node   
172.16.0.90 swarm的node节点      node1

机器版本(均是:CentOS Linux release 7.7.1908)

  • 设置主机名
在manager节点上
[root@manager-node ~]# hostnamectl --static set-hostname manager-node

在node1节点上

[root@node1 ~]# hostnamectl --static set-hostname node1

在2台机器上都要设置hosts,均执行如下命令:

vim /etc/hosts

......
172.16.0.89 manager-node
172.16.0.90 node1
  • 设置防火墙
关闭2台机器上的防火墙。如果开启防火墙,则需要在所有节点的防火墙上依次放行2377 /tcp (管理端口)、7946 /udp (节点间通信端口)、4789 /udp (overlay 网络端口)端口。
[root@manager-node ~]# systemctl disable firewalld.service     --禁止firewall开机启动
[root@manager-node ~]# systemctl stop firewalld.service        --停止firewall
  • 安装docker

在2台机器上分别安装docker,这里使用的是【18.09.9】版本

二、创建集群

  • 创建Swarm

在 manager-node 节点上执行以下命令进行创建:

docker swarm init --advertise-addr 172.16.0.89

上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值(要保存好)。

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

docker swarm join --token SWMTKN-1-2202mw1jwjmqq075ego96j8pomplqawtjrbpobmxlld0gjcau6-4bniw4tiqwa5j1iz02p65iqwj 172.16.0.89:2377
  • 查看集群信息

执行 docker node ls 命令查看节点信息:

docker node ls

执行 docker info 命令查看详细信息:

docker info

  •  添加节点到swarm集群中

登录到node1节点上,执行前面创建swarm集群时输出的命令:

docker swarm join --token SWMTKN-1-2202mw1jwjmqq075ego96j8pomplqawtjrbpobmxlld0gjcau6-4bniw4tiqwa5j1iz02p65iqwj 172.16.0.89:2377

如果想要将其他更多的节点添加到这个swarm集群中,添加方法如上一致!

然后在manager-node管理节点上看一下集群节点的状态:

  •  更改节点 availablity 状态
swarm集群中node的availability状态可以为:
active:node可以接受来自manager节点的任务分派;
drain :node节点会结束task,且不再接受来自manager节点的任务分派(一般管理节点会设置成此状态)。
pause:暂时不工作
 
1、下线节点:
docker node update --availability drain node1

如上,当node1的状态改为drain后,那么该节点就不会接受task任务分发,就算之前已经接受的任务也会转移到别的节点上。

2、上线节点:

docker node update --availability active node1

再次修改为active状态(即将下线的节点再次上线)

3、删除节点:

docker node rm --force node1

  • 离开集群

在node1节点执行以下命令离开集群:

docker swarm leave

三、部署服务

  • 设置网络

在启动容器之前,先来创建一个覆盖网络,用来保证在不同主机上的容器网络互通的网络模式

docker network create -d overlay mrp_net

查看网络是否创建成功:

docker network ls

  • 创建服务

在manager-node节点上使用上面这个覆盖网络创建相应的服务,我这里用的是自己的应用masl:

docker service create --name masl -e TZ="Asia/Shanghai" --network mrp_net --replicas 2 -p 8081:8080 172.16.99.2:40305/masl:dev-yc-34

其中,--replicas 参数指定服务由几个实例组成。

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

docker service ls

使用 docker service inspect --pretty masl 查看服务信息:

docker service inspect --pretty masl

--pretty 使命令输出格式化为可读的格式,不加 --pretty 可以输出更详细的信息

使用docker service ps masl 查询到哪个节点正在运行该服务。
如下该容器被调度到manager-node节点上启动了,然后访问http: //182 .48.115.237即可访问这个容器应用(如果调度到其他节点,访问也是如此)
docker service ps masl

有上面命令可知,该服务分别在manager-node和node1节点上运行。分别登陆这2个节点,可以查看到masl容器在运行中

登陆manager-node节点查看:

登陆node1节点查看: 

 

 

四、动态扩展服务

  • 扩容服务

Service还提供了复制(类似kubernetes里的副本)功能。可以通过 docker service scale 命令来设置服务中容器的副本数:

docker service scale masl=4

和创建服务一样,增加scale数之后,将会创建新的容器,这些新启动的容器也会经历从准备到运行的过程,过一分钟左右,服务应该就会启动完成,这时候可以再来看一下 masl 服务中的容器

可以看到,之前masl容器在manager-node和node1节点上各有一个实例,而现在又增加了2个实例。

特别需要清楚的一点:
如果一个节点宕机了(即该节点就会从swarm集群中被踢出),则Docker应该会将在该节点运行的容器,调度到其他节点,以满足指定数量的副本保持运行状态。

比如:

将node1宕机后或将node1的docker服务关闭,那么它上面的task实例就会转移到别的节点上。当node1节点恢复后,它转移出去的task实例不会主动转移回来,
只能等别的节点出现故障后转移task实例到它的上面。使用命令 "docker node ls" ,发现node1节点已不在swarm集群中了。

在 node1 节点上关闭docker服务:

systemctl stop docker

过1分钟左右后,在 manager-node 节点上查看服务:

发现,node1节点关闭后,它上面之前的两个task任务已经转移到 manager-node 节点上了。

  • 缩容服务
docker service scale masl=2

发现,有2个task已经关闭了.

除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令。 可对 服务的启动 参数 进行 更新/修改。
[root@manager-node ~]# docker service update --replicas 3 masl
masl
  • 删除服务

把所有节点上的所有容器(task任务实例)全部删除了

docker service rm masl

 

五、总结

1、Swarm上手很简单,Docker swarm可以非常方便的创建类似kubernetes那样带有副本的服务,确保一定数量的容器运行,保证服务的高可用,但功能比较简单;

2、Swarm、Kubernetes、Messos比较:

  • Swarm的优点和缺点都是使用标准的Docker接口,使用简单,容易集成到现有系统,但是更困难支持更复杂的调度,比如以定制接口方式定义的调度。
  • Kubernetes 是自成体系的管理工具,有自己的服务发现和复制,需要对现有应用的重新设计,但是能支持失败冗余和扩展系统。
  • Mesos是低级别 battle-hardened调度器,支持几种容器管理框架如Marathon, Kubernetes, and Swarm,现在Kubernetes和Mesos稳定性超过Swarm,在扩展性方面,Mesos已经被证明支持超大规模的系统,比如数百数千台主机,但是,如果你需要小的集群,比如少于一打数量的节点服务器数量,Mesos也许过于复杂了
 
 
 
参考资料:
 

猜你喜欢

转载自www.cnblogs.com/caoweixiong/p/12362880.html