4.2. Placer des gousses par rapport à d’autres gousses en utilisant des règles d’affinité et d’anti-affinité
Affinité est une propriété de pods qui contrôle les nœuds sur lesquels ils préfèrent être programmés. L’anti-affinité est une propriété de gousses qui empêche une gousse d’être programmée sur un nœud.
Dans Red Hat OpenShift Service sur AWS, l’affinité de pod et la pod anti-affinité vous permettent de limiter les nœuds que votre pod est éligible pour être programmé sur la base des étiquettes de valeur clé sur d’autres gousses.
4.2.1. Comprendre l’affinité des gousses Copier lienLien copié sur presse-papiers!
L’affinité des pod et la pod anti-affinité vous permettent de limiter les nœuds sur lesquels votre pod est admissible à être programmé sur la base des étiquettes clé / valeur sur d’autres gousses.
- L’affinité des gousses peut indiquer au planificateur de localiser une nouvelle gousse sur le même nœud que les autres gousses si le sélecteur d’étiquettes sur la nouvelle gousse correspond à l’étiquette sur la gousse actuelle.
- La pod anti-affinité peut empêcher le planificateur de localiser une nouvelle gousse sur le même nœud que les gousses avec les mêmes étiquettes si le sélecteur d’étiquettes sur la nouvelle gousse correspond à l’étiquette sur la gousse actuelle.
À titre d’exemple, en utilisant des règles d’affinité, vous pouvez diffuser ou emballer des pods au sein d’un service ou par rapport à des pods dans d’autres services. Les règles anti-affinité vous permettent d’empêcher les pods d’un service particulier de planifier sur les mêmes nœuds que les pods d’un autre service qui sont connus pour interférer avec l’exécution des pods du premier service. De plus, vous pouvez répartir les pods d’un service entre les nœuds, les zones de disponibilité ou les ensembles de disponibilité afin de réduire les défaillances corrélées.
Le sélecteur d’étiquettes peut correspondre à des pods avec plusieurs déploiements de pod. Employez des combinaisons uniques d’étiquettes lors de la configuration des règles anti-affinité pour éviter de faire correspondre les pods.
Il existe deux types de règles d’affinité de pod: 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.
En fonction de votre priorité de pod et des paramètres de préemption, le planificateur peut ne pas être en mesure de trouver un nœud approprié pour un pod sans violer les exigences d’affinité. Dans l’affirmative, un pod pourrait ne pas être programmé.
Afin d’éviter cette situation, configurez soigneusement l’affinité des pods avec des pods de priorité égale.
Configurez l’affinité des pod/anti-affinité à travers les fichiers 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 montre un Pod spec configuré pour l’affinité des pod et anti-affinité.
Dans cet exemple, la règle d’affinité des pod indique que le pod ne peut programmer sur un nœud que si ce nœud a au moins un pod déjà en cours d’exécution avec une étiquette qui a la sécurité clé et la valeur S1. La règle anti-affinité de pod dit que la gousse préfère ne pas programmer sur un nœud si ce nœud est déjà en train d’exécuter un pod avec une étiquette ayant la sécurité clé et la valeur S2.
Exemple de fichier de configuration Pod avec affinité de pod
- 1
- La strophe pour configurer l’affinité des pod.
- 2
- Définit une règle requise.
- 3 5
- La clé et la valeur (étiquette) qui doivent être assorties pour appliquer la règle.
- 4
- L’opérateur représente la relation entre l’étiquette sur la gousse existante et l’ensemble de valeurs dans les paramètres de correspondanceExpression dans la spécification du nouveau pod. Il peut être dans, NotIn, existe ou n’existe pas.
Exemple de fichier de configuration Pod avec pod anti-affinité
- 1
- Configuration de la pod anti-affinité.
- 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
- Description de l’étiquette de pod qui détermine quand la règle anti-affinité s’applique. Indiquez une clé et une valeur pour l’étiquette.
- 5
- L’opérateur représente la relation entre l’étiquette sur la gousse existante et l’ensemble de valeurs dans les paramètres de correspondanceExpression dans la spécification du nouveau pod. Il peut être dans, NotIn, existe ou n’existe pas.
Lorsque les étiquettes sur un nœud changent au moment de l’exécution, de telle sorte que les règles d’affinité sur une gousse ne sont plus respectées, la gousse continue de fonctionner sur le nœud.
4.2.2. Configuration d’une règle d’affinité de pod Copier lienLien copié sur presse-papiers!
Les étapes suivantes démontrent une configuration simple à deux pod qui crée un pod avec une étiquette et une gousse qui utilise l’affinité pour permettre la planification avec cette gousse.
Il est impossible d’ajouter une affinité directement à un pod programmé.
Procédure
Créer un pod avec une étiquette spécifique dans le pod spec:
Créez un fichier YAML avec le contenu suivant:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créez le pod.
oc create -f <pod-spec>.yaml
$ oc create -f <pod-spec>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Lors de la création d’autres pods, configurez les paramètres suivants pour ajouter l’affinité:
Créez un fichier YAML avec le contenu suivant:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Ajoute une affinité de gousse.
- 2
- Configure le paramètre requisDuringSchedulingIgnoredDuringExecution ou le paramètre préféréDuringSchedulingIgnoredDuringExecution.
- 3
- Indique la clé et les valeurs qui doivent être remplies. Lorsque vous souhaitez que la nouvelle gousse soit programmée avec l’autre pod, utilisez les mêmes paramètres de clé et de valeurs que l’étiquette sur le premier pod.
- 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.
- 5
- Indiquez une topologyKey, qui est un label Kubernetes prépeuplé que le système utilise pour désigner un tel domaine de topologie.
Créez le pod.
oc create -f <pod-spec>.yaml
$ oc create -f <pod-spec>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2.3. Configuration d’une règle anti-affinité de pod Copier lienLien copié sur presse-papiers!
Les étapes suivantes démontrent une configuration simple à deux pod qui crée un pod avec une étiquette et un pod qui utilise une règle préférée anti-affinité pour tenter d’empêcher la planification avec ce pod.
Il est impossible d’ajouter une affinité directement à un pod programmé.
Procédure
Créer un pod avec une étiquette spécifique dans le pod spec:
Créez un fichier YAML avec le contenu suivant:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créez le pod.
oc create -f <pod-spec>.yaml
$ oc create -f <pod-spec>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Lors de la création d’autres pods, configurez les paramètres suivants:
Créez un fichier YAML avec le contenu suivant:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Ajoute une pod anti-affinité.
- 2
- Configure le paramètre requisDuringSchedulingIgnoredDuringExecution ou le paramètre préféréDuringSchedulingIgnoredDuringExecution.
- 3
- Dans le cas d’une règle préférée, spécifie un poids pour le nœud, 1-100. Le nœud qui a le poids le plus élevé est préféré.
- 4
- Indique la clé et les valeurs qui doivent être remplies. Lorsque vous voulez que le nouveau pod ne soit pas programmé avec l’autre pod, utilisez les mêmes paramètres de clé et de valeurs que l’étiquette sur la première gousse.
- 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.
- 6
- Indique une topologyKey, qui est un label Kubernetes prépeuplé que le système utilise pour désigner un tel domaine de topologie.
Créez le pod.
oc create -f <pod-spec>.yaml
$ oc create -f <pod-spec>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2.4. Les règles d’affinité et d’anti-affinité des gousses d’échantillons Copier lienLien copié sur presse-papiers!
Les exemples suivants démontrent l’affinité des pod et la pod anti-affinité.
4.2.4.1. Affinité des pod Copier lienLien copié sur presse-papiers!
L’exemple suivant montre l’affinité des pod pour les gousses avec des étiquettes et des sélecteurs d’étiquettes assortis.
L’équipe de pod4 a l’équipe de label:4.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le pod team4a a l’équipe de sélecteur d’étiquettes:4 sous PodAffinity.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Le pod team4a est prévu sur le même nœud que le groupe Team4.
4.2.4.2. Anti-affinité de pod Copier lienLien copié sur presse-papiers!
L’exemple suivant montre la pod anti-affinité pour les gousses avec des étiquettes assorties et des sélecteurs d’étiquettes.
Le pod-s1 a la sécurité de l’étiquette:s1.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le pod pod-s2 a le sélecteur d’étiquette de sécurité:s1 sous PodAntiAffinity.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Le pod-s2 ne peut pas être programmé sur le même nœud que pod-s1.
4.2.4.3. Affinité de pod sans étiquettes correspondantes Copier lienLien copié sur presse-papiers!
L’exemple suivant montre l’affinité des pods pour les gousses sans assortir les étiquettes et les sélecteurs d’étiquettes.
Le pod-s1 a la sécurité de l’étiquette:s1.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le pod pod-s2 a la sécurité du sélecteur d’étiquettes:s2.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le pod-s2 n’est pas programmé à moins qu’il n’y ait un nœud avec un pod qui a l’étiquette de sécurité:s2. Lorsqu’il n’y a pas d’autre pod avec cette étiquette, la nouvelle gousse reste dans un état en attente:
Exemple de sortie
NAME READY STATUS RESTARTS AGE IP NODE pod-s2 0/1 Pending 0 32s <none>
NAME READY STATUS RESTARTS AGE IP NODE pod-s2 0/1 Pending 0 32s <none>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow