Docker集群之swarm的基本操作

avatar 2020年3月6日18:27:57 评论 1,687 次浏览

环境说明

wulaoer.org节点名master
slave备用节点
node节点

节点下线

上个swarm集群搭建已经熟悉了,但是会发现一个问题就是slave节点查看不了集群的状态。这是因为swarm把所有的状态都集中在swarm中,对于集群的操作也只有在master中操作。在swarm集中中没有自动删除的操作。比如下面的集群中有几个节点已经关闭了,但是集群不会自动让它删除掉。

[root@wulaoer.org ~]# docker node ls		#查看所有节点
ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS
k6ix0xulqcaaqhv0bcj8tisni                               Down                Active              
43qcjj96pacpzs4pgb9403uln     slave                     Down                Active                                 
u3jy3y5ug87nydm0a8dv1vnc6     node                      Down                Active              
36ye417p5cjq8ungest0czppd *   wulaoer.org              Ready               Active              Leader

slave服务已经down了,还在集群中呢,如果想删除需要手动操作,先在集群中去掉。

[root@wulaoer.org ~]# docker node ls
ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS
k6ix0xulqcaaqhv0bcj8tisni                             Down                Active              
43qcjj96pacpzs4pgb9403uln     slave                   Down                Active                                      
u3jy3y5ug87nydm0a8dv1vnc6     node                    Down                Active              
36ye417p5cjq8ungest0czppd *   wulaoer.org            Ready               Active              Leader
[root@wulaoer.org ~]# docker node update --availability drain node
node
[root@wulaoer.org ~]# docker node update --availability drain k6ix0xulqcaaqhv0bcj8tisni   #使用了ID
k6ix0xulqcaaqhv0bcj8tisni
[root@wulaoer.org ~]# docker node update --availability drain 43qcjj96pacpzs4pgb9403uln
43qcjj96pacpzs4pgb9403uln
[root@wulaoer.org ~]# docker node update --availability drain d9y1htqapmcomxh3nni4ezyqu
d9y1htqapmcomxh3nni4ezyqu
[root@wulaoer.org ~]# docker node update --availability drain u3jy3y5ug87nydm0a8dv1vnc6
u3jy3y5ug87nydm0a8dv1vnc6

[root@wulaoer.org ~]# docker node ls
ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS
k6ix0xulqcaaqhv0bcj8tisni                             Down                Drain               
43qcjj96pacpzs4pgb9403uln     slave                   Down                Drain                         
u3jy3y5ug87nydm0a8dv1vnc6     node                    Down                Drain               
36ye417p5cjq8ungest0czppd *   wulaoer.org            Ready               Active              Leader

在swarm集群中,node的acailability状态可以为active或drain,active可以接受manager节点的任务,drain不能接收,也就是下线。前面状态已经Down了,后面还接受manager的任务,那处理的请求都是错误的。这里注意下线可以使用HOSTNAME也可以使用ID,使用HOSTNAME时如果一个服务上有两个节点就会找不到,这时就需要使用ID删除。

删除节点

节点已经下线了,我们就删除这些不需要的服务,然后重新加入集群中,记住一定要先下线后删除,或者状态Down的时候直接删除。

[root@wulaoer.org ~]# docker node ls
ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS
k6ix0xulqcaaqhv0bcj8tisni                             Down                Drain               
43qcjj96pacpzs4pgb9403uln     slave                   Down                Drain                          
u3jy3y5ug87nydm0a8dv1vnc6     node                    Down                Drain               
36ye417p5cjq8ungest0czppd *   wulaoer.org            Ready               Active              Leader
[root@wulaoer.org ~]# docker node rm k6ix0xulqcaaqhv0bcj8tisni
k6ix0xulqcaaqhv0bcj8tisni
[root@wulaoer.org ~]# docker node rm 43qcjj96pacpzs4pgb9403uln
43qcjj96pacpzs4pgb9403uln
[root@wulaoer.org ~]# docker node rm d9y1htqapmcomxh3nni4ezyqu
d9y1htqapmcomxh3nni4ezyqu
[root@wulaoer.org ~]# docker node rm u3jy3y5ug87nydm0a8dv1vnc6
u3jy3y5ug87nydm0a8dv1vnc6
[root@wulaoer.org ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
36ye417p5cjq8ungest0czppd *   wulaoer.org            Ready               Active              Leader

现在只有一个master节点了,我在把其他节点加到swarm集群中,这时需要master提供一个token,只有token才能加入到集群中,注意:网络要同,端口开放,端口号就是安装的时候指定的端口号。master生成一个集群token,在master节点上退出集群不能在用这个命令加入集群,如果有问题可以重启docker,节点退出集群可以加入master就只有使用备用节点加入了,不能直接进入。

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

	docker swarm join --token SWMTKN-1-2lkmd746a5tmadwaz7oflows917xx4as9vd7k3bqdc4h6c45jj-15eqv433gcx3q2xvuzl0jr31x 10.211.55.144:2377

然后根据这个token加入到集群中,下面使用slave上执行上面的命令加入到集群中。

[root@node ~]# docker swarm join --token SWMTKN-1-2lkmd746a5tmadwaz7oflows917xx4as9vd7k3bqdc4h6c45jj-15eqv433gcx3q2xvuzl0jr31x 10.211.55.144:2377
This node joined a swarm as a worker.
[root@slave ~]# docker swarm join --token SWMTKN-1-2lkmd746a5tmadwaz7oflows917xx4as9vd7k3bqdc4h6c45jj-15eqv433gcx3q2xvuzl0jr31x 10.211.55.144:2377
This node joined a swarm as a worker.
[root@wulaoer.org ~]# docker node ls
ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS
kbmc6jjkjiddihs0vus6s8pcg     slave                    Ready               Active              
lsyr5gbm5xdxaxvy338gfdctp     node                     Ready               Active              
36ye417p5cjq8ungest0czppd *   wulaoer.org             Ready               Active              Leader

这时所有节点都已经加入到集群中,不过这里注意如果加入集群出现下面的报错

[root@slave ~]# docker swarm join --token SWMTKN-1-2lkmd746a5tmadwaz7oflows917xx4as9vd7k3bqdc4h6c45jj-15eqv433gcx3q2xvuzl0jr31x 10.211.55.144:2377
Error response from daemon: rpc error: code = Unavailable desc = grpc: the connection is unavailable

这是matser节点的防火墙没有关闭,如果是线上可以开启端口即可。

增加master节点

我们上面只有一个master节点,但是如果master节点出现问题,整个如何就不可能使用了。我们需要增加一个备用的master,一旦正在运行的master节点出现问题,备用master顶起原master的任务。增加备用master需要先在master上增加创建一个master的token。

[root@wulaoer.org ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

	docker swarm join --token SWMTKN-1-3s1u7tzxbznhq1iimj9dpxrihqomsdjjmym3260vnss3s2yy87-9hf5ij4jsnsmwk0v7ai1a9kxr 10.211.55.144:2377

然后在另一个没有节点的服务上直接加入集群。

[root@slave ~]# docker swarm join --token SWMTKN-1-3s1u7tzxbznhq1iimj9dpxrihqomsdjjmym3260vnss3s2yy87-9hf5ij4jsnsmwk0v7ai1a9kxr 10.211.55.144:2377
This node joined a swarm as a manager.

如果已经加入到集群的节点想上升到备用节点可以在master节点上

[root@wulaoer.org ~]# docker node promote node
Node node promoted to a manager in the swarm.
[root@wulaoer.org ~]# docker node ls
ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
j75ti7ezbco0l8x0fedxziz7c     slave                   Ready               Active              Reachable           18.03.1-ce
y8d967fnrw6n5duw9q15pt08q     node                    Ready               Active              Reachable           18.03.1-ce
7mvsuiqnl3bin46iqo5ja5dsz *   wulaoer.org             Ready               Active              Leader              18.03.1-ce

这里有一个原master的状态为Leader的节点,增加了两个Reachable节点,我们尝试一下把原master服务的docker关闭掉,看看备用master是否能够自动跳转到leader的状态。

[root@wulaoer.org ~]# docker node ls
ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
j75ti7ezbco0l8x0fedxziz7c     slave                   Ready               Active              Reachable           18.03.1-ce
y8d967fnrw6n5duw9q15pt08q     node                    Ready               Active              Reachable           18.03.1-ce
7mvsuiqnl3bin46iqo5ja5dsz *   wulaoer.org             Ready               Active              Leader              18.03.1-ce
[root@wulaoer.org ~]# systemctl stop docker 

我直接把master的节点docker关闭了,看看另外两个节点已经接管了Leader的任务。

[root@slave ~]# docker node ls
ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
j75ti7ezbco0l8x0fedxziz7c *   slave                    Ready               Active              Leader              18.03.1-ce
y8d967fnrw6n5duw9q15pt08q     node                     Ready               Active              Reachable           18.03.1-ce
7mvsuiqnl3bin46iqo5ja5dsz     wulaoer.org              Unknown             Active              Unreachable         18.03.1-ce

原Reachable已经变成Leader了,这里建议Reachable节点一定要是个奇数,如果只有一台不能通过Raft的机制进行选择。如果条件不允许只有一台,只有重启docker,不要退出集群,切记。

如果不重启docker退出swarm集群,会出现多个managers的报错,如下:

[root@slave ~]# docker node ls
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.

有人说这个报错是版本的一个bug,我原来是安装的是17.12.1版本的,现在换了18.03.1版本的还是一样。这个应该和版本没有关系。注意,这里重启docker不能使用restart,必须使用stop停掉之后再start,不然Leader转移不过去。

退出swarm集群

如果集群的节点不想使用了,想退出集群的节点,需要先下线,在退出集群的节点。然后在master节点上删除退出集群的节点。看下面的例子:

[root@wulaoer.org ~]# docker node ls
ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
j75ti7ezbco0l8x0fedxziz7c     slave                    Down                Active              Unreachable         18.03.1-ce
y8d967fnrw6n5duw9q15pt08q     node                     Ready               Active              Reachable           18.03.1-ce
7mvsuiqnl3bin46iqo5ja5dsz *   wulaoer.org              Ready               Active              Leader              18.03.1-ce
[root@wulaoer.org ~]# docker node demote j75ti7ezbco0l8x0fedxziz7c
Manager j75ti7ezbco0l8x0fedxziz7c demoted in the swarm.
[root@wulaoer.org ~]# docker node rm j75ti7ezbco0l8x0fedxziz7c
j75ti7ezbco0l8x0fedxziz7c
[root@wulaoer.org ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
y8d967fnrw6n5duw9q15pt08q     node                Ready               Active              Reachable           18.03.1-ce
7mvsuiqnl3bin46iqo5ja5dsz *   wulaoer.org         Ready               Active              Leader              18.03.1-ce

我先在slave节点的docker关闭了,然后在master节点上降级Reachable节点,然后直接删除即可。

swarm集群token

如果我们的集群运行一段时间需要在加个节点,而且以前创建的token忘记了。那就查看token,然后在没有加入过swarm集群的节点上运行,或者删除的节点强制退出集群在加入集群。

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

	docker swarm join --token SWMTKN-1-0ij78tc6m2x1md1v5pwkgb3anhtseoeftupie4rtzpdslc6oik-8fg3j7elzekbwz91jmhupbxrc 10.211.55.144:2377
[root@slave ~]# docker swarm leave --force   #强制退出集群
Node left the swarm.
[root@slave ~]# docker swarm join --token SWMTKN-1-0ij78tc6m2x1md1v5pwkgb3anhtseoeftupie4rtzpdslc6oik-8fg3j7elzekbwz91jmhupbxrc 10.211.55.144:2377
This node joined a swarm as a worker.

也可以只打印token

[root@wulaoer.org ~]# docker swarm join-token -q worker
SWMTKN-1-0ij78tc6m2x1md1v5pwkgb3anhtseoeftupie4rtzpdslc6oik-8h7a4y1v118jpf2krx0wdqh1g

或者重置token

[root@wulaoer.org ~]# docker swarm join-token --rotate worker
Successfully rotated worker join token.

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

	docker swarm join --token SWMTKN-1-0ij78tc6m2x1md1v5pwkgb3anhtseoeftupie4rtzpdslc6oik-55h2ehs3am5v4qmuhon9j873e 10.211.55.144:2377

以上是针对swarm集群的操作方法,下个章节学习在swarm集群上部署应用的操作方法,期待一下吧。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: