Fehlerhaftes etcd-Replikat ersetzen

In diesem Dokument wird beschrieben, wie Sie ein fehlgeschlagenes etcd-Replikat in einem Nutzercluster mit Hochverfügbarkeit (High Availability, HA) für Google Distributed Cloud ersetzen.

Die hier beschriebene Anleitung gilt für einen HA-Nutzercluster, der kubeception verwendet, d. h. für einen Nutzercluster, für den Controlplane V2 nicht aktiviert ist. Wenn Sie ein etcd-Replikat in einem Nutzercluster mit aktivierter Steuerungsebene V2 ersetzen müssen, wenden Sie sich an Cloud Customer Care.

Hinweise

  • Ü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_PDB_FILE

    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.

    • PATH_TO_PDB_FILE ist der Pfad, unter dem Sie die etcd-PDB-Datei speichern möchten, z. B. /tmp/etcpdb.yaml.

  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.

      Listen Sie zuerst alle Mitglieder des etcd-Clusters auf:

      etcdctl member list -w table

      In der Ausgabe werden alle Mitglieds-IDs angezeigt. Ermitteln Sie die Mitglieds-ID des fehlgeschlagenen Replikats.

      Entfernen Sie als Nächstes das fehlerhafte Replikat:

      export ETCDCTL_CACERT=/etcd.local.config/certificates/etcdCA.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_KEY=/etcd.local.config/certificates/etcd.key
      export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
      etcdctl member remove MEMBER_ID

      Dabei ist MEMBER_ID die hexadezimale Mitglieds-ID des ausgefallenen etcd-Replikat-Pods.

    2. Fügen Sie ein neues Mitglied mit demselben Namen und derselben Peer-URL wie der ausgefallene Replikatknoten hinzu.

      etcdctl 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. Listen Sie die etcd-Pods auf, die den etcd-Speicher für Ihren Nutzercluster verwalten. Diese Pods werden im Administratorcluster ausgeführt:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \
        --output wide | grep kube-etcd
    

    Die Ausgabe zeigt die etcd-Pods und die Knoten, auf denen die Pods ausgeführt werden. Die in der Ausgabe angezeigten Knoten sind Knoten im Administratorcluster, die als Steuerungsebenen für den Nutzercluster dienen:

    NAME              ...   NODE
    kube-etcd-0       ...   node-abc
    kube-etcd-1       ...   node-yyy
    kube-etcd-2       ...   node-zzz
    
  7. Notieren Sie sich die Namen der Pods und die Knotennamen der Steuerungsebene, die Sie im Pod-Manifest verwenden, das Sie im nächsten Schritt erstellen.

    Beachten Sie, dass jeder etcd-Pod den Namen kube-etcd, gefolgt von einer Nummer, hat. Diese Nummer wird als Mitgliedsnummer des Pods bezeichnet. Sie identifiziert den Pod als bestimmtes Mitglied des etcd-Clusters, der die Objektdaten für Ihren Nutzercluster enthält. In dieser Anleitung wird mit dem Platzhalter MEMBER_NUMBER auf die Mitgliedsnummer des etcd-Pods verwiesen.

    Beachten Sie außerdem, dass jeder Pod in Ihrem etcd-Cluster auf einem eigenen Knoten ausgeführt wird.

  8. Erstellen Sie ein Pod-Manifest, das einen Hilfs-Pod beschreibt, den Sie vorübergehend ausführen, um etcd-Daten wiederherzustellen. Speichern Sie das folgende Pod-Manifest im aktuellen Verzeichnis in einer Datei mit dem Namen etcd-utility-MEMBER_NUMBER.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: etcd-utility-MEMBER_NUMBER
      namespace: USER_CLUSTER_NAME
    spec:
      containers:
      - command: ["/bin/sh"]
        args: ["-ec", "while :; do echo '.'; sleep 5 ; done"]
        image: gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION
        name: etcd-utility
        volumeMounts:
        - mountPath: /var/lib/etcd
          name: data
        - mountPath: /etcd.local.config/certificates
          name: etcd-certs
      nodeSelector:
        kubernetes.googleapis.com/cluster-name: USER_CLUSTER_NAME
        kubernetes.io/hostname: NODE_NAME
      tolerations:
      - effect: NoExecute
        key: node.kubernetes.io/not-ready
        operator: Exists
        tolerationSeconds: 300
      - effect: NoExecute
        key: node.kubernetes.io/unreachable
        operator: Exists
        tolerationSeconds: 300
      - effect: NoSchedule
        key: node.kubernetes.io/unschedulable
        operator: Exists
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: data-kube-etcd-MEMBER_NUMBER
      - name: etcd-certs
        secret:
          defaultMode: 420
          secretName: KUBE_ETCD_SECRET_NAME
    

    Ersetzen Sie Folgendes:

    • NODE_NAME: Der Knoten, auf dem der kube-etcd-0-Pod ausgeführt wird.

    • USER_CLUSTER_NAME: Der Name des Nutzerclusters.

    • GKE_ON_PREM_VERSION: Die Version des Clusters, in dem Sie die etcd-Wiederherstellung durchführen möchten (z. B. 1.31.100-gke.136).

    • KUBE_ETCD_SECRET_NAME: Der Name des Secrets, das von etcd im Nutzercluster verwendet wird, beginnend mit kube-etcd-certs.

  9. Erstellen Sie den Hilfs-Pod in Ihrem Administratorcluster:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  10. Bereinigen Sie das etcd-Datenverzeichnis innerhalb des Dienstprogramm-Pods.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
  11. Löschen Sie den Hilfs-Pod:

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

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  13. Ö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
          ...
     
  14. 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