Kubernetes - Taints & Tolerations

Cela permet de définir des restrictions sur les pods pouvant être planifiés sur des nodes. Utilisé pour des nodes avec des caractéristiques spécifiques.
La taint sur un node “indique” au pod que s’il ne tolère pas la taint, il n’est pas schédulé sur ce node.
Exemple, on taint un node avec “odeur=transpiration”, le pod doit tolérer (toleration) l’odeur de transpiration.

Taint

Ce sont les nodes que l’on taint. Taint d’un node:

kubectl taint nodes <node-name> <key>=<value>:<taint-effect>

Exemple:

kubectl taint nodes node1 app=blue:NoSchedule

Les différents taint-effect:

  • NoSchedule: le pod ne sera pas programmé sur le node marqué par une taint si ce pod n’a pas la toleration associée. Les pods existant sur le node seront éjectés (sauf toleration adéquat).
  • PreferNoSchedule: le système essaiera d’éviter de placer le pod sur le node marqué par une taint qui ne correspond pas à la toleration, mais ne le garanti pas.
  • NoExecute: si le pod est déjà en cours d’exécution sur le node marqué par une taint et qu’il n’a pas la bonne toleration, il est alors expulsé. Doc officielle - taint & toleration.

Une best practice est de ne pas déployer de pod sur un node control plan.

kubectl describe node kube-control-plan | grep -i taint
Taints:             node-role.kubernetes.io/control-plane:NoSchedule

Enlever une taint (le - à la fin de la taint):

k taint node controlplane node-role.kubernetes.io/control-plane:NoSchedule-

Tolerance

La tolerance ne s’applique que sur les pods.

Positionner une tolération sur un pod:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
  tolerations:
  - key: "app"
    operator: "Equal"
    value: "blue"
    effect: "NoSchedule"

L’option tolerationSeconds dans la toleration avec un effet à NoExecute permet de laisser le pod sur le node pendant X secondes avant d’être évincé.

Labels/Annotations/Taints connus et utilisés par Kubernetes.