我创建了一个 docker swarm cluster ,其中 4个节点 2是群体管理器(swarm支持多个管理器)我理解是否当前经理节点关闭,然后第二经理扮演群体经理的角色。
在我的情况下,我正在向群组管理器发起休息呼叫以创建具有副本的服务,依此类推。
在某些时候,如果这位经理失败并且第二位经理成为经理,我怎么知道?
是否有任何方式可以动态通知特定节点是管理器?
请给我澄清一下这个??
答案 0 :(得分:5)
通过CLI快速(手动)了解经理是否已更改:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
46aqrk4e473hjbt745z53cr3t node-5 Ready Active Reachable
61pi3d91s0w3b90ijw3deeb2q node-4 Ready Active Reachable
a5b2m3oghd48m8eu391pefq5u node-3 Ready Active
e7p8btxeu3ioshyuj6lxiv6g0 node-2 Ready Active
ehkv3bcimagdese79dn78otj5 * node-1 Ready Active Leader
您可以在MANAGER STATUS
列下找出当前领导的经理。
您还可以使用Leader
字段单独检查每个节点格式,例如:
$ docker node inspect <id-node> --format "{{ .ManagerStatus.Leader }}"
true
您还可以通过编程方式检查哪个经理是领导者。 docker远程API公开Nodes API endpoint 您可以使用列出节点。
您可以提供过滤器作为采用key=value
形式的参数。
您可以使用该过滤器仅列出管理器节点(使用role=manager
),然后您可以解析和过滤JSON输出,以保持Leader
字段设置为true
的节点(在ManagerStatus
下)。
很遗憾没有leader
过滤器(yet),但我认为这可能是针对swarmkit问题跟踪器提出的有效增强功能。
尚未在docker swarm模式下发送事件流(这由 swarmkit 存储库上的this issue跟踪)。我想在未来,一个事件将触发Leader切换,如果您正在收听这些事件,您将动态通知新领导者(例如,如果您有特殊设置并希望动态更新consul,nginx或Interlock中的条目。
答案 1 :(得分:3)
我使用docker-machine设置我的本地swarm(运行VirtualBox)。
如果您运行docker-machine ls
,它将在领导者的ACTIVE列中显示asterix(*)。或者使用docker node ls
查看更多详细信息 - 您可以看到其他经理是否可以访问,哪些是明确的领导者。
您还需要两个以上的管理员才能容错(请点击此处https://docs.docker.com/engine/swarm/admin_guide/)。 Swarm管理器使用Raft协议来获得强大的一致性。为此,他们需要大多数管理器节点,大多数2是2,所以还没有容错。如果当前失败,你的群体将无法选出新的领导者。
我不知道您是否可以收到关于领导者变更的通知。您可以做的当然是指向任何管理器节点,因此如果您使用REST,我可以设想设置不使用不健康节点的HA代理并将其指向所有管理器。任何经理都可以接听服务电话,并将其转发给领导经理进行安排。
答案 2 :(得分:2)
如果您使用distributed key/value store,请检查其日志,或者您可以在这两个群集管理器上使用此命令,它将显示主节点。 docker -H tcp://&lt; swarm_ip:swarm_port&gt;信息强>
使用docker-machine,看看there,设置shell连接到swarm管理器并使用 docker info 命令。
答案 3 :(得分:2)
要查找经理节点,请运行 docker info 它会列出当前节点地址以及经理地址等众多信息。
命令 docker node ls 在这里非常有用,因为它仅适用于管理器节点。