Docker Swarm高可用性
一、前言
在Docker Swarm集群中,Swarm manager负责管理整个集群,如果管理节点manager出现故障,虽然不会影响现有的服务和工作节点,但是我们不能继续管理我们的docker swarm集群。所以可以增加多个管理节点,这将使集群具备高可用性且节点故障容错能力。
管理节点作用:
- 维护集群状态
- 调度服务
- 提供swarm模式的HTTP API
二、集群高可用
2.1 扩展集群
Docker UCP(Docker的集群管理工具) 设计为可以随应用大小和使用率的增长而水平扩展。可以在 UCP 集群中添加或删除节点来扩展集群以满足需求。由于 UCP 利用 Docker 引擎提供的集群功能,因此您可以使用 docker swarm join 命令向集群中添加更多节点。在加入新节点时,UCP 服务将在此节点中自动开始运行。
# 在将节点加入Swarm集群中时,可以选择加入的是工作节点还是管理节点 # 加入工作节点 [root@manager ~]# docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377 # 加入管理节点 [root@manager ~]# docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-ayq7p26q6cwpxomwflo7vx3fu 172.16.60.95:2377
2.2 更改节点角色
可以通过docker node promote/demote来节点改变成管理或工作节点
root@manager ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION kfi2r4dw6895z5yvhlbyzfck6 * manager Ready Drain Leader 18.03.0-ce 41hev84z7mliyhyhkthrcf4iv node-01 Ready Active 18.03.0-ce j1bmj304wnbz23ng1w88wvkge node-02 Ready Active 18.03.0-ce gsya6g8dsnjrr3cxm0cyonm4b node-03 Ready Active 18.03.0-ce # 目前只有一个管理节点manager, #现在讲node-01提升为管理节点 [root@manager ~]# docker node promote node-01 manager Node node-01 promoted to a manager in the swarm. Node kfi2r4dw6895z5yvhlbyzfck6 is already a manager. [root@manager ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION kfi2r4dw6895z5yvhlbyzfck6 * manager Ready Drain Leader 18.03.0-ce 41hev84z7mliyhyhkthrcf4iv node-01 Ready Active Reachable 18.03.0-ce j1bmj304wnbz23ng1w88wvkge node-02 Ready Active 18.03.0-ce gsya6g8dsnjrr3cxm0cyonm4b node-03 Ready Active 18.03.0-ce #可以看到node-01的 MANAGER STATUS 已经是Reachable
通过node-01管理Swarm集群
# 可以执行docker manager的命令 [root@node-01 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS n85ykahh7vfs my-centos replicated 1/1 centos:latest qwuil9kydeya my-web replicated 5/5 nginx:latest *:80->80/tcp c7gmtmfacqt5 web-test replicated 5/5 nginx:latest
2.3 高可用性的要求
为了充分利用swarm的容错特性,docker建议管理节点的数量为奇数。Swarm的manager节点之间是基于raft一致性算法来处理关系,那么manager节点中就会有三种不同的角色:指挥者、跟随者和选举者。Docker官方建议Swarm中管理节点最好不要超过7个,通常情况下5个就够了。
Swarm Size | Majority | Fault Tolerance |
---|---|---|
1 | 1 | 0 |
2 | 2 | 0 |
3 | 2 | 1 |
4 | 3 | 1 |
5 | 3 | 2 |
6 | 4 | 2 |
7 | 4 | 3 |
8 | 5 | 3 |
9 | 5 | 4 |
所以这边swarm集群中有4台主机,需要有3个管理节点
[root@manager ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION kfi2r4dw6895z5yvhlbyzfck6 * manager Ready Drain Leader 18.03.0-ce 41hev84z7mliyhyhkthrcf4iv node-01 Ready Active Reachable 18.03.0-ce j1bmj304wnbz23ng1w88wvkge node-02 Ready Active Reachable 18.03.0-ce gsya6g8dsnjrr3cxm0cyonm4b node-03 Ready Active 18.03.0-ce
2.4 验证高可用性
停止manager管理节点的docker服务
# manager节点 [root@manager ~]# systemctl stop docker # 查看节点信息 [root@node-01 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION kfi2r4dw6895z5yvhlbyzfck6 manager Down Drain Unreachable 18.03.0-ce 41hev84z7mliyhyhkthrcf4iv * node-01 Ready Active Leader 18.03.0-ce j1bmj304wnbz23ng1w88wvkge node-02 Ready Active Reachable 18.03.0-ce gsya6g8dsnjrr3cxm0cyonm4b node-03 Ready Active 18.03.0-ce
可以看到现在node-01现在是leader了
查看节点状态:
# 管理节点的状态 docker node inspect manager --format "{{ .ManagerStatus.Reachability }}" reachable