Fehlerhaftes etcd-Replikat ersetzen

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

  1. 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.

  2. Löschen Sie das etcd PodDisruptionBudget (PDB).

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
  3. 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 in existing.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=existing
          ...
     
  4. 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.

  5. 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:

    1. 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 die ID des fehlgeschlagenen etcd-Replikatknotens ab. Im obigen Beispiel hat kube-etcd-0 die ID 4645269864592341793, kube-etcd-1 hat die ID 3728561467092418843 und kube-etcd-2 hat die ID 2279696924967222455.

      Nachdem Sie die Mitglieds-ID gefunden haben, konvertieren Sie sie von dezimal in hexadezimal, da der Befehl member remove nur eine Hexadezimal-Mitglieds-ID akzeptiert, während member list eine Dezimalzahl zurückgibt. Sie können für die Konvertierung printf verwenden. In diesem Beispiel für kube-etcd-2 lautet dieser Befehl:

      printf '%x\n' 2279696924967222455
      

      Die Ausgabe des vorherigen Befehls ist die MEMBER_ID, die Sie für den Befehl member remove verwenden müssen.

    2. 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-1oder kube-etcd2

  6. 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.

  7. 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/*'
  8. Löschen Sie den Hilfs-Pod:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  9. Knoten für das Fehlschlagen aufheben.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  10. Ö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 in new.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=new
          ...
     
  11. 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