Affinité et Anti-Affinité de Nœuds


Configurer l'affinité et l'anti-affinité de nœuds pour diriger le placement des Pods sur des nœuds spécifiques.

  1. Affinité de Nœud (Node Affinity)

    L'affinité de nœud permet de préférer que certains Pods s'exécutent sur des nœuds possédant des labels spécifiques. Par exemple, on peut configurer une affinité pour que les Pods s'exécutent uniquement sur des nœuds ayant un disque SSD.

    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: disktype
                  operator: In
                  values:
                    - ssd
    



  2. Anti-Affinité de Nœud (Node Anti-Affinity)

    Avec l'anti-affinité de nœud, il est possible d'empêcher certains Pods d'être placés sur des nœuds ayant des labels spécifiques. Cela est utile pour éviter des conflits ou répartir des Pods sur différents nœuds.

    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: zone
                  operator: NotIn
                  values:
                    - us-central1
    

Affinité et Anti-Affinité de Pods


Utilisation de l'affinité et de l'anti-affinité pour positionner ou éloigner les Pods les uns des autres.

  1. Affinité de Pod (Pod Affinity)

    L'affinité de Pod permet de placer des Pods proches d'autres Pods spécifiques en utilisant des labels. Cela est souvent utile pour des raisons de performance.

    affinity:
      podAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                app: frontend
            topologyKey: "kubernetes.io/hostname"
    



  2. Anti-Affinité de Pod (Pod Anti-Affinity)

    L'anti-affinité de Pod permet d'éviter que des Pods spécifiques soient placés sur le même nœud que d'autres Pods définis par des labels, améliorant ainsi la résilience de l'application.

    affinity:
      podAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                app: backend
            topologyKey: "kubernetes.io/hostname"
    

Taints et Tolerations


Application de taches et de tolérances pour réserver des nœuds à certaines charges de travail.

  1. Taint (Tache)

    Les taints appliquent des restrictions sur des nœuds, empêchant par défaut les Pods de s'y exécuter sauf s'ils ont une tolérance compatible. Cela est utile pour isoler des ressources pour des tâches spécifiques.

    kubectl taint nodes node1 key=value:NoSchedule
    



  2. Toleration (Tolérance)

    Les tolérances permettent aux Pods de tolérer les taints appliqués aux nœuds, permettant ainsi de placer des Pods sur des nœuds qui leur sont habituellement restreints.

    tolerations:
      - key: "key"
        operator: "Equal"
        value: "value"
        effect: "NoSchedule"
    

Requêtes et Limites de Ressources


Définition des limites et des requêtes de ressources pour un contrôle optimisé de l'allocation des ressources.

  1. Requêtes de Ressources

    Les requêtes définissent les ressources minimales requises par un Pod, garantissant qu'il sera programmé uniquement sur des nœuds ayant ces ressources disponibles.

    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
    



  2. Limites de Ressources

    Les limites fixent le maximum de ressources qu'un Pod peut consommer, évitant qu'il monopolise les ressources d'un nœud.

    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    

Contraintes de Répartition Topologique


Définir les contraintes de répartition topologique pour assurer une haute disponibilité.

  1. Exemple de Répartition

    Les contraintes de répartition topologique permettent de contrôler la répartition des Pods à travers différents domaines, comme les zones de disponibilité, pour éviter les points de défaillance uniques.

    topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: "topology.kubernetes.io/zone"
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: my-app
    



Priorité et Préemption


Définition des niveaux de priorité pour s'assurer que les Pods critiques obtiennent les ressources nécessaires.

  1. Configuration de la Priorité

    La priorité permet d'attribuer des niveaux d'importance aux Pods, garantissant que les Pods à haute priorité soient programmés en premier.

    priorityClassName: high-priority
    



  2. Préemption

    La préemption permet à un Pod prioritaire d'évincer un Pod de moindre priorité lorsque les ressources sont limitées, assurant que les charges critiques soient exécutées en priorité.


Date de publication: 2023-06-03T09:40:00+08:00
Date de modification: 2024-10-27T15:06:30
Auteur:
  • Martin LEKPA : Tech Lead et formateur Observabilité