删除一个主节点后,etcd 变得不健康,我正在寻找解决方法

删除一个主节点后,etcd 变得不健康,我正在寻找解决方法

我有一个使用 kubeadm 设置的 Kubernetes 集群,有 3 个主节点。有一天,其中一个主节点需要退役(基础设施迁移),因此我通过运行“kubectl delete node ***”删除了该主节点。直到几天前,我安装了一个新的 VM 并尝试将其作为主节点重新加入集群,但在检查 etcd 运行状况时失败了。

[check-etcd] Checking that the etcd cluster is healthy
error execution phase check-etcd: error syncing endpoints with etc: dial tcp 10.233.42.22:2379: connect: no route to host

然后我检查其余 etcd pod 的日志,看起来自从主节点被删除后它就开始报告 etcd 不健康。

rafthttp: health check for peer 55ab807fd1dc1d4 could not connect: dial tcp 10.233.42.22:2380: i/o timeout

kubectl logs etcd-ne1-prd-lnxstgivt01.ubisoft.org -n kube-system | grep 'could not connect: dial tcp 10.233.42.22:2380: i/o timeout' | awk '{ print $1 }' | uniq
2019-08-12
2019-08-13
2019-08-14
2019-08-15
2019-08-16
2019-08-17
2019-08-18
2019-08-19
2019-08-20
2019-08-21
2019-08-22

从上面可以看出,错误持续报告了好几天。我想这可能是因为 etcd 仍然记得已经删除的节点。如果是这样,我想在 etcd 中永久删除该节点,以避免不健康状态。

不确定您是否遇到过此问题并找到了解决方案。

谢谢。

答案1

最后我终于找到了解决办法。

首先,您需要附加到任意 etcd pod 来删除仍然保留在 etcd 集群中的已删除的主节点,并确保集群最终是健康的。

**List current nodes to get failed node id**
/ # etcdctl --endpoint=https://10.0.1.31:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/peer.crt --key-file=/etc/kubernetes/pki/etcd/peer.key member list
55ab807fd1dc1d4: name=ae1-prd-lnxstgivt01.ubisoft.org peerURLs=https://10.233.42.22:2380 clientURLs=https://10.233.42.22:2379 isLeader=false
3da60ac5e6f29b0e: name=pdc-prd-lnxstginvt01.ubisoft.org peerURLs=https://10.0.1.31:2380 clientURLs=https://10.0.1.31:2379 isLeader=false
d13a6c20fbb32f2d: name=ne1-prd-lnxstgivt01.ubisoft.org peerURLs=https://10.136.66.170:2380 clientURLs=https://10.136.66.170:2379 isLeader=true

**Remove the dead one**
/ # etcdctl --endpoint=https://10.0.1.31:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/peer.crt --key-file=/etc/kubernetes/pki/etcd/peer.key member remove 55ab807fd1dc1d4
Removed member 55ab807fd1dc1d4 from cluster

**Verify it is removed**
/ # etcdctl --endpoint=https://10.0.1.31:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/peer.crt --key-file=/etc/kubernetes/pki/etcd/peer.key member list
3da60ac5e6f29b0e: name=pdc-prd-lnxstginvt01.ubisoft.org peerURLs=https://10.0.1.31:2380 clientURLs=https://10.0.1.31:2379 isLeader=false
d13a6c20fbb32f2d: name=ne1-prd-lnxstgivt01.ubisoft.org peerURLs=https://10.136.66.170:2380 clientURLs=https://10.136.66.170:2379 isLeader=true

其次,kube-public 命名空间中有一个名为 kubeadm-config 的配置映射,它仍将已删除的主节点记为 api 端点之一。这将阻止您在检查 etcd 集群健康状态阶段加入新的主节点,因为 kubeadm 将读取该配置映射并将已删除的节点作为要检查的 etcd 节点。因此,将该命名空间导出到 yaml 文件,编辑该文件并将其应用回去以将其从 api 端点列表中删除。

kubectl get configmap kubeadm-config -n kube-system -o yaml
apiVersion: v1
data:
  ClusterStatus: |
    apiEndpoints:
      ae1-prd-lnxstgivt01.ubisoft.org:
        advertiseAddress: 10.233.42.22
        bindPort: 6443
      ne1-prd-lnxstgivt01.ubisoft.org:
        advertiseAddress: 10.136.66.170
        bindPort: 6443
      pdc-prd-lnxstginvt01.ubisoft.org:
        advertiseAddress: 10.0.1.31
        bindPort: 6443
    apiVersion: kubeadm.k8s.io/v1beta1
    kind: ClusterStatus
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: …

测试版本:1.14.3

相关内容