Auf dieser Seite wird beschrieben, wie ein fehlgeschlagenes etcd-Replikat in einem Hochverfügbarkeits-Nutzercluster (HA) für Anthos-Cluster auf VMware (GKE On-Prem) ersetzt wird.
Hinweis
Überprüfen Sie, ob der Admin-Cluster ordnungsgemäß funktioniert.
Prüfen Sie, ob die anderen beiden etcd-Mitglieder im Nutzercluster ordnungsgemäß funktionieren. Wenn mehr als ein etcd-Mitglied fehlgeschlagen ist, lesen Sie die Informationen unter Wiederherstellung von Datenfehlern oder Verlusten von etcd.
Fehlerhaftes etcd-Replikat ersetzen
Sichern Sie eine Kopie des etcd PodDisruptionBudget (PDB), das Sie später wiederherstellen können.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > /path/to/etcdpdb.yaml
Dabei gilt:
ADMIN_CLUSTER_KUBECONFIG
ist der Pfad zur kubeconfig-Datei für den Administratorcluster.USER_CLUSTER_NAME
ist der Name des Nutzerclusters, der das fehlgeschlagene etcd-Replikat enthält.
Löschen Sie das etcd PodDisruptionBudget (PDB).
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
Führen Sie den folgenden Befehl aus, um das StatefulSet von kube-etcd im Texteditor zu öffnen:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd
Ändern Sie den Wert des Flags
--initial-cluster-state
inexisting
.containers: - name: kube-etcd ... args: - --initial-cluster-state=existing ...
Leeren des fehlerhaften etcd-Replikatknotens per Drain beenden
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data
Dabei ist
NODE_NAME
der Name des ausgefallenen etcd-Replikatknotens.Erstellen Sie eine neue Shell im Container eines der funktionierenden kube-etcd-Pods.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \ KUBE_ETCD_POD --container kube-etcd --namespace USER_CLUSTER_NAME \ -- bin/sh
Dabei ist
KUBE_ETCD_POD
der Name des funktionierenden Pods "kube-etcd". Beispiel:kube-etcd-0
Führen Sie in dieser neuen Shell die folgenden Befehle aus:
Entfernen Sie den fehlgeschlagenen etcd-Replikatknoten aus dem etcd-Cluster.
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key --endpoints=https://127.0.0.1:2379 member remove MEMBER_ID
Dabei ist
MEMBER_ID
die ID des ausgefallenen etcd-Replikatknotens. Führen Sie den folgenden Befehl aus, um die ID abzurufen:ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key member list -w fields
Mit dem vorherigen Befehl werden alle Mitglieder des etcd-Clusters angezeigt. Die Ausgabe sieht etwa so aus:
sh-5.0# ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcd.key member list -w fields "ClusterID" : 6963206042588294154 "MemberID" : 4645269864592341793 "Revision" : 0 "RaftTerm" : 15 "ID" : 2279696924967222455 "Name" : "kube-etcd-2" "PeerURL" : "https://kube-etcd-2.kube-etcd:2380" "ClientURL" : "https://kube-etcd-2.kube-etcd:2379" "IsLearner" : false "ID" : 3728561467092418843 "Name" : "kube-etcd-1" "PeerURL" : "https://kube-etcd-1.kube-etcd:2380" "ClientURL" : "https://kube-etcd-1.kube-etcd:2379" "IsLearner" : false "ID" : 4645269864592341793 "Name" : "kube-etcd-0" "PeerURL" : "https://kube-etcd-0.kube-etcd:2380" "ClientURL" : "https://kube-etcd-0.kube-etcd:2379" "IsLearner" : false sh-5.0#
Die
MemberID
in der vorherigen Ausgabe ist die Mitglieds-ID des ausgeführten kube-etcd-Pods. Rufen Sie als Nächstes dieID
des fehlgeschlagenen etcd-Replikatknotens ab. Im obigen Beispiel hatkube-etcd-0
dieID
4645269864592341793
,kube-etcd-1
hat dieID
3728561467092418843
undkube-etcd-2
hat dieID
2279696924967222455
.Nachdem Sie die Mitglieds-
ID
gefunden haben, konvertieren Sie sie von dezimal in hexadezimal, da der Befehlmember remove
nur eine Hexadezimal-Mitglieds-ID
akzeptiert, währendmember list
eine Dezimalzahl zurückgibt. Sie können für die Konvertierungprintf
verwenden. In diesem Beispiel fürkube-etcd-2
lautet dieser Befehl:printf '%x\n' 2279696924967222455
Die Ausgabe des vorherigen Befehls ist die
MEMBER_ID
, die Sie für den Befehlmember remove
verwenden müssen.Fügen Sie ein neues Mitglied mit demselben Namen und derselben Peer-URL wie der ausgefallene Replikatknoten hinzu.
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380
Dabei ist
MEMBER_NAME
die ID des fehlgeschlagenen Replikats von kube-etcd. Beispiel:kube-etcd-1
oderkube-etcd2
Führen Sie die Schritte 1 bis 3 unter Dienstprogramm-Pods bereitstellen aus, um einen Dienstprogramm-Pod im Administratorcluster zu erstellen. Dieser Pod wird verwendet, um im Nutzercluster auf das PersistentVolume (PV) des fehlgeschlagenen etcd-Mitglieds zuzugreifen.
Bereinigen Sie das etcd-Datenverzeichnis innerhalb des Dienstprogramm-Pods.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- bash -c 'rm -rf /var/lib/etcd/*'
Löschen Sie den Hilfs-Pod:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
Knoten für das Fehlschlagen aufheben.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
Öffnen Sie das StatefulSet kube-etcd in Ihrem Texteditor.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd
Ändern Sie den Wert des Flags
--initial-cluster-state
innew
.containers: - name: kube-etcd ... args: - --initial-cluster-state=new ...
Stellen Sie die etcd PDB wieder her, die in Schritt 1 gelöscht wurde.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml