Einführung
In einer Kubernetes-Produktionsumgebung müssen Knoten häufig gewartet werden. Die Herausforderung besteht darin, diese Arbeiten durchzuführen, ohne die Workloads unnötig zu beeinträchtigen.
Stellen Sie sich vor, der Knoten ist ein Hotelzimmer und die Pods sind die Gäste. Wenn Sie das Zimmer renovieren müssen, können Sie nicht einfach eintreten, während die Gäste schlafen. Sie brauchen einen höflichen und sicheren Ablauf.
In diesem Lab lernen Sie den standardmäßigen Ablauf für die Wartung eines Knotens kennen:
- Cordon (Bitte nicht stören): Bringen Sie an der Tür ein Schild mit der Aufschrift „Keine neuen Gäste“ an. Das Hotel (der Scheduler) weist diesem Zimmer keine neuen Gäste mehr zu.
- Drain (Räumung): Bitten Sie die bereits anwesenden Gäste höflich, das Zimmer zu verlassen, und bringen Sie sie in ein anderes verfügbares Zimmer.
- Wartung: Führen Sie die erforderlichen Arbeiten durch, zum Beispiel eine Renovierung.
- Uncordon (Wieder öffnen): Entfernen Sie das Schild und erlauben Sie wieder neue Zuweisungen.
Sie arbeiten mit einem lokalen Minikube-Cluster, um diesen Ablauf zu simulieren.
Den Knoten cordonieren
Bevor Sie Wartungsarbeiten durchführen, müssen Sie sicherstellen, dass der Kubernetes-Scheduler keine neuen Pods auf dem Knoten platziert, den Sie bearbeiten möchten. Dieser Vorgang heißt „Cordon“. Er entspricht einem Schild mit der Aufschrift „Bitte nicht stören“ oder „Außer Betrieb“ an der Tür eines Hotelzimmers.
Dabei handelt es sich um eine Planungsentscheidung und nicht um ein Herunterfahren. Ein cordonierter Knoten kann weiterhin fehlerfrei sein und seine vorhandenen Pods weiter ausführen. Kubernetes markiert ihn lediglich als nicht verfügbar für neue Platzierungen. So können Sie die Wartung kontrolliert beginnen.
Ermitteln Sie zunächst den Namen des Knotens. Führen Sie dazu den folgenden Befehl aus:
kubectl get nodes
Sie sollten einen einzelnen Knoten sehen, zum Beispiel minikube, dessen Status Ready lautet.
Markieren Sie den Knoten als nicht planbar, indem Sie den Befehl cordon verwenden. Mithilfe einer Command-Substitution $() wird der Knotenname automatisch ermittelt:
kubectl cordon $(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
Überprüfen Sie anschließend erneut den Status des Knotens:
kubectl get nodes
Der Status sollte nun Ready,SchedulingDisabled lauten. Damit ist bestätigt, dass der Knoten cordoniert wurde. Hier werden keine neuen Pods geplant, während die vorhandenen Pods weiterhin ausgeführt werden.
Den Knoten leeren
Cordon verhindert nur die Platzierung neuer Pods. Die laufenden Anwendungen (also die Gäste) befinden sich weiterhin im Zimmer. Um sie sicher zu entfernen, verwenden Sie den Befehl drain.
Dieser Befehl entfernt die Pods durch Eviction. Kubernetes erkennt anschließend, dass die gewünschte Anzahl von Replikaten (2) nicht erreicht wird, und versucht, neue Ersatz-Pods auf anderen verfügbaren Knoten zu erstellen.
Der Begriff Evict ist hier wichtig. Drain soll keine gewaltsame Beendigung bewirken. Stattdessen werden die Workloads auf eine Kubernetes-konforme Weise zum Verlassen aufgefordert, damit Controller sie ersetzen und Beendigungsregeln eingehalten werden können. Deshalb ist drain sicherer, als beliebige Prozesse auf dem Knoten manuell zu löschen.
Führen Sie den Drain-Befehl aus. In dieser Umgebung müssen Sie einige Optionen angeben, damit die Eviction erzwungen werden kann:
--ignore-daemonsets: Einige System-Pods (DaemonSets) sind fest an den Knoten gebunden und können nicht verschoben werden. Diese Pods werden ignoriert.--delete-emptydir-data: Wenn ein Pod lokalen temporären Speicher verwendet, löscht das Leeren diese Daten. Mit dieser Option bestätigen Sie dieses Verhalten.--force: Erforderlich, um Pods zu löschen, die nicht von einem ReplicationController, ReplicaSet, Job, DaemonSet oder StatefulSet verwaltet werden, beispielsweisestorage-provisionerin Minikube.
kubectl drain $(kubectl get nodes -o jsonpath='{.items[0].metadata.name}') --ignore-daemonsets --delete-emptydir-data --force
In der Ausgabe sehen Sie, dass Pods entfernt werden.
Hinweis: In diesem Minikube-Lab mit nur einem Knoten werden die Pods beim Leeren des einzigen Knotens entfernt und anschließend den Status Pending erhalten. Der Grund ist, dass es „keine anderen Zimmer im Hotel“ gibt, in die sie verschoben werden können. In einem echten Cluster mit mehreren Knoten würden sie sofort auf einen fehlerfreien Knoten verschoben.
Status überprüfen
Nach dem Leeren des Knotens müssen Sie überprüfen, was mit den Anwendungen geschehen ist.
Dieser Prüfschritt vermittelt eine wichtige Gewohnheit bei der Clusterverwaltung: Beenden Sie die Arbeit nicht direkt nach dem Ausführen eines Wartungsbefehls. Überprüfen Sie immer das Ergebnis der Planung aus Sicht des Workloads. Eine Wartungsmaßnahme ist nur dann erfolgreich, wenn die Anwendungen dort ausgeführt werden, wo sie ausgeführt werden sollen.
Überprüfen Sie den Status Ihrer Pods:
kubectl get pods
Wie bereits erwähnt, werden die Pods wahrscheinlich den Status Pending haben.
Um herauszufinden, warum sie den Status Pending haben, fragen Sie Kubernetes. Lassen Sie sich die Beschreibung eines Pods anzeigen:
kubectl describe pod $(kubectl get pods -o jsonpath='{.items[0].metadata.name}')
Suchen Sie am Ende der Ausgabe nach dem Abschnitt Events. Dort sollte eine Meldung ähnlich wie „0/1 nodes are available: 1 node(s) are unschedulable.“ angezeigt werden.
Damit ist bestätigt, dass der Drain-Vorgang erfolgreich war. Der Scheduler möchte den Pod ausführen, respektiert jedoch das Schild „Bitte nicht stören“, das Sie am einzigen verfügbaren Knoten angebracht haben.
Den Knoten uncordonieren
Stellen Sie sich vor, Sie haben die „Renovierung“ – also das Betriebssystem-Upgrade oder die Wartungsarbeiten – abgeschlossen. Nun ist es an der Zeit, das Zimmer wieder zu öffnen und den Knoten erneut in Betrieb zu nehmen.
uncordon entfernt lediglich die Sperre für die Planung. Der Befehl zwingt Pods nicht sofort auf diesen Knoten. Er teilt dem Scheduler mit, dass der Knoten wieder für künftige Platzierungen infrage kommt. Anschließend übernimmt der normale Abgleich.
Verwenden Sie dazu den Befehl uncordon. Dadurch wird das Schild „Bitte nicht stören“ entfernt.
kubectl uncordon $(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
Überprüfen Sie nun den Status des Knotens:
kubectl get nodes
Der Status sollte wieder Ready lauten. Die Kennzeichnung SchedulingDisabled ist dann nicht mehr vorhanden.
Überprüfen Sie abschließend erneut Ihre Pods. Da der Knoten wieder für neue Platzierungen geöffnet ist, sollte der Kubernetes-Scheduler die Pods mit dem Status Pending nun wieder auf diesem Knoten platzieren.
kubectl get pods
Die Pods sollten nacheinander den Status Pending, anschließend ContainerCreating und schließlich Running anzeigen.
Zusammenfassung
In diesem Lab haben Sie den sicheren Ablauf der Wartung eines Kubernetes-Knotens geübt. Sie haben gelernt:
- Einen Knoten zu cordonieren, um ihn als nicht planbar zu markieren (Bitte nicht stören).
- Einen Knoten mit drain zu leeren und laufende Workloads sicher durch Eviction zu entfernen.
- Einen Knoten zu uncordonieren, um ihn wieder in Betrieb zu nehmen.
Diese Befehle sind für Systemadministratoren unerlässlich, um eine hohe Verfügbarkeit sicherzustellen. Sie ermöglichen es, die Infrastruktur zu reparieren, ohne Ausfallzeiten für Ihre Anwendungen zu verursachen – selbstverständlich in einem Cluster mit mehreren Knoten.


