In diesem Kubernetes-Tutorial erfahren Sie, wie Sie einen Knoten mithilfe des Befehls kubectl drain zur Vorbereitung auf die Wartung leeren.
Es ist so einfach wie diesen Befehl einzugeben:
kubectl drain node_name
Sie können die Knotendetails mit kubectl get nodes
abrufen Befehl.
Aber das Draining von Knoten in Kubernetes hat noch mehr zu bieten, also werfen wir einen detaillierten Blick darauf.
Warum müssen Sie Knoten leeren?
Kubernetes ist so konzipiert, dass es gegenüber Ausfällen von Worker-Knoten fehlertolerant ist.
Es kann verschiedene Gründe geben, warum ein Worker-Knoten unbrauchbar wird, z. B. aufgrund eines Hardwareproblems, eines Problems eines Cloud-Anbieters oder wenn es Netzwerkprobleme zwischen Worker und Master-Knoten gibt, behandelt der Kubernetes-Master dies effektiv.
Aber das bedeutet nicht, dass es immer so sein wird. Und das ist der Zeitpunkt, an dem Sie die Knoten entleeren und alle Hülsen entfernen müssen.
Das Draining ist der Prozess zum sicheren Entfernen aller Pods von einem Knoten. Auf diese Weise werden die auf dem Pod ausgeführten Container ordnungsgemäß beendet.
Wie man Knoten in Kubernetes richtig leert
Beginnen wir mit der praktischen Demonstration.
Schritt 1:Markiere den Knoten als nicht planbar (cordon)
Um Wartungsarbeiten an einem Knoten durchzuführen, sollten Sie den Zeitplan für einen Knoten aufheben und ihn dann entleeren.
Werfen Sie zunächst einen Blick auf die aktuell laufenden Knoten:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready <none> 44d v1.18.8
[email protected]:~#
Sehen Sie sich die Pods an, die auf verschiedenen Knoten ausgeführt werden:
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-d2pmd 1/1 Running 1 4d15h 172.16.213.57 kworker-rj2 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
Markieren Sie nun den Knoten als nicht planbar, indem Sie den folgenden Befehl ausführen:
[email protected]:~# kubectl cordon kworker-rj2
node/kworker-rj2 cordoned
[email protected]:~#
Listen Sie die Knoten erneut auf:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready,SchedulingDisabled <none> 44d v1.18.8
[email protected]:~#
Sie können feststellen, dass der Knoten kworker-rj2 jetzt als SchedulingDisabled gekennzeichnet ist.
Bis zu diesem Schritt werden die Pods, die auf diesem Knoten ausgeführt werden, nicht entfernt. Überprüfen Sie den Pod-Status:
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-d2pmd 1/1 Running 1 4d15h 172.16.213.57 kworker-rj2 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
Sie können sehen, dass der Pod „my-dep-557548758d-d2pmd“ immer noch auf dem kworker-rj2-Knoten läuft.
Schritt 2:Entleeren Sie den Knoten, um die Wartung vorzubereiten
Leeren Sie nun den Knoten in Vorbereitung auf die Wartung, um Pods zu entfernen, die auf dem Knoten ausgeführt werden, indem Sie den folgenden Befehl ausführen:
[email protected]:~# kubectl drain kworker-rj2 --grace-period=300 --ignore-daemonsets=true
node/kworker-rj2 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-fl8dl, kube-system/kube-proxy-95vdf
evicting pod default/my-dep-557548758d-d2pmd
pod/my-dep-557548758d-d2pmd evicted
node/kworker-rj2 evicted
[email protected]:~#
HINWEIS: kubectl drain kann keine Pods löschen, die nicht von ReplicationController, ReplicaSet, Job, DaemonSet oder StatefulSet verwaltet werden. Sie müssen --force verwenden, um dies zu überschreiben, und dadurch werden die einzelnen Pods dauerhaft gelöscht.
Sehen Sie sich nun die Pods an:
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-dsanh 1/1 Running 0 27s 172.16.213.38 kworker-rj1 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
Der Pod, der auf dem Knoten kworker-rj2 lief, wurde von dort entfernt und als neuer Pod auf dem Knoten kworker-rj1 gestartet.
Knotenstatus bleibt gleich:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready,SchedulingDisabled <none> 44d v1.18.8
[email protected]:~#
Schritt 3:Entkoppeln Sie den Knoten nach Abschluss der Wartung
Sie müssen anschließend den folgenden Befehl ausführen, um Kubernetes mitzuteilen, dass es die Planung neuer Pods auf dem Knoten fortsetzen kann.
[email protected]:~# kubectl uncordon kworker-rj2
node/kworker-rj2 uncordoned
Überprüfen Sie den Knotenstatus:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready <none> 44d v1.18.8
Der Knoten kworker-rj2 wird wieder bereit, neue Workloads zu bewältigen.
Ich hoffe, Ihnen gefällt dieser kurze Tipp zum Leeren von Knoten in Kubernetes.
Rakesh Jain
DevOps-Profi | RCA | Jenkins | Git | Docker | Kubernetes | Ansible | Prometheus | Grafana | AWS-Cloud