如何使用consul和gliderlabs / registrator来防止僵尸服务?

时间:2016-06-08 00:19:40

标签: docker load-balancing service-discovery consul

我正在使用gliderlabs / registrator容器的consul来显示我在领事馆的活动容器。当我太快删除容器时,服务不会从领事中删除,只留下不再存在的“zombie”服务。我听说有一些额外的选项可以用于gliderlabs / registrator容器以防止这种情况,例如-cleanup。但是,我无法使用此选项成功运行任何registrator。这是我目前为我的管理员提供的docker run命令:

docker run -d -h $(hostname -i) --name registrator1 \
-v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator \
consul://$(hostname -i):8500

我必须添加到此运行命令中,以便registrator从领事中移除任何不再存在或已关闭的容器?

更新:我发现了问题

所以我使用我的consul集群和registrator来运行swarm。为swarm提供故障转移我在我的consul集群前放置了一个负载均衡器,并将我的swarm和registrator容器连接到负载均衡器的IP地址。这允许任何领事节点下降而不会丢失群。

然而,swarm并未将自身注册为服务。它将每个节点注册为键值,并且不绑定到consul集群中的任何节点。与registrator注册到领事的容器被创建为服务并绑定到单个领事服务器。

我认为发生的事情是,当我删除一个容器时,registrator会从consul删除该服务,但它只有33%的机会击中正确的领事服务器,并删除该服务,因为我的LB正在进行循环罗宾。

我的所有swarm master,负载均衡器,consul服务器和swarm worker都在不同的机器上运行。我的注册管理员正在我的群工机器上运行。一切都在容器中运行。

启用粘性负载平衡是一种解决我的问题的临时修复。但是我认为尝试在我的swarm worker上运行某种类型的 consul worker 并让registrator将自己绑定到在本地主机上运行的consul可能是解决方案。我相信这可能是领事github https://github.com/hashicorp/consul/tree/master/bench中描述的“替补工作者”。我仍然是领事的新手,所以我仍然试图弄明白。

1 个答案:

答案 0 :(得分:0)

答案是在我的所有swarm工作节点上运行consul worker,正式名称为 consul clients 。这可以通过从我的progrium / consul run命令中删除-server标记来完成。然后我的管理员只是向每台机器上运行的领事客户报告,而不是将自己绑定到领事服务器。由于progrium / consul已经过时并且不再维护,因此当容器被非常地停止(即除了docker stop以外的任何方式)并且之后被移除时,仍然存在出现僵尸的问题。