Das Entfernen von defekten Knoten in Anthos-Cluster on Bare Metal erzwingen

Wenn ein Knoten beschädigt ist und für eine Reparatur oder einen Ersatz aus einem Cluster entfernt werden muss, können Sie das Entfernen aus dem Cluster erzwingen.

Entfernen von Knoten in Anthos-Cluster on Bare Metal 1.6.0 erzwingen

In Version 1.6.0 von Anthos on Bare Metal führt das Entfernen eines Knotens aus seinem übergeordneten Knotenpool zu folgenden Aktionen:

  • Leeren des Knotens
  • Entfernen des Knotens aus Kubernetes-Cluster
  • Zurücksetzen der Maschine in den Zustand vor der Installation von Anthos on Bare Metal

Wenn der Knoten jedoch nicht zugänglich ist, wird das Leeren des Knotens nicht abgeschlossen. Der Controller versucht wiederholt, den Knoten zu entleeren, und macht niemals Fortschritte.

Als vorübergehende Problemumgehung können Sie die folgenden Änderungen anwenden, um die Schritte zum Entleeren und Zurücksetzen zu umgehen.

ACHTUNG: Für diesen Vorgang müssen bestimmte Implementierungsfelder in benutzerdefinierten Kubernetes-Ressourcen sorgfältig aktualisiert werden. Fahren Sie erst fort, wenn Sie sicher sind, dass der Knoten nicht wiederhergestellt werden kann.

Führen Sie diese Schritte aus, nachdem Sie den fehlerhaften Knoten aus dem Knotenpool entfernt und die Änderung im Administratorcluster angewendet haben.

  1. Ermitteln Sie die benutzerdefinierte Ressource der Cluster-API-Maschine im Administratorcluster, wobei ADMIN_KUBECONFIG der Pfad zur Datei kubeconfig und CLUSTER_NAMESPACE der betroffene Cluster-Namespace ist:

    kubectl --kubeconfig ADMIN_KUBECONFIG \
    -n CLUSTER_NAMESPACE get ma 10.200.0.8
    

    Die vom Befehl zurückgegebenen Ergebnisse sehen in etwa so aus:

    NAME         PROVIDERID               PHASE
    10.200.0.8   baremetal://10.200.0.8   Deleting
    

    In diesem Beispiel ist 10.200.0.8 die IP-Adresse des Knotens, der in der Löschphase festhängen.

  2. Bearbeiten Sie die benutzerdefinierte Ressource des Computers und fügen Sie die Annotation machine.cluster.x-k8s.io/exclude-node-draining hinzu. Beachten Sie, dass der Annotationswert selbst keine Rolle spielt, da das Entleeren übersprungen wird, solange der Schlüssel vorhanden ist:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
    annotate ma 10.200.0.8 machine.cluster.x-k8s.io/exclude-node-draining=true
    
  3. Suchen Sie im Administratorcluster die benutzerdefinierte Ressource der Bare Metal-Maschine:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
    get baremetalmachine 10.200.0.8
    

    Die vom Befehl zurückgegebenen Ergebnisse sehen in etwa so aus:

    NAME         CLUSTER    READY   INSTANCEID               MACHINE
    10.200.0.8   cluster1   true    baremetal://10.200.0.8   10.200.0.8
    
  4. Entfernen Sie den Finaler, um den Zurücksetzensschritt zu überspringen und die Blockierung des Knotens aufzuheben:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
    patch baremetalmachine 10.200.0.8 --type json -p='[{"op": "remove", "path": "/metadata/finalizers"}]'
    

    Nach einigen Sekunden wird der Knoten aus dem Cluster entfernt.

Entfernen von Knoten in Anthos-Cluster on Bare Metal 1.6.1 erzwingen

In Anthos-Cluster on Bare Metal 1.6.1 können Sie eine Anmerkung hinzufügen, um einen Knoten zum erzwungenen Entfernen zu markieren.

Führen Sie nach dem Entfernen des Knotens aus dem übergeordneten Knotenpool den folgenden Befehl aus, um den entsprechenden fehlerhaften Computer mit der Annotation baremetal.cluster.gke.io/force-remove zu versehen. Der Wert der Annotation selbst spielt keine Rolle:

kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
  annotate machine 10.200.0.8 baremetal.cluster.gke.io/force-remove=true

Anthos on Bare Metal entfernt erfolgreich den Knoten.

Entfernen von Steuerungsebenenknoten erzwingen

Das erzwungene Entfernen eines Steuerebenenknotens ähnelt dem Durchführen eines kubeadm reset an Steuerebenenknoten und erfordert zusätzliche Schritte.

Um das Entfernen eines Steuerebenenknoten aus den Knotenpools zu erzwingen, müssen Sie die folgenden Aktionen für den Cluster ausführen, der den fehlerhaften Steuerebenenknoten enthält:

  • Entfernen Sie das fehlerhafte etcd-Mitglied, das auf dem ausgefallenen Knoten aus dem Cluster etcd ausgeführt wird.
  • Aktualisieren Sie ClusterStatus in kube, um den entsprechenden apiEndpoint zu entfernen.

Fehlerhaftes etcd-Mitglied entfernen

Führen Sie zuerst den Befehl etcdctl für die verbleibenden fehlerfreien etcd-Pods aus, um den ausgefallenen Steuerungsknoten zu entfernen. Weitere Informationen zu diesem Vorgang finden Sie in dieser Kubernetes-Dokumentation.

Im folgenden Verfahren ist CLUSTER_KUBECONFIG der Pfad zur Datei kubeconfig des Clusters.

  1. Suchen Sie mit dem folgenden Befehl den Pod etcd:

    kubectl --kubeconfig CLUSTER_KUBECONFIG get \
     pod -n kube-system -l component=etcd -o wide
    

    Der Befehl gibt die folgende Knotenliste zurück. In diesem Beispiel wird davon ausgegangen, dass der Knoten 10.200.0.8 nicht zugänglich ist und nicht wiederhergestellt werden kann:

    NAME                READY   STATUS    RESTARTS   AGE     IP           NODE
    etcd-357b68f4ecf0   1/1     Running   0          9m2s    10.200.0.6   357b68f4ecf0
    etcd-7d7c21db88b3   1/1     Running   0          33m     10.200.0.7   7d7c21db88b3
    etcd-b049141e0802   1/1     Running   0          8m22s   10.200.0.8   b049141e0802
    

  2. Führen Sie einen der verbleibenden fehlerfreien etcd-Pods aus:

    kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it -n \
    kube-system etcd-357b68f4ecf0 -- /bin/sh
    
  3. Suchen Sie in den aktuellen Mitgliedern nach der ID des fehlerhaften Mitglieds. Der Befehl gibt eine Liste zurück:

    etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt  member list
    

    Dieser Befehl gibt beispielsweise Folgendes zurück:

    23da9c3f2594532a, started, 7d7c21db88b3, https://10.200.0.6:2380, https://10.200.0.6:2379, false
    772c1a54956b7f51, started, 357b68f4ecf0, https://10.200.0.7:2380, https://10.200.0.7:2379, false
    f64f66ad8d3e7960, started, b049141e0802, https://10.200.0.8:2380, https://10.200.0.8:2379, false
    
  4. Entfernen Sie das fehlerhafte Mitglied:

    etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt \
     member remove f64f66ad8d3e7960
    

ClusterStatus aktualisieren und fehlerhaften apiEndpoint entfernen

Im folgenden Verfahren ist CLUSTER_KUBECONFIG der Pfad zur Datei kubeconfig des Clusters.

  1. Suchen Sie in der ConfigMap kubeadm-config den Abschnitt ClusterStatus:

    kubectl --kubeconfig CLUSTER_KUBECONFIG describe configmap -n \
    kube-system kubeadm-config
    

    Der Befehl gibt Ergebnisse wie die folgenden zurück:

    ...
    ClusterStatus:
    ----
    apiEndpoints:
    7d7c21db88b3:
      advertiseAddress: 10.200.0.6
      bindPort: 6444
    357b68f4ecf0:
      advertiseAddress: 10.200.0.7
      bindPort: 6444
    b049141e0802:
      advertiseAddress: 10.200.0.8
      bindPort: 6444
    apiVersion: kubeadm.k8s.io/v1beta2
    kind: ClusterStatus
    ...
    
  2. Bearbeiten Sie die Konfigurationszuordnung, um den Abschnitt zu entfernen, der die fehlerhafte IP enthält (dieses Beispiel zeigt die Ergebnisse des Entfernens von 10.200.0.8 mit dem Befehl kubectl edit):

    kubectl --kubeconfig CLUSTER_KUBECONFIG edit configmap \
    -n kube-system kubeadm-config
    

    Nach der Bearbeitung sieht der Konfigurationsplan etwa so aus:

    ...
    ClusterStatus: |
      apiEndpoints:
        7d7c21db88b3:
          advertiseAddress: 10.200.0.6
          bindPort: 6444
        357b68f4ecf0:
          advertiseAddress: 10.200.0.7
          bindPort: 6444
      apiVersion: kubeadm.k8s.io/v1beta2
      kind: ClusterStatus
    ...
    
  3. Wenn Sie die bearbeitete Konfigurationszuordnung speichern, wird der ausgefallene Knoten aus dem Cluster entfernt.