Arbeiten mit Toleranzen
Nachdem wir verstanden haben, wie Taints funktionieren, wollen wir Toleranzen untersuchen – den Mechanismus, der es Pods ermöglicht, auf Nodes mit passenden Taints geplant zu werden.
Toleranzen verstehen
Toleranzen werden in Pod-Spezifikationen angegeben und ermöglichen es, Pods auf Nodes mit passenden Taints zu planen. Eine Toleranz besteht aus:
key: Passt zum Taint-Schlüssel
operator: Entweder Equal (gleicht Schlüssel und Wert ab) oder Exists (gleicht nur den Schlüssel ab)
value: Der abzugleichende Wert (bei Verwendung des Equal-Operators)
effect: Der abzugleichende Effekt, oder leer, um alle Effekte abzugleichen
tolerationSeconds: Optionale Dauer, für die der Pod auf einem Node mit einem passenden NoExecute-Taint verbleiben kann
Erstellen eines Pods mit Toleranzen
Erstellen wir einen Pod, der unseren Control-Plane-Taint toleriert. Erstellen wir zuerst eine YAML-Datei für unseren Pod:
nano ~/project/toleration-pod.yaml
Fügen Sie nun den folgenden Inhalt in die Datei ein:
apiVersion: v1
kind: Pod
metadata:
name: toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
Diese Pod-Spezifikation enthält eine Toleranz, die mit dem Control-Plane-Taint auf unserem Node übereinstimmt. Speichern und beenden Sie die Datei (in nano drücken Sie Ctrl+O, Enter und dann Ctrl+X).
Erstellen wir nun den Pod:
kubectl apply -f ~/project/toleration-pod.yaml
Sie sollten eine Ausgabe wie diese sehen:
pod/toleration-pod created
Überprüfen wir, ob der Pod auf unserem Node geplant wurde:
kubectl get pods -o wide
Beispielausgabe:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
toleration-pod 1/1 Running 0 12s 10.244.0.5 minikube <none> <none>
Der Pod wird auf unserem Minikube-Node ausgeführt, da er eine Toleranz hat, die mit dem Control-Plane-Taint übereinstimmt.
Testen mit einem Pod ohne Toleranzen
Zum Vergleich erstellen wir einen Pod ohne Toleranzen:
nano ~/project/no-toleration-pod.yaml
Fügen Sie den folgenden Inhalt hinzu:
apiVersion: v1
kind: Pod
metadata:
name: no-toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
Speichern und beenden Sie die Datei und erstellen Sie dann den Pod:
kubectl apply -f ~/project/no-toleration-pod.yaml
Überprüfen wir nun den Pod-Status:
kubectl get pods -o wide
Möglicherweise stellen Sie fest, dass der Pod im Status "Pending" verbleibt:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
no-toleration-pod 0/1 Pending 0 12s <none> <none> <none> <none>
toleration-pod 1/1 Running 0 2m 10.244.0.5 minikube <none> <none>
Überprüfen wir, warum der Pod aussteht:
kubectl describe pod no-toleration-pod
Im Abschnitt "Events" sollten Sie so etwas sehen:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 45s default-scheduler 0/1 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
Dies bestätigt, dass der Pod nicht geplant werden konnte, da er den Control-Plane-Taint nicht toleriert.
Bereinigung
Bereinigen wir die Pods, die wir erstellt haben:
kubectl delete pod toleration-pod no-toleration-pod
Sie sollten Folgendes sehen:
pod "toleration-pod" deleted
pod "no-toleration-pod" deleted
Herzlichen Glückwunsch! Sie verstehen jetzt, wie Taints und Toleranzen zusammenarbeiten, um die Pod-Planung in Kubernetes zu steuern.