搭建docker swarm高可用集群以及常用命令
Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源
如上图,通过Manager 对外提供服务,管理集群容器,利用swarm的容错机制实现高可用,利用docker多个工作节点,多个副本实现负载均衡,上层可以使用Happroxy实现对多个Manager的访问。
为了利用swarm模式的容错功能,应保持集群中奇数管理员来支持manager节点故障。当leader故障时,会选举新的leader。
注意:三个manage只允许一个manage故障,如果swarm失去法定人数,swarm不能自动恢复,工作节点上的任务继续运行,不受影响,但无法执行管理任务,包括扩展或更新服务,加入或删除节点。恢复的最佳方式是将丢失的leader节点重新联机。如果不可能,唯一方法是使用—force-newcluster管理节点的操作,这将去除本机之外的所有管理器身份,命令如下:
去除本地之外的管理员:docker swarm init —force-new-cluster
failed to create network auth_test: Error response from daemon: This node is not a swarm manager. Use “docker swarm init” or “docker swarm join” to connect this node to swarm and try again. 管理节点出现这种情况,重启服务:service docker restart
一,下面我们搭建上图的高可用的docker swarm 集群以及一些命令使用
1,准备八台服务器,三台作为manage管理节点,向外提供接口服务,五台作为worker节点,运行我们项目
manage:管理节点(dokcer swarm命令只能再管理节点执行,管理节点状态有两种:Leader,Reachable)
worker:工作节点
2,初始化docker swarm
docker swarm init —force-new-cluster —advertise-addr (本机ip)
3,生成token让其他manage和worker加入集群
生成一个work节点加入的token : docker swarm join-token worker
生成一个manger节点加入的token:docker swarm join-token manager
" class="reference-link">
把上图的红框内容复制到将要加入集群的机器执行即可
4,通过命令查看集群各个节点的情况
管理节点执行:docker nodel ls
AVAILABILITY 列可能出现的状态:
Active :意味着调度程序可以向节点分配任务
Pause:意味着调度程序不向节点分配新任务,但现有任务仍在运行。
Drain :意味着调度程序不向节点分配新任务。调度程序关闭所有现有任务,并在可用节点上调度它们。
MANAGER STATUS列状态:
Leader :意味着该节点是主要的管理器节点,负责为群进行所有群管理和编排决策。
Reachable :表示该节点是参与Raft共识仲裁的管理器节点。如果领导节点变得不可用,则该节点有资格被选举为新的领导人。
Unavailable :表示节点是无法与其他管理器通信的管理器。如果管理器节点变得不可用,则应将新的管理器节点加入群或将工作节点提升为管理器。
如下图:三个manage,其中一台已经模拟宕机,自动切换了leader, 四台正常的work,
到此已经完成了第一个图的docker swarm 集群搭建了 ,下面介绍一些常用的命令
5,创建网络:
在一台manage主机中创建overlay网络
docker network create -d overlay —attachable cloud_desktop_network
6,升级与降级
可以将工作节点提升为管理器角色。当管理器节点变得不可用或要使管理器脱机进行维护时,这很有用。类似地,可以将管理器节点降级为辅助角色。
降级:docker node demote 名称
升级:docker node promote 名称
7,节点移除
docker node rm
8, 动态修改服务的数量
docker service scale my-service=5
9,刷新各个节点
刷新各个节点:docker swarm update
10,强制离开集群
强制离开节点:docker swarm leave —force
二,讲述一些同个服务service的负载均衡访问原理
例子:启动了mongo服务,数量为两个,但是项目中访问使用的是 mongo的容器名字,那docker它怎么通过容器名称动态实现负载均衡的呢?
还没有评论,来说两句吧...