我将consul与gliderlabs / registrator容器一起使用,以在consul中显示我的 Activity 容器。当我太快地删除容器时,该服务不会从领事中删除,从而使“zombie” 服务不再存在。我听说,可以使用gliderlabs / registrator容器使用其他选项来防止这种情况,例如-cleanup
。但是,使用此选项,我无法成功运行任何注册人。这是我当前针对注册人的docker run命令:
docker run -d -h $(hostname -i) --name registrator1 \
-v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator \
consul://$(hostname -i):8500
我必须在此运行命令中添加些什么,以使注册者从领事中删除不再存在或已损坏的任何容器?
更新:我发现了问题
因此,我与领事馆一起使用我的领事团队来运转。为了提供群集故障转移,我在领事群集的前面放置了一个负载平衡器,并将群集和注册器容器附加到负载平衡器的IP地址。这样,任何领事节点都可以放下而不会丢失群。
但是,swarm不会将自身注册为服务。它将每个节点注册为键值,并且未绑定(bind)到领事群集中的任何节点。使用注册器注册到领事的容器被创建为服务,并绑定(bind)到单个领事服务器。
我认为发生的事情是,当我删除容器时,注册者会从领事那里删除服务,但是由于我的LB只是在进行轮询,因此只有33%的机会命中正确的领事服务器并删除服务。
我所有的集群主机,负载平衡器,领事服务器和集群 worker 都在不同的机器上运行。我的注册者正在我的集群工作器计算机上运行。一切都在容器中运行。
启用粘性负载平衡是解决我问题的临时解决方案。但是,我认为尝试在我的群集工作器上运行某种类型的领事 worker ,并使注册器绑定(bind)到在本地主机上运行的领事可能是解决方案。我相信这可能是领事github https://github.com/hashicorp/consul/tree/master/bench中描述的“工作台”。我对领事还是很陌生的,所以我仍在努力弄清楚。
最佳答案
答案是在我所有的swarm worker节点上运行领事 worker ,正式称为领事客户。只需从我的progrium / consul运行命令中删除-server
标记即可完成此操作。然后,我的注册者仅向运行在每台计算机上的领事客户端报告,而不是将自己绑定(bind)到领事服务器。由于progrium / consul已过时且不再维护,因此,当容器被恶意停止(即docker stop
以外的任何方式)并随后删除时,仍然会出现僵尸问题。
关于docker - 如何通过领事和gliderlabs/注册者防止僵尸服务?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37691453/