4.3. Contrôle du placement de la gousse sur les nœuds en utilisant les règles d’affinité des nœuds


Affinité est une propriété de pods qui contrôle les nœuds sur lesquels ils préfèrent être programmés.

Dans Red Hat OpenShift Service sur AWS Node affinity est un ensemble de règles utilisées par le programmeur pour déterminer où un pod peut être placé. Les règles sont définies à l’aide d’étiquettes personnalisées sur les nœuds et les sélecteurs d’étiquettes spécifiés dans les pods.

4.3.1. Comprendre l’affinité des nœuds

L’affinité des nœuds permet à un pod de spécifier une affinité vers un groupe de nœuds sur lequel il peut être placé. Le nœud n’a pas de contrôle sur le placement.

À titre d’exemple, vous pouvez configurer un pod pour fonctionner uniquement sur un nœud avec un CPU spécifique ou dans une zone de disponibilité spécifique.

Il existe deux types de règles d’affinité des nœuds : requises et préférées.

Les règles requises doivent être respectées avant qu’un pod puisse être programmé sur un nœud. Les règles préférées précisent que, si la règle est respectée, le programmeur tente d’appliquer les règles, mais ne garantit pas l’exécution.

Note

Lorsque les étiquettes sur un nœud changent au moment de l’exécution, ce qui entraîne une règle d’affinité des nœuds sur une gousse n’est plus respectée, la gousse continue de fonctionner sur le nœud.

Configurez l’affinité des nœuds via le fichier Pod spec. Il est possible de spécifier une règle requise, une règle préférée ou les deux. Lorsque vous spécifiez les deux, le nœud doit d’abord respecter la règle requise, puis tente de respecter la règle préférée.

L’exemple suivant est un Pod spec avec une règle qui exige que le pod soit placé sur un nœud avec une étiquette dont la clé est e2e-az-NorthSouth et dont la valeur est e2e-az-North ou e2e-az-South:

Exemple de fichier de configuration de pod avec une règle d’affinité de nœud requise

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault
  affinity:
    nodeAffinity: 
1

      requiredDuringSchedulingIgnoredDuringExecution: 
2

        nodeSelectorTerms:
        - matchExpressions:
          - key: e2e-az-NorthSouth 
3

            operator: In 
4

            values:
            - e2e-az-North 
5

            - e2e-az-South 
6

  containers:
  - name: with-node-affinity
    image: docker.io/ocpqe/hello-pod
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop: [ALL]
# ...
Copy to Clipboard Toggle word wrap

1
La strophe pour configurer l’affinité des nœuds.
2
Définit une règle requise.
3 5 6
La paire clé/valeur (étiquette) qui doit être assortie pour appliquer la règle.
4
L’opérateur représente la relation entre l’étiquette sur le nœud et l’ensemble de valeurs dans les paramètres de correspondanceExpression dans la spécification Pod. Cette valeur peut être In, NotIn, Exist ou NeesNotExist, Lt, ou Gt.

L’exemple suivant est une spécification de nœud avec une règle préférée selon laquelle un nœud avec une étiquette dont la clé est e2e-az-East et dont la valeur est e2e-az-East ou e2e-az-West est préféré pour le pod:

Exemple de fichier de configuration de pod avec une règle d’affinité préférée des nœuds

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault
  affinity:
    nodeAffinity: 
1

      preferredDuringSchedulingIgnoredDuringExecution: 
2

      - weight: 1 
3

        preference:
          matchExpressions:
          - key: e2e-az-EastWest 
4

            operator: In 
5

            values:
            - e2e-az-East 
6

            - e2e-az-West 
7

  containers:
  - name: with-node-affinity
    image: docker.io/ocpqe/hello-pod
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop: [ALL]
# ...
Copy to Clipboard Toggle word wrap

1
La strophe pour configurer l’affinité des nœuds.
2
Définit une règle préférée.
3
Indique un poids pour une règle préférée. Le nœud avec le poids le plus élevé est préféré.
4 6 7
La paire clé/valeur (étiquette) qui doit être assortie pour appliquer la règle.
5
L’opérateur représente la relation entre l’étiquette sur le nœud et l’ensemble de valeurs dans les paramètres de correspondanceExpression dans la spécification Pod. Cette valeur peut être In, NotIn, Exist ou NeesNotExist, Lt, ou Gt.

Il n’y a pas de concept explicite d’anti-affinité de nœud, mais l’utilisation de l’opérateur NotIn ou DoesNotExist reproduit ce comportement.

Note

Lorsque vous utilisez des sélecteurs d’affinité des nœuds et de nœuds dans la même configuration, notez ce qui suit:

  • Lorsque vous configurez à la fois nodeSelector et nodeAffinity, les deux conditions doivent être remplies pour que la gousse soit programmée sur un nœud candidat.
  • Lorsque vous spécifiez plusieurs nodeSelectorTerms associés aux types nodeAffinity, le pod peut être programmé sur un nœud si l’un des nodeSelectorTerms est satisfait.
  • Lorsque vous spécifiez plusieurs correspondancesExpressions associées à nodeSelectorTerms, le pod ne peut être programmé sur un nœud que si toutes les correspondancesExpressions sont satisfaites.

Les règles requises doivent être respectées avant qu’un pod puisse être programmé sur un nœud.

Procédure

Les étapes suivantes démontrent une configuration simple qui crée un nœud et un pod que le programmeur est tenu de placer sur le nœud.

  1. Créer un pod avec une étiquette spécifique dans le pod spec:

    1. Créez un fichier YAML avec le contenu suivant:

      Note

      Il est impossible d’ajouter une affinité directement à un pod programmé.

      Exemple de sortie

      apiVersion: v1
      kind: Pod
      metadata:
        name: s1
      spec:
        affinity: 
      1
      
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution: 
      2
      
              nodeSelectorTerms:
              - matchExpressions:
                - key: e2e-az-name 
      3
      
                  values:
                  - e2e-az1
                  - e2e-az2
                  operator: In 
      4
      
      #...
      Copy to Clipboard Toggle word wrap

      1
      Ajoute une affinité de gousse.
      2
      Configure le paramètre requisDuringSchedulingIgnoredDuringExecution.
      3
      Indique la clé et les valeurs qui doivent être remplies. Lorsque vous souhaitez que le nouveau pod soit programmé sur le nœud que vous avez modifié, utilisez les mêmes paramètres de clé et de valeurs que l’étiquette dans le nœud.
      4
      Indique un opérateur. L’opérateur peut être dans, NotIn, existant ou ne pas exister. À titre d’exemple, utilisez l’opérateur In pour exiger que l’étiquette soit dans le nœud.
    2. Créer le pod:

      $ oc create -f <file-name>.yaml
      Copy to Clipboard Toggle word wrap

Les règles préférées précisent que, si la règle est respectée, le programmeur tente d’appliquer les règles, mais ne garantit pas l’exécution.

Procédure

Les étapes suivantes démontrent une configuration simple qui crée un nœud et un pod que le planificateur essaie de placer sur le nœud.

  1. Créer un pod avec une étiquette spécifique:

    1. Créez un fichier YAML avec le contenu suivant:

      Note

      Il est impossible d’ajouter une affinité directement à un pod programmé.

      apiVersion: v1
      kind: Pod
      metadata:
        name: s1
      spec:
        affinity: 
      1
      
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution: 
      2
      
            - weight: 
      3
      
              preference:
                matchExpressions:
                - key: e2e-az-name 
      4
      
                  values:
                  - e2e-az3
                  operator: In 
      5
      
      #...
      Copy to Clipboard Toggle word wrap
      1
      Ajoute une affinité de gousse.
      2
      Configure le paramètre préféréDuringSchedulingIgnoredDuringExecution.
      3
      Indique un poids pour le nœud, en tant que numéro 1-100. Le nœud avec le poids le plus élevé est préféré.
      4
      Indique la clé et les valeurs qui doivent être remplies. Lorsque vous souhaitez que le nouveau pod soit programmé sur le nœud que vous avez modifié, utilisez les mêmes paramètres de clé et de valeurs que l’étiquette dans le nœud.
      5
      Indique un opérateur. L’opérateur peut être dans, NotIn, existant ou ne pas exister. À titre d’exemple, utilisez l’opérateur In pour exiger que l’étiquette soit dans le nœud.
    2. Créez le pod.

      $ oc create -f <file-name>.yaml
      Copy to Clipboard Toggle word wrap

4.3.4. Exemple de règles d’affinité des nœuds

Les exemples suivants démontrent l’affinité des nœuds.

L’exemple suivant démontre l’affinité des nœuds pour un nœud et un pod avec des étiquettes assorties:

  • Le nœud Node1 a la zone d’étiquette:us:

    $ oc label node node1 zone=us
    Copy to Clipboard Toggle word wrap
    Astuce

    Alternativement, vous pouvez appliquer le YAML suivant pour ajouter l’étiquette:

    kind: Node
    apiVersion: v1
    metadata:
      name: <node_name>
      labels:
        zone: us
    #...
    Copy to Clipboard Toggle word wrap
  • Le pod-s1 pod a la zone et nous avons la paire clé/valeur en vertu d’une règle d’affinité de nœud requise:

    $ cat pod-s1.yaml
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
        - image: "docker.io/ocpqe/hello-pod"
          name: hello-pod
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: "zone"
                  operator: In
                  values:
                  - us
    #...
    Copy to Clipboard Toggle word wrap

  • Le pod-s1 peut être programmé sur Node1:

    $ oc get pod -o wide
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    NAME     READY     STATUS       RESTARTS   AGE      IP      NODE
    pod-s1   1/1       Running      0          4m       IP1     node1
    Copy to Clipboard Toggle word wrap

4.3.4.2. Affinité des nœuds sans étiquettes correspondantes

L’exemple suivant démontre l’affinité des nœuds pour un nœud et un pod sans étiquettes correspondantes:

  • Le nœud Node1 a la zone d’étiquette:emea:

    $ oc label node node1 zone=emea
    Copy to Clipboard Toggle word wrap
    Astuce

    Alternativement, vous pouvez appliquer le YAML suivant pour ajouter l’étiquette:

    kind: Node
    apiVersion: v1
    metadata:
      name: <node_name>
      labels:
        zone: emea
    #...
    Copy to Clipboard Toggle word wrap
  • Le pod-s1 pod a la zone et nous avons la paire clé/valeur en vertu d’une règle d’affinité de nœud requise:

    $ cat pod-s1.yaml
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
        - image: "docker.io/ocpqe/hello-pod"
          name: hello-pod
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: "zone"
                  operator: In
                  values:
                  - us
    #...
    Copy to Clipboard Toggle word wrap

  • Le pod-s1 ne peut pas être programmé sur Node1:

    $ oc describe pod pod-s1
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    ...
    
    Events:
     FirstSeen LastSeen Count From              SubObjectPath  Type                Reason
     --------- -------- ----- ----              -------------  --------            ------
     1m        33s      8     default-scheduler Warning        FailedScheduling    No nodes are available that match all of the following predicates:: MatchNodeSelector (1).
    Copy to Clipboard Toggle word wrap

Retour au début
Red Hat logoGithubredditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance. Découvrez nos récentes mises à jour.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez le Blog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

Theme

© 2025 Red Hat