Préparation à la CKA - 15 - Node Selectors

Publié le 26/11/2024 par Ali Sanhaji

NodeSelectors

Kubernetes propose plusieurs mécanismes pour contrôler le placement des Pods sur les nœuds du cluster.
Par défaut, si aucune contrainte n’est définie, le scheduler sélectionne un nœud disposant des ressources suffisantes (CPU, mémoire, etc.) et y planifie le Pod de manière automatique.

Cependant, certains nœuds peuvent disposer de caractéristiques particulières : disques SSD haute performance, GPU, matériel spécialisé, ou configuration spécifique. Dans ce type de scénario, il peut être nécessaire de contraindre explicitement le placement d’un Pod sur ces nœuds spécifiques.

Les taints et tolerations permettent de restreindre l’accès à certains nœuds, mais elles ne garantissent pas qu’un Pod sera planifié uniquement sur les nœuds souhaités. Pour cibler précisément des nœuds possédant des propriétés particulières, Kubernetes propose un mécanisme simple : le nodeSelector.

Le nodeSelector permet d’indiquer au scheduler que le Pod doit être planifié uniquement sur les nœuds possédant un ou plusieurs labels spécifiques.

Le nodeSelector fonctionne uniquement avec des correspondances exactes clé=valeur. Il ne permet pas d’exprimer des conditions plus complexes (par exemple “différent de” ou “dans une liste”).

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.

Si aucun nœud ne correspond au nodeSelector, le Pod restera en état Pending.

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 contraindre explicitement le scheduler à placer un Pod sur des nœuds possédant des labels spécifiques.
Ils constituent un mécanisme simple et direct de contrôle du placement des workloads.

Pour des règles de placement plus avancées et plus flexibles, Kubernetes propose également des mécanismes d’affinité, qui permettent d’exprimer des contraintes plus complexes.