NodeSelectors
Dans l’article précédent, nous avons vu comment nous pouvons interdire le scheduling sur certains nœuds grâce aux taints, et comment nous pouvons autoriser certains pods à se scheduler sur les nœuds taintés grâce aux tolerations.
Il y a d’autres moyens dans k8s de jouer avec le scheduling des pods sur les nodes. Si on ne dit rien au scheduler, de base il va prendre tous les nœuds qu’il a sous la main, voir s’il y a suffisamment de ressources dessus, et mettre le pod sur l’un de ces nœuds. Mais dans le cas où on veut qu’un pod aille spécifiquement sur un noeud parce que celui-ci à quelque chose de spécial, par exemple il est doté de disques SSD très performants et nous voulons que l’application portée par le pod en profite, ou alors le noeud a des GPUs, et nous voulons que le pod puisse l’utiliser, comment dire au scheduler de placer le pod sur ces noeuds spéciaux ?
On pourrait mettre une taint SSD ou GPU sur ces nœuds, et mettre une toleration aux pods pour qu’ils puissent se scheduler sur ces nœuds. Mais ça n’empêchera pas aux pods d’aller sur d’autres nœuds que ceux avec la taint.
C’est là où nous avons besoin des nodeSelectors. En mettant un label spécifique sur certains nœuds, on peut dire dans la configuration du pod, grâce aux nodeSelectors, qu’on voudrait sélectionner spécifiquement ces nœuds pour scheduler le pod.
Le nodeSelector dit: “je veux que tu schedules ces pods spécifiquement sur ces noeuds qui ont le label qui va bien.” Alors que les taints et tolerations disent: “je ne veux pas que tu schedules ces pods sur ces noeuds sauf s’ils ont la toleration qui va bien.”
Exemple Dans notre cluster, mettons un label kind=special sur le noeud numéro 1:
kubectl label nodes k8s-node-1 kind=special
Maintenant, déployons un pod avec un nodeSelector qui correspond au label de ce noeud:
pod-selector.yaml:
apiVersion: v1
kind: Pod
metadata:
labels:
run: podsel
name: podsel
spec:
containers:
- image: busybox:latest
name: podsel
args:
- sleep
- "3600"
nodeSelector:
kind: special
Nous avons ainsi dit au scheduler que ce pod devrait être schedulé sur un node qui a le label kind=special.
Déployons ce pod, et nous pourrons voir que le scheduler a bien sélectionné le node numéro 1 pour ce pod:
kubectl apply -f pod-selector.yaml
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
podsel 1/1 Running 0 4s 10.244.1.24 k8s-node-1
Conclusion
Les nodeSelectors permettent de spécifier au scheduler k8s sur quels nœuds nous voulons scheduler des pods. Nous allons voir dans le prochain article que nous pouvons spécifier encore plus de choses au scheduler grâce aux notions d’affinity.