删除 etcd 成员时超出上下文截止期限

删除 etcd 成员时超出上下文截止期限

我的集群不健康,etcd因为一个成员无法加入。该成员不存在,并且etcd卡在选择领导者的过程中。

即,有一个包含 3 个节点的集群,其中一个节点尝试加入但失败了,现在集群有 4 个成员,其中一个不可用。etcd开始选择一个领导者,并停留在该状态。

因此,etcdctl不再起作用。但我可以使用 访问节点 API curl

显然,这是不健康的:

curl https://10.0.0.1:2379/health
{"health":"false","reason":"RAFT NO LEADER"}

成员列表返回一个包含 4 名成员的列表:

curl https://10.0.0.1:2379/v2/members | jq

{
  "members": [
    {
      "id": "32ee161a1cedcf0a",
      "name": "",
      "peerURLs": ["https://10.0.0.13:2380"],
      "clientURLs": []
    },
    +3 more, which are actual nodes
}

当我尝试删除它时出现错误:

curl https://10.0.0.1:2379/v2/members/32ee161a1cedcf0a -XDELETE
{"message":"Internal Server Error"}

日志中etcd有:

... "caller":"v2http/client.go:267","msg":"failed to remove a member","member-id":"32ee161a1cedcf0a","error":"context deadline exceeded"}
... "caller":"etcdhttp/base.go:136","msg":"unexpected v2 response error","remote-addr":"10.0.0.1:41562","internal-server-error":"context deadline exceeded"}

所有其他日志都etcd试图就领导者选择和超时达成共识。

据我了解,节点的不健康状态不允许它接受/传播任何更改,包括对成员列表的更改。但要修复此不健康状态,我需要更改成员列表。

该如何处理这种状态?

相关内容