Durch PodDisruptionBudgets blockierte Knoten entfernen

Unter bestimmten Bedingungen können PodDisruptionBudgets (PDB)-Richtlinien verhindern, dass Knoten erfolgreich aus Knotenpools entfernt werden. Unter diesen Bedingungen meldet der Knotenstatus Ready,SchedulingDisabled, obwohl er entfernt wurde. In diesem Dokument wird beschrieben, wie Sie Knoten aus Google Distributed Cloud-Clustern entfernen, die derzeit durch PDB-Probleme blockiert sind.

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.

PDB steht mit der Anzahl der verfügbaren Pods in Konflikt

Mit den PDB-Richtlinien können Sie die Anwendungsleistung gewährleisten, indem Sie verhindern, dass Pods gleichzeitig ausfallen, wenn Sie Änderungen am System vornehmen. Daher begrenzen PDB-Richtlinien die Anzahl der gleichzeitig nicht verfügbaren Pods in einer replizierten Anwendung.

Die PDB-Richtlinie kann jedoch manchmal das Löschen von Knoten verhindern, wenn Sie durch das Entfernen eines Knotens gegen die Richtlinie verstoßen.

Beispielsweise kann in einer PDB-Richtlinie festgelegt werden, dass immer zwei Pods im System verfügbar sein sollten (.spec.minAvailable ist 2). Wenn Sie jedoch nur zwei Pods haben und versuchen, den Knoten zu entfernen, der einen von ihnen enthält, wird die PDB-Richtlinie wirksam und verhindert, dass der Knoten entfernt wird.

Wenn in der PDB-Richtlinie festgelegt ist, dass keine Pods nicht verfügbar sein sollen (.spec.maxUnavailable ist 0), verhindert die Richtlinie auch, dass zugehörige Knoten gelöscht werden. Selbst wenn Sie versuchen, jeweils nur einen Pod zu entfernen, verhindert die PDB-Richtlinie, dass Sie den betroffenen Knoten löschen.

PDB-Richtlinie deaktivieren und wieder aktivieren

Erstellen Sie eine Sicherung und entfernen Sie dann die PDB-Richtlinie, um einen PDB-Konflikt zu beheben. Nachdem das PDB erfolgreich gelöscht wurde, wird der Knoten entleert und die zugehörigen Pods werden entfernt. Anschließend können Sie die gewünschten Änderungen vornehmen und die PDB-Richtlinie wieder aktivieren.

Das folgende Beispiel zeigt, wie ein Knoten in dieser Bedingung gelöscht wird. Dies kann sich auf alle Arten von Google Distributed Cloud-Clustern auswirken: Administrator-, Hybrid-, eigenständige und Nutzercluster.

Das gleiche allgemeine Verfahren gilt für alle Clustertypen. Die spezifischen Befehle zum Löschen eines Knotens aus einem Administratorcluster-Knotenpool (für Administrator-, Hybrid- oder eigenständige Cluster) unterscheiden sich jedoch geringfügig von den Befehlen zum Löschen eines Knotens aus einem Nutzercluster-Knotenpool.

  1. Zur besseren Lesbarkeit wird in den folgenden Befehlen die Variable ${KUBECONFIG} verwendet.

    Exportieren Sie je nach Clustertyp den kubectl-Pfad des Administratorclusters (ADMIN_KUBECONFIG) oder den Pfad der kubeconfig-Datei des Nutzerclusters (USER_CLUSTER_CONFIG) nach $(KUBECONFIG) und führen Sie die folgenden Schritte aus:

    • Zum Löschen eines Knotens aus einem Nutzercluster legen Sie export KUBECONFIG=USER_CLUSTER_CONFIG fest.
    • Wenn Sie einen Knoten aus einem Administratorcluster löschen möchten, legen Sie export KUBECONFIG=ADMIN_KUBECONFIG fest.
  2. Optional: Wenn Sie einen Knoten aus dem Knotenpool eines Nutzerclusters löschen, führen Sie den folgenden Befehl aus, um die kubeconfig-Datei des Nutzerclusters zu extrahieren:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n cluster-USER_CLUSTER_NAME \
      get secret USER_CLUSTER_NAME-kubeconfig  \
      -o 'jsonpath={.data.value}' | base64 -d > USER_CLUSTER_CONFIG
    

    Ersetzen Sie die folgenden Einträge durch Informationen, die für Ihre Clusterumgebung spezifisch sind:

    • ADMIN_KUBECONFIG: der Pfad zur kubeconfig-Datei des Administratorclusters
    • CLUSTER_NAME: den Namen des Clusters, von dem Sie einen Snapshot erstellen möchten
    • USER_CLUSTER_CONFIG: der Pfad zur Konfigurationsdatei des Nutzerclusters.
  3. Prüfen Sie nach dem Entfernen des Knotens aus dem Knotenpool den Knotenstatus. Der betroffene Knoten meldet Ready, SchedulingDisabled:

    kubectl get nodes --kubeconfig ${KUBECONFIG}
    

    Der Knotenstatus sieht in etwa so aus:

    NAME   STATUS                    ROLES      AGE      VERSION
    CP2    Ready                     Master     11m      v.1.18.6-gke.6600
    CP3    Ready,SchedulingDisabled  <none>     9m22s    v.1.18.6-gke.6600
    CP4    Ready                     <none>     9m18s    v.1.18.6-gke.6600
    
  4. Prüfen Sie die PDBs in Ihrem Cluster:

    kubectl get pdb --kubeconfig ${KUBECONFIG} -A
    

    Das System meldet ähnliche PDBs wie in der folgenden Beispielausgabe gezeigt:

    NAMESPACE     NAME             MIN AVAILABLE    MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
    gke-system    istio-ingress    1                N/A               1                     19m
    gke-system    istiod           1                N/A               1                     19m
    kube-system   coredns          1                N/A               0                     19m
    kube-system   log-aggregator   N/A              0                 0                     19m
    kube-system   prometheus       N/A              0                 0                     19m
    
  5. Überprüfen Sie die PDB. Suchen Sie nach einer Übereinstimmung zwischen dem Pod-Label im PDB und den übereinstimmenden Pods im Knoten. Dadurch wird sichergestellt, dass Sie das richtige PDB deaktivieren, um den Knoten erfolgreich zu entfernen:

    kubectl --kubeconfig ${KUBECONFIG} get pdb log-aggregator -n kube-system -o 'jsonpath={.spec}'
    

    Das System gibt entsprechende Labelergebnisse in der PDB-Richtlinie zurück:

    {"maxUnavailable":0,"selector":{"matchLabels":{"app":"stackdriver-log-aggregator"}}}
    
  6. Suchen Sie nach Pods, die mit dem PDB-Richtlinienlabel übereinstimmen:

    kubectl --kubeconfig ${KUBECONFIG} get pods -A --selector=app=stackdriver-log-aggregator  \
      -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}'
    

    Der Befehl gibt eine Liste von Pods zurück, die dem PDB-Label entsprechen, und überprüft die PDB-Richtlinie, die Sie entfernen müssen:

    stackdriver-log-aggregator-0    CP3
    stackdriver-log-aggregator-1    CP3
    
  7. Nachdem Sie den betroffenen Pod bestätigt haben, erstellen Sie eine Sicherungskopie der PDB-Richtlinie. Im folgenden Beispiel wird die Richtlinie log-aggregator gesichert:

    kubectl get pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system  \
      -o yaml >> log-aggregator.yaml
    
  8. Löschen Sie die spezifische PDB-Richtlinie. Auch hier wird die Richtlinie log-aggregator gelöscht:

    kubectl delete pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system
    

    Nachdem Sie die PDB-Richtlinie gelöscht haben, wird der Knoten per Drain beendet. Es kann jedoch bis zu 30 Minuten dauern, bis der Knoten vollständig gelöscht ist. Prüfen Sie weiterhin den Knotenstatus, um zu bestätigen, dass der Prozess erfolgreich abgeschlossen wurde.

    Wenn Sie den Knoten dauerhaft und auch die mit dem Knoten verknüpften Speicherressourcen entfernen möchten, können Sie dies tun, bevor Sie die PDB-Richtlinie wiederherstellen. Weitere Informationen finden Sie unter Speicherressourcen entfernen.

  9. Stellen Sie die PDB-Richtlinie aus Ihrer Kopie wieder her:

    kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
    
  10. Prüfen Sie, ob die gelöschten Pods erfolgreich neu erstellt wurden. In diesem Beispiel werden zwei stackdriver-log-aggregator-x-Pods neu erstellt:

    kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
    
  11. Wenn Sie den Knoten wiederherstellen möchten, bearbeiten Sie die entsprechende Knotenpoolkonfiguration und stellen Sie die IP-Adresse des Knotens wieder her.

Speicherressourcen von endgültig gelöschten Knoten entfernen

Wenn Sie einen Knoten endgültig löschen und ihn nicht auf Ihrem System wiederherstellen möchten, können Sie auch die mit diesem Knoten verknüpften Speicherressourcen löschen.

  1. Prüfen Sie den Namen des nichtflüchtigen Speichers (PV), der dem Knoten zugeordnet ist, und rufen Sie ihn ab:

    kubectl get pv --kubeconfig ${KUBECONFIG}  \
      -A -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{.spec.claimRef.name}{":\t}  \
      {.spec.nodeAffinity.required.nodeSelectorTerms[0].matchExpressions[0].values}{"\n"}{end}'
    
  2. Löschen Sie das mit dem Knoten verknüpfte PV:

    kubectl delete pv PV_NAME --kubeconfig ${KUBECONFIG}
    

    Ersetzen Sie PV_NAME durch den Namen des nichtflüchtigen Volumes, das gelöscht werden soll.

Nächste Schritte

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.