Docker 领事未注销僵尸服务

Docker 领事未注销僵尸服务,docker,registration,marathon,consul,Docker,Registration,Marathon,Consul,我正在使用marathon部署一个简单的hello world nginx容器,所有的事情似乎都很好,除了我有6个容器不会从Consor注销docker ps显示所有容器均未运行 我尝试使用/v1/catalog/deregister端点来取消服务注册,但它们总是回来。然后我杀死了注册器容器,并再次尝试注销。他们回来了 我正在和你一起跑步 docker run -d --name agent-registrator -v /var/run/docker.sock:/tmp/docker.sock

我正在使用marathon部署一个简单的hello world nginx容器,所有的事情似乎都很好,除了我有6个容器不会从Consor注销<代码>docker ps显示所有容器均未运行

我尝试使用
/v1/catalog/deregister
端点来取消服务注册,但它们总是回来。然后我杀死了注册器容器,并再次尝试注销。他们回来了

我正在和你一起跑步

docker run -d --name agent-registrator -v /var/run/docker.sock:/tmp/docker.sock --net=host gliderlabs/registrator consul://127.0.0.1:8500 -deregister-on-success -cleanup
有1个领事代理正在运行

重新启动计算机(这是本地vm上的单节点安装)不会使服务消失

如何使这些容器消失?

尝试切换到v5


docker-run-d--name-agent-registator-v/var/run/docker.sock:/tmp/docker.sock gliderlabs/registator:v5-内部consul://172.16.0.4:8500

在Consor集群中,代理被认为是权威的。如果您使用HTTP Api/v1/catalog/deregister端点来注销服务,那么只要其他代理知道该服务,它就会继续返回。这就是八卦协议的运作方式


如果您想让服务立即消失,您需要在终止节点上的服务之前发出一个命令,以正确地注销host agent。

以下是完全删除所有僵尸服务的方法:进入您的领事服务器,找到包含僵尸的json文件的位置并删除它们

例如,我在一个容器中运行concur:

docker run --restart=unless-stopped -d -h consul0 --name consul0 -v /mnt:/data \
    -p $(hostname -i):8300:8300 \
    -p $(hostname -i):8301:8301 \
    -p $(hostname -i):8301:8301/udp \
    -p $(hostname -i):8302:8302 \
    -p $(hostname -i):8302:8302/udp \
    -p $(hostname -i):8400:8400 \
    -p $(hostname -i):8500:8500 \
    -p $(ifconfig docker0 | awk '/\<inet\>/ { print $2}' | cut -d: -f2):53:53/udp \
    progrium/consul -server -advertise $(hostname -i) -bootstrap-expect 3
docker run--restart=除非停止-d-h consult0--name consult0-v/mnt:/data\
-p$(主机名-i):8300:8300\
-p$(主机名-i):8301:8301\
-p$(主机名-i):8301:8301/udp\
-p$(主机名-i):8302:8302\
-p$(主机名-i):8302:8302/udp\
-p$(主机名-i):8400:8400\
-p$(主机名-i):8500:8500\
-p$(ifconfig docker0 | awk'/\/{print$2}'| cut-d:-f2):53:53/udp\
progrium/concur-server-advision$(主机名-i)-bootstrap预期3
请注意标志
-v/mnt:/data
这是领事存储的所有数据所在的位置。对我来说,它位于
/mnt
。在此目录下,您将找到其他几个目录

config-raft-serf-services tmp


进入
services
,您将看到包含服务json信息的文件,找到任何包含僵尸信息的文件并将其删除。然后重新启动领事。然后对集群中每个有僵尸的服务器重复上述操作。

使用http api删除服务是另一个更好的解决方案。在我了解如何使用https api之前,我刚刚了解了如何手动删除服务

要使用http api删除服务,请使用以下命令:

curl-v-X PUT http://:8500/v1/agent/service/deregister/

请注意,您的应用程序由三部分组成:运行容器的主机的IP地址、容器的名称和容器的内部端口(即,对于apache为80,对于node js为3000,对于django为8000,等等),所有内容都由colin分隔

下面是一个实际情况的示例:

curl-v-X-PUThttp://1.2.3.4:8500/v1/agent/service/deregister/192.168.1.1:sharp_apple:80

如果希望获得ServiceID的简单方法,只需卷曲包含僵尸的服务即可:

curl-s http://:8500/v1/catalog/service/

下面是一个名为someapp的服务的真实示例,该服务将返回其下的所有服务:

curl-shttp://1.2.3.4:8500/v1/catalog/service/someapp

这是Consor和registrator的问题之一,如果该服务没有相关联的检查,该服务将一直保留,直到取消注册并处于“活动”状态。因此,让服务机构注册健康检查也是一种好做法。这样,如果注册者搞砸了,忘记注销服务(我看到这种情况经常发生),他们至少会很关键。Alex的回答是,删除Concur的data/services目录中的文件(然后Concur重新加载)肯定可以删除服务,但是如果容器仍然存在并运行,registrator将重新添加这些文件。显然,较新的注册器版本更擅长清理,但我的成功率参差不齐。现在我根本不使用registrator,因为它不添加健康检查。我使用nomad来运行我的容器(也来自hashicorp),它将创建服务并创建健康检查,并且在清理之后做了大量工作。

不要使用catalog,而不是使用代理,原因是catalog由代理维护,即使您将其从catalog中删除,代理也会重新同步它,删除僵尸服务外壳脚本:

leader="$(curl http://ONE-OF-YOUR-CLUSTER:8500/v1/status/leader | sed 

's/:8300//' | sed 's/"//g')"
while :
do
serviceID="$(curl http://$leader:8500/v1/health/state/critical | ./jq '.[0].ServiceID' | sed 's/"//g')"
node="$(curl http://$leader:8500/v1/health/state/critical | ./jq '.[0].Node' | sed 's/"//g')"
echo "serviceID=$serviceID, node=$node"
size=${#serviceID}
echo "size=$size"
if [ $size -ge 7 ]; then
curl --request PUT http://$node:8500/v1/agent/service/deregister/$serviceID
else
break
fi
done
curl http://$leader:8500/v1/health/state/critical

json解析器jq用于字段检索

docker ps-a是否为您显示所有现有容器?@meoww它显示了声称存在的容器。我移除了所有的容器,然后取消注册。领事仍报告服务存在此方法对我不起作用。我发布了
consul leave
,重新启动了registrator,然后发布了
consul join
,服务仍然有效there@peter克利菲尔。服务是否仍然存在,但服务健康至关重要?我不会和领事一起使用注册器。我只想将服务直接注册到节点或容器中的领事代理。但这没有帮助-OP在尝试注销服务时遇到问题。这很有趣。我发现很难找到注册者的替代品。我在阅读注册者的信息时也注意到(
http://gliderlabs.com/projects/< GoeldLabor考虑beta)更多的工作是NeDe.重新启动领事可能在HA部署中不起作用。