【问题标题】:How to prevent zombie services with consul and gliderlabs/registrator?如何使用 consul 和 gliderlabs/registrator 防止僵尸服务?
【发布时间】:2016-10-08 01:40:18
【问题描述】:

我正在使用带有 gliderlabs/registrator 容器的 consul 来在 consul 中显示我的活动容器。当我删除容器太快时,服务不会从 consul 中删除,留下不再存在的 "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

我必须在此运行命令中添加什么内容才能让 registrator 从 consul 中删除不再存在或已关闭的任何容器?

更新:我找到了问题

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

但是 swarm 不会将自己注册为服务。它将每个节点注册为一个键值,并且不绑定到 consul 集群中的任何节点。使用注册器注册到 consul 的容器被创建为服务并绑定到单个 consul 服务器。

我认为发生的事情是,当我删除一个容器时,注册器会从 consul 中删除该服务,但它只有 33% 的机会访问正确的 consul 服务器并删除该服务,因为我的 LB 只是在循环知更鸟。

我所有的 swarm master、负载均衡器、consul 服务器和 swarm worker 都在不同的机器上运行。我的注册器在我的 swarm worker 机器上运行。一切都在容器中运行。

启用粘性负载平衡是解决我的问题的临时修复。但是,我认为尝试在我的 swarm worker 上运行某种类型的 consul worker 并将注册器绑定到在本地主机上运行的 consul 可能是解决方案。我相信这可能是 consuls github https://github.com/hashicorp/consul/tree/master/bench 中描述的“bench-worker”。我对 consul 还很陌生,所以我仍在努力弄清楚。

【问题讨论】:

    标签: docker load-balancing service-discovery consul


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多