3.4. Contrôle du placement des pods sur les nœuds à l'aide de règles d'affinité des nœuds
L'affinité est une propriété des pods qui contrôle les nœuds sur lesquels ils préfèrent être programmés.
Dans OpenShift Container Platform, l'affinité des nœuds est un ensemble de règles utilisées par le planificateur 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 de sélecteurs d'étiquettes spécifiés dans les pods.
3.4.1. Comprendre l'affinité des nœuds Copier lienLien copié sur presse-papiers!
L'affinité de nœud permet à un pod de spécifier une affinité envers un groupe de nœuds sur lesquels il peut être placé. Le nœud n'a pas de contrôle sur le placement.
Par exemple, vous pouvez configurer un module pour qu'il ne s'exécute que sur un nœud doté d'une unité centrale spécifique ou dans une zone de disponibilité spécifique.
Il existe deux types de règles d'affinité entre les nœuds : required et preferred.
Les règles obligatoires must doivent être respectées pour qu'un pod puisse être programmé sur un nœud. Les règles préférentielles précisent que, si la règle est respectée, l'ordonnanceur tente de l'appliquer, mais ne la garantit pas.
Si les étiquettes d'un nœud changent au moment de l'exécution et que la règle d'affinité d'un nœud pour un module n'est plus respectée, le module continue de fonctionner sur le nœud.
Vous configurez l'affinité des nœuds par le biais du fichier Pod spec. Vous pouvez spécifier une règle obligatoire, une règle préférentielle ou les deux. Si vous spécifiez les deux, le nœud doit d'abord satisfaire à la règle requise, puis tente de satisfaire à la règle préférée.
L'exemple suivant est une spécification Pod 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 soit e2e-az-North soit e2e-az-South:
Exemple de fichier de configuration d'un pod avec une règle d'affinité de nœud requise
- 1
- La strophe pour configurer l'affinité des nœuds.
- 2
- Définit une règle obligatoire.
- 3 5 6
- La paire clé/valeur (étiquette) qui doit être prise en compte pour appliquer la règle.
- 4
- L'opérateur représente la relation entre l'étiquette du nœud et l'ensemble des valeurs des paramètres
matchExpressiondans la spécificationPod. Cette valeur peut êtreIn,NotIn,Exists, ouDoesNotExist,Lt, ouGt.
L'exemple suivant est une spécification de nœud avec une règle de préférence selon laquelle un nœud avec une étiquette dont la clé est e2e-az-EastWest et dont la valeur est soit e2e-az-East soit e2e-az-West est préféré pour le pod :
Exemple de fichier de configuration d'un pod avec une règle préférentielle d'affinité de nœud
- 1
- La strophe pour configurer l'affinité des nœuds.
- 2
- Définit une règle préférentielle.
- 3
- Spécifie un poids pour une règle préférentielle. Le nœud ayant le poids le plus élevé est privilégié.
- 4 6 7
- La paire clé/valeur (étiquette) qui doit être prise en compte pour appliquer la règle.
- 5
- L'opérateur représente la relation entre l'étiquette du nœud et l'ensemble des valeurs des paramètres
matchExpressiondans la spécificationPod. Cette valeur peut êtreIn,NotIn,Exists, ouDoesNotExist,Lt, ouGt.
Il n'existe pas de concept explicite node anti-affinity, mais l'utilisation de l'opérateur NotIn ou DoesNotExist reproduit ce comportement.
Si vous utilisez l'affinité de nœuds et les sélecteurs de nœuds dans la même configuration de pods, notez ce qui suit :
-
Si vous configurez à la fois
nodeSelectoretnodeAffinity, les deux conditions doivent être remplies pour que le pod soit planifié sur un nœud candidat. -
Si vous spécifiez plusieurs
nodeSelectorTermsassociés à des typesnodeAffinity, le module peut être programmé sur un nœud si l'un desnodeSelectorTermsest satisfait. -
Si vous spécifiez plusieurs
matchExpressionsassociés ànodeSelectorTerms, le module ne peut être programmé sur un nœud que si tous lesmatchExpressionssont satisfaits.
3.4.2. Configuration d'une règle d'affinité de nœud requise Copier lienLien copié sur presse-papiers!
Les règles requises must doivent être respectées avant qu'un pod puisse être programmé sur un nœud.
Procédure
Les étapes suivantes présentent une configuration simple qui crée un nœud et un module que l'ordonnanceur doit placer sur le nœud.
Ajoutez une étiquette à un nœud à l'aide de la commande
oc label node:oc label node node1 e2e-az-name=e2e-az1
$ oc label node node1 e2e-az-name=e2e-az1Copy to Clipboard Copied! Toggle word wrap Toggle overflow AstuceVous pouvez également appliquer le code YAML suivant pour ajouter l'étiquette :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Dans la spécification
Pod, utilisez la strophenodeAffinitypour configurer le paramètrerequiredDuringSchedulingIgnoredDuringExecution:-
Spécifiez la clé et les valeurs qui doivent être respectées. Si vous souhaitez que le nouveau module soit planifié sur le nœud que vous avez modifié, utilisez les mêmes paramètres
keyetvalueque l'étiquette du nœud. operatorL'opérateur peut êtreIn,NotIn,Exists,DoesNotExist,LtouGt. Par exemple, utilisez l'opérateurInpour exiger que l'étiquette soit dans le nœud :Exemple de sortie
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
Spécifiez la clé et les valeurs qui doivent être respectées. Si vous souhaitez que le nouveau module soit planifié sur le nœud que vous avez modifié, utilisez les mêmes paramètres
Créer la capsule :
oc create -f e2e-az2.yaml
$ oc create -f e2e-az2.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4.3. Configuration d'une règle d'affinité pour les nœuds préférés Copier lienLien copié sur presse-papiers!
Les règles préférentielles précisent que, si la règle est respectée, l'ordonnanceur tente d'appliquer les règles, mais n'en garantit pas l'application.
Procédure
Les étapes suivantes présentent une configuration simple qui crée un nœud et un module que l'ordonnanceur tente de placer sur le nœud.
Ajoutez une étiquette à un nœud à l'aide de la commande
oc label node:oc label node node1 e2e-az-name=e2e-az3
$ oc label node node1 e2e-az-name=e2e-az3Copy to Clipboard Copied! Toggle word wrap Toggle overflow Dans la spécification
Pod, utilisez la strophenodeAffinitypour configurer le paramètrepreferredDuringSchedulingIgnoredDuringExecution:- Spécifiez un poids pour le nœud, sous la forme d'un nombre de 1 à 100. Le nœud ayant le poids le plus élevé est privilégié.
Spécifiez la clé et les valeurs qui doivent être respectées. Si vous souhaitez que le nouveau module soit planifié sur le nœud que vous avez modifié, utilisez les mêmes paramètres
keyetvalueque l'étiquette du nœud :Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
operatorL'opérateur peut êtreIn,NotIn,Exists,DoesNotExist,LtouGt. Par exemple, utilisez l'opérateurInpour exiger que l'étiquette soit dans le nœud.
Créer la capsule.
oc create -f e2e-az3.yaml
$ oc create -f e2e-az3.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4.4. Exemple de règles d'affinité entre les nœuds Copier lienLien copié sur presse-papiers!
Les exemples suivants illustrent l'affinité entre les nœuds.
3.4.4.1. Affinité des nœuds avec les étiquettes correspondantes Copier lienLien copié sur presse-papiers!
L'exemple suivant illustre l'affinité d'un nœud et d'un module avec des étiquettes correspondantes :
Le nœud Node1 porte l'étiquette
zone:us:oc label node node1 zone=us
$ oc label node node1 zone=usCopy to Clipboard Copied! Toggle word wrap Toggle overflow AstuceVous pouvez également appliquer le code YAML suivant pour ajouter l'étiquette :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le pod-s1 possède la paire clé/valeur
zoneetusen vertu d'une règle d'affinité de nœud requise :cat pod-s1.yaml
$ cat pod-s1.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le pod-s1 peut être programmé sur le nœud 1 :
oc get pod -o wide
$ oc get pod -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME READY STATUS RESTARTS AGE IP NODE pod-s1 1/1 Running 0 4m IP1 node1
NAME READY STATUS RESTARTS AGE IP NODE pod-s1 1/1 Running 0 4m IP1 node1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4.4.2. Affinité des nœuds sans étiquettes correspondantes Copier lienLien copié sur presse-papiers!
L'exemple suivant illustre l'affinité de nœud pour un nœud et un module sans étiquettes correspondantes :
Le nœud Node1 porte l'étiquette
zone:emea:oc label node node1 zone=emea
$ oc label node node1 zone=emeaCopy to Clipboard Copied! Toggle word wrap Toggle overflow AstuceVous pouvez également appliquer le code YAML suivant pour ajouter l'étiquette :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le pod-s1 possède la paire clé/valeur
zoneetusen vertu d'une règle d'affinité de nœud requise :cat pod-s1.yaml
$ cat pod-s1.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le pod-s1 ne peut pas être planifié sur le nœud 1 :
oc describe pod pod-s1
$ oc describe pod pod-s1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4.5. Utilisation de l'affinité des nœuds pour contrôler l'emplacement d'installation d'un opérateur Copier lienLien copié sur presse-papiers!
Par défaut, lorsque vous installez un Operator, OpenShift Container Platform installe le pod Operator sur l'un de vos nœuds de travail de manière aléatoire. Cependant, il peut y avoir des situations où vous voulez que ce pod soit planifié sur un nœud spécifique ou un ensemble de nœuds.
Les exemples suivants décrivent des situations dans lesquelles vous pourriez vouloir planifier un pod opérateur sur un nœud ou un ensemble de nœuds spécifique :
-
Si un opérateur a besoin d'une plateforme particulière, telle que
amd64ouarm64 - Si un opérateur nécessite un système d'exploitation particulier, tel que Linux ou Windows
- Si vous souhaitez que les opérateurs qui travaillent ensemble soient programmés sur le même hôte ou sur des hôtes situés sur le même rack
- Si vous souhaitez que les opérateurs soient dispersés dans l'infrastructure afin d'éviter les temps d'arrêt dus à des problèmes de réseau ou de matériel
Vous pouvez contrôler l'endroit où un pod d'opérateur est installé en ajoutant des contraintes d'affinité de nœud à l'objet Subscription de l'opérateur.
Les exemples suivants montrent comment utiliser l'affinité entre les nœuds pour installer une instance de Custom Metrics Autoscaler Operator sur un nœud spécifique de la grappe :
Exemple d'affinité de nœud qui place le pod de l'opérateur sur un nœud spécifique
- 1
- Une affinité de nœud qui exige que le pod de l'opérateur soit programmé sur un nœud nommé
ip-10-0-163-94.us-west-2.compute.internal.
Exemple d'affinité de nœud qui place le pod de l'opérateur sur un nœud avec une plate-forme spécifique
- 1
- Une affinité de nœud qui exige que le pod de l'opérateur soit programmé sur un nœud avec les étiquettes
kubernetes.io/arch=arm64etkubernetes.io/os=linux.
Procédure
Pour contrôler l'emplacement d'une nacelle d'opérateur, procédez comme suit :
- Installez l'opérateur comme d'habitude.
- Si nécessaire, assurez-vous que vos nœuds sont étiquetés de manière à répondre correctement à l'affinité.
Modifiez l'objet Operator
Subscriptionpour ajouter une affinité :Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Ajouter un
nodeAffinity.
Vérification
Pour s'assurer que le pod est déployé sur le nœud spécifique, exécutez la commande suivante :
oc get pods -o wide
$ oc get pods -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES custom-metrics-autoscaler-operator-5dcc45d656-bhshg 1/1 Running 0 50s 10.131.0.20 ip-10-0-185-229.ec2.internal <none> <none>
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES custom-metrics-autoscaler-operator-5dcc45d656-bhshg 1/1 Running 0 50s 10.131.0.20 ip-10-0-185-229.ec2.internal <none> <none>Copy to Clipboard Copied! Toggle word wrap Toggle overflow