Unter bestimmten Bedingungen können Richtlinien von PodDisruptionBudgets (PDB) verhindern, dass Knoten erfolgreich aus Knotenpools entfernt werden.
Unter diesen Bedingungen meldet der Knotenstatus Ready,SchedulingDisabled
, obwohl er entfernt wurde. In diesem Dokument wird gezeigt, wie Sie Knoten aus Ihren GKE on Bare-Metal-Clustern entfernen, die derzeit durch PDB-Probleme blockiert sind.
PDB steht in Konflikt mit der Anzahl der verfügbaren Pods
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, die Sie vornehmen möchten, wenn Sie durch das Entfernen eines Knotens gegen die Richtlinie verstoßen würden.
Mit einer PDB-Richtlinie kann beispielsweise festgelegt werden, dass im System immer zwei Pods verfügbar sein sollen (.spec.minAvailable
ist 2). Wenn Sie jedoch nur zwei Pods haben und versuchen, den Knoten zu entfernen, der einen davon enthält, wird die PDB-Richtlinie wirksam und verhindert das Entfernen des Knotens.
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. Die PDB-Richtlinie verhindert das Löschen des betroffenen Knotens, auch wenn Sie versuchen, jeweils nur einen Pod zu entfernen.
PDB-Richtlinie deaktivieren und wieder aktivieren
Um einen PDB-Konflikt zu lösen, sichern Sie die PDB-Richtlinie und entfernen Sie sie anschließend. Nachdem das PDB erfolgreich gelöscht wurde, wird der Knoten Drain beendet und die zugehörigen Pods werden entfernt. Sie können dann die gewünschten Änderungen vornehmen und die PDB-Richtlinie wieder aktivieren.
Das folgende Beispiel zeigt, wie ein Knoten in dieser Bedingung gelöscht wird, was alle Arten von GKE on Bare Metal-Clustern betreffen kann: 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.
Der Einfachheit halber wird die Variable
${KUBECONFIG}
in den folgenden Befehlen verwendet.Exportieren Sie je nach Clustertyp den Pfad zur kubeconfig-Datei des Administratorclusters (
ADMIN_KUBECONFIG
) oder 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. - Zum Löschen eines Knotens aus einem Administratorcluster legen Sie
export KUBECONFIG=ADMIN_KUBECONFIG
fest.
- Zum Löschen eines Knotens aus einem Nutzercluster legen Sie
Optional: Wenn Sie einen Knoten aus einem Nutzercluster-Knotenpool 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 spezifische Informationen für Ihre Clusterumgebung:
ADMIN_KUBECONFIG
: Der Pfad zur kubeconfig-Datei des Administratorclusters.CLUSTER_NAME
: den Namen des Clusters, von dem Sie einen Snapshot erstellen möchtenUSER_CLUSTER_CONFIG
: der Pfad zur Konfigurationsdatei des Nutzerclusters.
Nachdem Sie den Knoten aus dem Knotenpool entfernt haben, prüfen Sie den Knotenstatus. Der betroffene Knoten meldet
Ready, SchedulingDisabled
:kubectl get nodes --kubeconfig ${KUBECONFIG}
Der Knotenstatus sieht in etwa wie die folgende Beispielausgabe 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
Prüfen Sie die PDBs in Ihrem Cluster:
kubectl get pdb --kubeconfig ${KUBECONFIG} -A
Das System meldet PDBs, die den in der folgenden Beispielausgabe gezeigten ähneln:
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
Ü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"}}}
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
Nachdem Sie den betroffenen Pod geprüft 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
Löschen Sie die jeweilige PDB-Richtlinie. In den folgenden Beispielen wird die Richtlinie
log-aggregator
wieder 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 entfernen und auch die damit verknüpften Speicherressourcen entfernen möchten, können Sie dies tun, bevor Sie die PDB-Richtlinie wiederherstellen. Weitere Informationen finden Sie unter Speicherressourcen entfernen.
Stellen Sie die PDB-Richtlinie aus Ihrer Kopie wieder her:
kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
Prüfen Sie, ob die gelöschten Pods erfolgreich neu erstellt wurden. Wenn in diesem Beispiel zwei
stackdriver-log-aggregator-x
-Pods vorhanden sind, werden diese neu erstellt:kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
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 nicht auf Ihrem System wiederherstellen möchten, können Sie auch die mit diesem Knoten verknüpften Speicherressourcen löschen.
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}'
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.