Kubernetes - nodeSelector & nodeAffinity

Le nodeSelector et nodeAffinity permet de sélectionner le(s) node(s) qui hébergeront les pods.

nodeSelector

nodeSelector est une manière simple de sélectionner le node qui va accueillir le pod. Il suffit d’ajouter cet section à la définition de pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    size: large

Le pod sera déployé sur un node avec le label size: large.

Les limitations de cet attribue ne permettent pas de sélection large ou medium, ou tous sauf small.

nodeAffinity

nodeAffinity est plus flexible.

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: size
            operator: In
            values:
            - large
            - medium
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value
  containers:
  - name: with-node-affinity
    image: registry.k8s.io/pause:2.0

Le pod doit être sur des nodes avec le label size = large ou medium et préfère les nodes avec un label another-node-label-key avec another-node-label-value comme valeur.

L’operator peut être In, NotIn, Exists (no value), DoesNotExist (no value), Gt & Lt.

Si nodeSelector et nodeAffinity sont spécifiés, les 2 contraintes doivent être satifaites.

Node Affinity Type

  1. requiredDuringSchedulingIgnoredDuringExecution
  2. preferredDuringSchedulingIgnoredDuringExecution
  3. requiredDuringSchedulingRequiredDuringExecution
  DuringScheduling DuringExecution
1 Required Ignored
2 Preferred Ignored
3 Required Required