Consul如何从更改节点IP的仲裁丢失中恢复过来?

时间:2019-02-27 22:54:45

标签: kubernetes consul

我使用Consul部署了Helm chart服务器,这给了我一个三节点集群。我可以查看节点的IP地址和ID:

$ consul catalog nodes
Node             ID        Address     DC
consul-server-0  065ab1e4  10.60.1.11  dc1
consul-server-1  46eca681  10.60.0.16  dc1
consul-server-2  fb5fa37d  10.60.2.8   dc1

作为测试,我强制删除了这三个节点,如下所示:

kubectl delete pods -n consul --force --grace-period=0 consul-server-0 consul-server-1 consul-server-2

三个新的Pod提出了不同的IP但具有相同的ID,加入了集群并再次达成共识:

$ consul catalog nodes
Node             ID        Address     DC
consul-server-0  065ab1e4  10.60.1.12  dc1
consul-server-1  46eca681  10.60.2.9   dc1
consul-server-2  fb5fa37d  10.60.0.17  dc1

领事要依靠什么来从这种情况中恢复过来?由于ID相同,是否可以再次形成仲裁,然后在它们之间确定IP已更改?还是保持一致的节点名称也是自动恢复的要求?

我看到如下日志消息:

consul: removed server with duplicate ID: 46eca681-b5d6-21e7-3df5-cf228ffdd02c

因此,似乎IP地址的更改正在导致将新节点添加到群集,但是Consul认为需要将其删除。因此,我希望在一个点上有6个节点,而3个节点不可用,从而导致群集丢失仲裁且无法自动恢复,但这不会发生。

1 个答案:

答案 0 :(得分:1)

我们还在docker swarm中运行consul,失败后的恢复不是一个小问题。因为出现故障的服务器显然会在具有不同IP的新容器中重新创建。领事出现很多关于筏的错误和信息。但是我没有看到严重的问题。我只是过滤这种日志,而不转换为Elasticsearch中的长寿命索引。

我们使用下一个配置来更快地恢复服务器:

{
  "skip_leave_on_interrupt" : true,
  "leave_on_terminate" : true,
  "disable_update_check": true,
  "autopilot" : {
    "cleanup_dead_servers": true,
    "last_contact_threshold": "1s"
  }
}

您可以查看参数here