如何在多群集管理器集群中找到哪个节点是docker swarm中当前的管理器节点?

时间:2016-10-25 17:06:02

标签: docker docker-compose docker-machine docker-swarm

我创建了一个 docker swarm cluster ,其中 4个节点 2是群体管理器(swarm支持多个管理器)我理解是否当前经理节点关闭,然后第二经理扮演群体经理的角色

在我的情况下,我正在向群组管理器发起休息呼叫以创建具有副本的服务,依此类推。

在某些时候,如果这位经理失败并且第二位经理成为经理,我怎么知道?

是否有任何方式可以动态通知特定节点是管理器?

请给我澄清一下这个??

4 个答案:

答案 0 :(得分:5)

使用CLI

通过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 Remote API

您还可以通过编程方式检查哪个经理是领导者。 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 在这里非常有用,因为它仅适用于管理器节点。