etcd wird fehlerhaft, nachdem ich einen Masterknoten gelöscht habe. Ich suche nach einer Lösung

etcd wird fehlerhaft, nachdem ich einen Masterknoten gelöscht habe. Ich suche nach einer Lösung

Ich habe ein Kubernetes-Cluster-Setup mit kubeadm, 3 Masterknoten. Eines Tages musste einer der Masterknoten außer Betrieb genommen werden (Infrastrukturmigration), also habe ich diesen Masterknoten gelöscht, indem ich „kubectl delete node ***“ ausgeführt habe. Bis vor ein paar Tagen habe ich eine neue VM installiert und versucht, sie wieder als Master dem Cluster hinzuzufügen. Beim Überprüfen des etcd-Integritätsstatus ist dies fehlgeschlagen.

[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

Dann überprüfe ich die Protokolle des restlichen etcd-Pods und es sieht so aus, als ob es anfängt, einen etcd-Fehler zu melden, seit der Masterknoten gelöscht wurde.

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

Wie Sie oben sehen, wird der Fehler seit Tagen kontinuierlich gemeldet. Ich denke, das liegt vielleicht daran, dass etcd sich noch an den bereits gelöschten Knoten erinnert. Wenn das so ist, würde ich diesen Knoten auch in etcd dauerhaft löschen wollen, um den fehlerhaften Zustand zu vermeiden.

Ich bin nicht sicher, ob Sie jemals auf dieses Problem gestoßen sind und eine Lösung gefunden haben.

Danke.

Antwort1

Endlich habe ich eine Lösung gefunden.

Zuerst müssen Sie sich an einen beliebigen etcd-Pod anschließen, um den gelöschten Masterknoten zu entfernen, der sich noch im etcd-Cluster befindet, und sicherstellen, dass der Cluster endlich fehlerfrei ist.

**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

Zweitens gibt es eine Configmap namens kubeadm-config im kube-public-Namespace, die sich noch an den gelöschten Masterknoten als einen der API-Endpunkte erinnert. Dies blockiert den Beitritt zu einem neuen Masterknoten beim Überprüfen des Integritätsstatus des etcd-Clusters, da kubeadm diese Configmap liest und den gelöschten Knoten als zu überprüfenden etcd-Knoten nimmt. Exportieren Sie diesen Namespace also in eine YAML-Datei, bearbeiten Sie die Datei und wenden Sie sie wieder an, um sie aus der Liste der API-Endpunkte zu löschen.

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: …

Getestete Version: 1.14.3

verwandte Informationen