kubernetes上的etcd数据库集群行为异常

时间:2020-07-21 19:22:16

标签: database kubernetes kubernetes-helm kubernetes-pod etcd

在我的项目中,我们在本地部署了Kubernetes上的etcd数据库(此etcd供应用程序使用,与Kubernetes etcd分开)。因此,我使用bitnami舵图作为有状态集进行了部署。最初,在部署时,副本数量为1,因为我们希望更早的一个etcd DB实例。

真正的问题开始于我们将其扩展到3。我更新了配置以通过使用两个新成员DNS名称更新ETCD_INITIAL_CLUSTER来进行扩展:

etcd-0=http://etcd-0.etcd-headless.wallet.svc.cluster.local:2380,etcd-1=http://etcd-1.etcd-headless.wallet.svc.cluster.local:2380,etcd-2=http://etcd-2.etcd-headless.wallet.svc.cluster.local:2380

现在,当我进入任何etcd pod并运行 etcdctl成员列表时,我仅获得成员列表,而没有一个被选为领导者,这是错误的。领导者应该是三分之一。

在运行一段时间后,这些Pod开始发出心跳超出错误和服务器过载错误:

W |  etcdserver: failed to send out heartbeat on time (exceeded the 950ms timeout for 593.648512ms, to a9b7b8c4e027337a
W | etcdserver: server is likely overloaded
W | wal: sync duration of 2.575790761s, expected less than 1s

我相应地更改了心跳默认值,错误数量减少了,但仍然出现了一些心跳超过错误以及其他错误。

不知道这里是什么问题,是引起问题的I / O吗?如果是,我不确定如何确定。

在此方面的任何帮助将非常感谢。

2 个答案:

答案 0 :(得分:1)

我不认为?心跳是主要问题,而且似乎?您看到的日志是警告日志。因此有可能在这里和那里错过了一些心跳,但是您的节点是未崩溃或未镜像的节点。

您可能已更改了副本号,而新副本未加入集群。因此,我建议您遵循此guide将新成员添加到群集中。基本上使用etcdctl是这样的:

etcdctl member add node2 --peer-urls=http://node1:2380
etcdctl member add node3 --peer-urls=http://node1:2380,http://node2:2380

请注意,您必须在可以访问群集中所有etcd节点的Pod中运行这些命令。

您还可以考虑使用etcd operator managing管理etcd集群,该集群应该能够处理节点的扩展和删除/添加。

✌️<​​/ p>

答案 1 :(得分:0)

好的,我有两个问题:

  • “无法发送心跳”警告消息。

  • “没有领导人选举”。

第二天,我发现了第二个问题的原因,实际上我在pod定义中设置了启动参数。 ETCDCTL_API:3

因此,当我使用API​​v3运行“ etcdctl成员列表”时,并没有提及选择哪个成员作为读取器。

$ ETCDCTL_API=3 etcdctl member list
    
    3d0bc1a46f81ecd9, started, etcd-2, http://etcd-2.etcd-headless.wallet.svc.cluster.local:2380, http://etcd-2.etcd-headless.wallet.svc.cluster.local:2379, false
    b6a5d762d566708b, started, etcd-1, http://etcd-1.etcd-headless.wallet.svc.cluster.local:2380, http://etcd-1.etcd-headless.wallet.svc.cluster.local:2379, false


$ ETCDCTL_API=2 etcdctl member list
    
    3d0bc1a46f81ecd9, started, etcd-2, http://etcd-2.etcd-headless.wallet.svc.cluster.local:2380, http://etcd-2.etcd-headless.wallet.svc.cluster.local:2379, false
    b6a5d762d566708b, started, etcd-1, http://etcd-1.etcd-headless.wallet.svc.cluster.local:2380, http://etcd-1.etcd-headless.wallet.svc.cluster.local:2379, true

因此,当我使用API​​v2时,我可以看到哪个节点被选为领导者,并且领导者选举没有问题。仍在进行心跳警告,但我想我需要调整配置才能避免这种情况。

注意:我有3个节点,已停止进行测试。