问题描述
在使用Consul的客户端模式时,遇到了一个问题:在AWS中运行时,EC2实例经常被替换,这导致Consul UI或通过consul members
命令查看时出现很多死亡的客户端节点。
用户已经尝试启用了reconnect_timeout
、leave_on_terminate
(默认为true,但仍尝试打开),以及Autopilot的cleanup_dead_servers
,但都没有效果。
而且,删除的延迟似乎也不一致,有些节点在4~7天后被删除,有些则永远不会被删除,需要使用consul force-leave
命令。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
作为最佳实践,你应该优雅地注销节点。这样,Consul就会知道节点已经离开,并将其从集群中删除。否则,Consul无法区分临时故障、代理崩溃、网络分区等情况。
根据一个相关的GitHub issue,以下是一些重要的要点:
“节点应该在72小时后自动删除(目前还不能配置,但很快就可以)。否则,最好的方法是在销毁节点之前发出优雅的离开命令(consul leave),这样它们可以立即被删除。如果没有优雅的离开,Consul无法区分临时故障、代理崩溃、网络分区等情况。”
“force-leave命令应该将节点从“failed”状态移动到“left”状态。节点在失败状态或离开状态下不会被删除。”force-leave”只是将节点从”failed” -> “left”状态移动。它们在24或72小时内不会从成员列表中删除。”
方案2
请注意以下操作注意版本差异及修改前做好备份。
根据用户的评论,目前Consul客户端没有可配置的设置来控制节点删除的时间。用户提到了一个GitHub issue,希望能够启用这个功能。你可以参考这个链接:https://github.com/hashicorp/consul/issues/2982。
用户还提到了使用force-leave
命令来删除联邦(federation)的两个Consul(VM – K8s)之间的关联,但这是一个丑陋的解决方法。
方案3
用户还提到了尝试使用-prune
标志,但出现了”the flag provided but not defined: -prune”的错误。根据用户的评论,这个标志可能不适用于当前的Consul版本(1.1.0)。
总结
在使用Consul的客户端模式时,要快速删除死亡的客户端节点,可以尝试以下解决方案:
– 方案1:优雅地注销节点,让Consul知道节点已经离开,并将其从集群中删除。
– 方案2:目前Consul客户端可能没有可配置的设置来控制节点删除的时间。你可以关注相关的GitHub issue,希望能够启用这个功能。
– 方案3:使用force-leave
命令来删除联邦(federation)的两个Consul(VM – K8s)之间的关联。请注意,这可能是一个丑陋的解决方法。
请根据你的具体情况选择适合的解决方案。