Travailler avec les Tolérances
Maintenant que nous comprenons comment fonctionnent les taints, explorons les tolérances - le mécanisme qui permet aux pods d'être ordonnancés sur des nœuds avec des taints correspondants.
Comprendre les Tolérances
Les tolérances sont spécifiées dans les spécifications des pods et permettent aux pods d'être ordonnancés sur des nœuds avec des taints correspondants. Une tolérance se compose de :
key : Correspond à la clé du taint
operator : Soit Equal (correspond à la clé et à la valeur) soit Exists (correspond uniquement à la clé)
value : La valeur à faire correspondre (lors de l'utilisation de l'opérateur Equal)
effect : L'effet à faire correspondre, ou vide pour correspondre à tous les effets
tolerationSeconds : Durée optionnelle pendant laquelle le pod peut rester sur un nœud avec un taint NoExecute correspondant
Création d'un Pod avec des Tolérances
Créons un pod qui tolère notre taint de plan de contrôle. Tout d'abord, créons un fichier YAML pour notre pod :
nano ~/project/toleration-pod.yaml
Maintenant, ajoutez le contenu suivant au fichier :
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"
Cette spécification de pod inclut une tolérance qui correspond au taint du plan de contrôle sur notre nœud. Enregistrez et quittez le fichier (dans nano, appuyez sur Ctrl+O, Entrée, puis Ctrl+X).
Maintenant, créons le pod :
kubectl apply -f ~/project/toleration-pod.yaml
Vous devriez voir une sortie comme :
pod/toleration-pod created
Vérifions si le pod a été ordonnancé sur notre nœud :
kubectl get pods -o wide
Exemple de sortie :
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>
Le pod est en cours d'exécution sur notre nœud minikube car il a une tolérance correspondant au taint du plan de contrôle.
Test avec un Pod sans Tolérances
À titre de comparaison, créons un pod sans tolérances :
nano ~/project/no-toleration-pod.yaml
Ajoutez le contenu suivant :
apiVersion: v1
kind: Pod
metadata:
name: no-toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
Enregistrez et quittez le fichier, puis créez le pod :
kubectl apply -f ~/project/no-toleration-pod.yaml
Maintenant, vérifions l'état du pod :
kubectl get pods -o wide
Vous remarquerez peut-être que le pod reste à l'état Pending :
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>
Vérifions pourquoi le pod est en attente :
kubectl describe pod no-toleration-pod
Dans la section des événements, vous devriez voir quelque chose comme :
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.
Cela confirme que le pod n'a pas pu être ordonnancé car il ne tolère pas le taint du plan de contrôle.
Nettoyage
Nettoyons les pods que nous avons créés :
kubectl delete pod toleration-pod no-toleration-pod
Vous devriez voir :
pod "toleration-pod" deleted
pod "no-toleration-pod" deleted
Félicitations ! Vous comprenez maintenant comment les taints et les tolérances fonctionnent ensemble pour contrôler l'ordonnancement des pods dans Kubernetes.