以下是您绝对可以删除所有僵尸服务的方法:进入您的领事服务器,找到包含僵尸的json文件的位置并删除它们。
例如,我在一个容器中运行consul:
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
注意标志 -v /mnt:/data 这是所有数据领事存储所在的位置。对我来说它位于 /mnt 。在此目录下,您将找到其他几个目录。
-v /mnt:/data
/mnt
config raft serf services tmp
进入 services 并且您将看到包含服务的json信息的文件,找到包含僵尸信息的任何文件并删除它们。然后重启领事。然后对群集中具有僵尸的每个服务器重复此操作。
services
使用http api删除服务是另一个更好的解决方案。在我弄清楚如何使用https api之前,我只是弄清楚如何手动删除服务。
要使用http api删除服务,请使用以下命令: curl -v -X PUT http://<consul_ip_address>:8500/v1/agent/service/deregister/<ServiceID>
curl -v -X PUT http://<consul_ip_address>:8500/v1/agent/service/deregister/<ServiceID>
请注意,您的组合包括三个方面:运行容器的主机的IP地址,容器的名称以及容器的内部端口(即apache为80,节点j为3000,django为8000,所有被科林分开的人 :
:
下面是一个实际看起来像的例子: curl -v -X PUT http://1.2.3.4:8500/v1/agent/service/deregister/192.168.1.1:sharp_apple:80
curl -v -X PUT http://1.2.3.4:8500/v1/agent/service/deregister/192.168.1.1:sharp_apple:80
如果您想要一种简单的方法来获取ServiceID,那么只需卷曲包含僵尸的服务: curl -s http://<consul_ip_address>:8500/v1/catalog/service/<your_services_name>
curl -s http://<consul_ip_address>:8500/v1/catalog/service/<your_services_name>
下面是一个名为someapp的服务的真实示例,该服务将返回其下的所有服务: curl -s http://1.2.3.4:8500/v1/catalog/service/someapp
curl -s http://1.2.3.4:8500/v1/catalog/service/someapp
这是Consul和registrator的问题之一,如果服务没有与之关联的检查,服务将保持不变,直到它被取消注册并“激活”。因此,让服务注册健康检查也是一种很好的做法。这样,如果管理员弄乱并忘记取消注册服务(我认为发生了很多),他们至少会是至关重要的。 Alex的回答是,擦除consul的数据/服务目录中的文件(然后是consul reload)肯定会删除服务,但是如果容器仍在运行,registrator将重新添加它们。显然,较新的registrator版本在清理方面更胜一筹,但我的成功并不多。现在我根本不使用registrator,因为它不会添加健康检查。我使用nomad来运行我的容器(也来自hashicorp),它将创建服务并创建健康检查,并在自身后进行清理工作。
尝试切换到v5
docker run -d --name agent-registrator -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:v5 -internal consul://172.16.0.4:8500
不要使用目录,而不是使用 的 代理人 强> ,原因是目录由代理维护,即使从目录中删除它也会被代理重新同步,删除zombie services shell脚本:
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用于字段检索