在我的项目中,我们在本地部署了Kubernetes上的etcd数据库(此etcd供应用程序使用,与Kubernetes etcd分开)。因此,我使用bitnami Helm chart 作为有状态集进行了部署。最初,在部署时,副本数量为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吗?如果是,我不确定如何确定。
非常感谢您的帮助。
最佳答案
我不认为🤔心跳是主要问题,而且似乎👀您看到的日志是警告日志。因此有可能在这里和那里错过了一些心跳,但是您的节点是未崩溃或未镜像的节点。
您可能已更改了副本号,而新副本未加入集群。因此,我建议您遵循此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集群,该集群应能够处理节点的扩展和删除/添加。
✌️
关于database - kubernetes上的etcd数据库集群行为异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63021675/