Publié le : 03/06/2023 à 03:40

Présentation des stratégies de placement dans Kubernetes pour optimiser la gestion des charges de travail avec des exemples de code.

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.

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

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.

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"

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.

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

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.

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"

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é.

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.

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

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é.

Lien copié dans le presse-papiers !