3.6. Contrôle du placement de pods à l'aide de taches de nœuds
Les taches et les tolérances permettent au nœud de contrôler quels pods doivent (ou ne doivent pas) être programmés sur eux.
3.6.1. Comprendre les taches et les tolérances
Un taint permet à un nœud de refuser qu'un module soit programmé à moins que ce module n'ait un toleration correspondant.
Vous appliquez des taches à un nœud par le biais de la spécification Node
(NodeSpec
) et vous appliquez des tolérances à un pod par le biais de la spécification Pod
(PodSpec
). Lorsque vous appliquez une tare à un nœud, l'ordonnanceur ne peut pas placer un module sur ce nœud à moins que le module ne puisse tolérer la tare.
Exemple d'altération dans la spécification d'un nœud
spec: taints: - effect: NoExecute key: key1 value: value1 ....
Exemple de tolérance dans une spécification Pod
spec: tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" tolerationSeconds: 3600 ....
Les plaintes et les tolérances se composent d'une clé, d'une valeur et d'un effet.
Paramètres | Description | ||||||
---|---|---|---|---|---|---|---|
|
Le site | ||||||
|
Le site | ||||||
| L'effet est l'un des suivants :
| ||||||
|
|
Si vous ajoutez une erreur
NoSchedule
à un nœud du plan de contrôle, le nœud doit avoir l'erreurnode-role.kubernetes.io/master=:NoSchedule
, qui est ajoutée par défaut.Par exemple :
apiVersion: v1 kind: Node metadata: annotations: machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c ... spec: taints: - effect: NoSchedule key: node-role.kubernetes.io/master ...
Une tolérance correspond à une souillure :
Si le paramètre
operator
est réglé surEqual
:-
les paramètres de
key
sont les mêmes ; -
les paramètres de
value
sont les mêmes ; -
les paramètres de
effect
sont les mêmes.
-
les paramètres de
Si le paramètre
operator
est réglé surExists
:-
les paramètres de
key
sont les mêmes ; -
les paramètres de
effect
sont les mêmes.
-
les paramètres de
Les plaintes suivantes sont intégrées à OpenShift Container Platform :
-
node.kubernetes.io/not-ready
: Le nœud n'est pas prêt. Cela correspond à la condition du nœudReady=False
. -
node.kubernetes.io/unreachable
: Le nœud est inaccessible depuis le contrôleur de nœud. Cela correspond à l'état du nœudReady=Unknown
. -
node.kubernetes.io/memory-pressure
: Le nœud a des problèmes de pression de mémoire. Cela correspond à la condition du nœudMemoryPressure=True
. -
node.kubernetes.io/disk-pressure
: Le nœud a des problèmes de pression de disque. Cela correspond à l'état du nœudDiskPressure=True
. -
node.kubernetes.io/network-unavailable
: Le réseau du nœud est indisponible. -
node.kubernetes.io/unschedulable
: Le nœud n'est pas ordonnançable. -
node.cloudprovider.kubernetes.io/uninitialized
: Lorsque le contrôleur de nœuds est démarré avec un fournisseur de nuage externe, cette altération est définie sur un nœud pour le marquer comme inutilisable. Après qu'un contrôleur du cloud-controller-manager initialise ce nœud, le kubelet supprime cette taint. node.kubernetes.io/pid-pressure
: Le nœud a un pid de pression. Cela correspond à la condition du nœudPIDPressure=True
.ImportantOpenShift Container Platform ne définit pas de pid par défaut.available
evictionHard
.
3.6.1.1. Comprendre comment utiliser les secondes de tolérance pour retarder les expulsions de nacelles
Vous pouvez spécifier la durée pendant laquelle un pod peut rester lié à un nœud avant d'être expulsé en spécifiant le paramètre tolerationSeconds
dans la spécification Pod
ou l'objet MachineSet
. Si une altération ayant l'effet NoExecute
est ajoutée à un nœud, un module qui tolère l'altération, qui a le paramètre tolerationSeconds
, le module n'est pas expulsé avant l'expiration de ce délai.
Exemple de sortie
spec: tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" tolerationSeconds: 3600
Ici, si ce pod est en cours d'exécution mais n'a pas de tolérance correspondante, le pod reste lié au nœud pendant 3 600 secondes avant d'être expulsé. Si l'altération est supprimée avant ce délai, le module n'est pas expulsé.
3.6.1.2. Comprendre comment utiliser des teintes multiples
Vous pouvez placer plusieurs taints sur le même nœud et plusieurs tolérances sur le même pod. OpenShift Container Platform traite les plaintes et tolérances multiples de la manière suivante :
- Traiter les plaintes pour lesquelles le pod a une tolérance correspondante.
Les autres souillures non appariées ont les effets indiqués sur la cosse :
-
S'il y a au moins une taint non appariée avec l'effet
NoSchedule
, OpenShift Container Platform ne peut pas planifier un pod sur ce nœud. -
S'il n'y a pas de taint non apparié avec l'effet
NoSchedule
mais qu'il y a au moins un taint non apparié avec l'effetPreferNoSchedule
, OpenShift Container Platform essaie de ne pas planifier le pod sur le nœud. S'il y a au moins une taint non appariée avec l'effet
NoExecute
, OpenShift Container Platform expulse le pod du nœud s'il est déjà en cours d'exécution sur le nœud, ou le pod n'est pas planifié sur le nœud s'il n'est pas encore en cours d'exécution sur le nœud.- Les pods qui ne tolèrent pas la souillure sont immédiatement expulsés.
-
Les pods qui tolèrent l'altération sans spécifier
tolerationSeconds
dans leur spécificationPod
restent liés pour toujours. -
Les pods qui tolèrent l'altération à l'aide d'une adresse
tolerationSeconds
spécifiée restent liés pendant la durée spécifiée.
-
S'il y a au moins une taint non appariée avec l'effet
Par exemple :
Ajoutez au nœud les taches suivantes :
$ oc adm taint nodes node1 key1=value1:NoSchedule
$ oc adm taint nodes node1 key1=value1:NoExecute
$ oc adm taint nodes node1 key2=value2:NoSchedule
Les tolérances suivantes s'appliquent à la nacelle :
spec: tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule" - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute"
Dans ce cas, le module ne peut pas être programmé sur le nœud, car il n'y a pas de tolérance correspondant à la troisième tare. Le module continue de fonctionner s'il est déjà en cours d'exécution sur le nœud lorsque la tare est ajoutée, car la troisième tare est la seule des trois qui n'est pas tolérée par le module.
3.6.1.3. Comprendre l'ordonnancement des pods et les conditions des nœuds (taint node by condition)
La fonction d'altération des nœuds par condition, activée par défaut, altère automatiquement les nœuds qui signalent des conditions telles que la pression de la mémoire et la pression du disque. Lorsqu'un nœud signale une condition, une erreur est ajoutée jusqu'à ce que la condition disparaisse. Les taches ont l'effet NoSchedule
, ce qui signifie qu'aucun pod ne peut être planifié sur le nœud à moins que le pod n'ait une tolérance correspondante.
L'ordonnanceur vérifie la présence de ces anomalies sur les nœuds avant de planifier les modules. Si l'erreur est présente, le module est planifié sur un nœud différent. Comme l'ordonnanceur vérifie les anomalies et non les conditions réelles des nœuds, vous pouvez configurer l'ordonnanceur pour qu'il ignore certaines de ces conditions en ajoutant des tolérances appropriées pour les nœuds.
Pour assurer la compatibilité ascendante, le contrôleur de jeu de démons ajoute automatiquement les tolérances suivantes à tous les démons :
- node.kubernetes.io/memory-pressure
- node.kubernetes.io/disk-pressure
- node.kubernetes.io/unschedulable (1.10 ou ultérieur)
- node.kubernetes.io/network-unavailable (réseau hôte uniquement)
Vous pouvez également ajouter des tolérances arbitraires aux ensembles de démons.
Le plan de contrôle ajoute également la tolérance node.kubernetes.io/memory-pressure
sur les pods qui ont une classe QoS. En effet, Kubernetes gère les pods dans les classes de QoS Guaranteed
ou Burstable
. Les nouveaux pods BestEffort
ne sont pas planifiés sur le nœud affecté.
3.6.1.4. Comprendre l'éviction des pods par condition (évictions basées sur les taches)
La fonction Taint-Based Evictions, qui est activée par défaut, expulse les pods d'un nœud qui présente des conditions spécifiques, telles que not-ready
et unreachable
. Lorsqu'un nœud est confronté à l'une de ces conditions, OpenShift Container Platform ajoute automatiquement des taints au nœud et commence à expulser et à replanifier les pods sur différents nœuds.
Les évictions basées sur l'altération ont un effet NoExecute
, où tout pod qui ne tolère pas l'altération est évincé immédiatement et tout pod qui tolère l'altération ne sera jamais évincé, à moins que le pod n'utilise le paramètre tolerationSeconds
.
Le paramètre tolerationSeconds
vous permet de spécifier la durée pendant laquelle un pod reste lié à un nœud qui a une condition de nœud. Si la condition existe toujours après la période tolerationSeconds
, l'altération reste sur le nœud et les pods avec une tolérance correspondante sont expulsés. Si la condition disparaît avant la période tolerationSeconds
, les pods avec les tolérances correspondantes ne sont pas supprimés.
Si vous utilisez le paramètre tolerationSeconds
sans valeur, les pods ne sont jamais expulsés en raison des conditions "not ready" et "unreachable node".
OpenShift Container Platform évince les pods de manière limitée afin d'éviter les évictions massives de pods dans des scénarios tels que la partition du maître par rapport aux nœuds.
Par défaut, si plus de 55 % des nœuds d'une zone donnée sont malsains, le contrôleur du cycle de vie des nœuds fait passer l'état de cette zone à PartialDisruption
et le taux d'expulsion des pods est réduit. Pour les petits clusters (par défaut, 50 nœuds ou moins) dans cet état, les nœuds de cette zone ne sont pas altérés et les expulsions sont arrêtées.
Pour plus d'informations, voir Rate limits on eviction dans la documentation Kubernetes.
OpenShift Container Platform ajoute automatiquement une tolérance pour node.kubernetes.io/not-ready
et node.kubernetes.io/unreachable
avec tolerationSeconds=300
, à moins que la configuration Pod
ne spécifie l'une ou l'autre tolérance.
spec:
tolerations:
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoExecute
tolerationSeconds: 300 1
- key: node.kubernetes.io/unreachable
operator: Exists
effect: NoExecute
tolerationSeconds: 300
- 1
- Ces tolérances garantissent que le comportement par défaut du pod est de rester lié pendant cinq minutes après la détection d'un de ces problèmes de conditions de nœuds.
Vous pouvez configurer ces tolérances selon vos besoins. Par exemple, si vous avez une application avec beaucoup d'état local, vous pourriez vouloir garder les pods liés au nœud plus longtemps en cas de partition du réseau, ce qui permettrait à la partition de se rétablir et d'éviter l'éviction des pods.
Les pods générés par un ensemble de démons sont créés avec des tolérances de NoExecute
pour les taches suivantes, sans tolerationSeconds
:
-
node.kubernetes.io/unreachable
-
node.kubernetes.io/not-ready
Par conséquent, les pods de l'ensemble des démons ne sont jamais expulsés en raison de ces conditions de nœuds.
3.6.1.5. Tolérer toutes les tares
Vous pouvez configurer un pod pour qu'il tolère toutes les plaintes en ajoutant une tolérance operator: "Exists"
sans paramètres key
et value
. Les pods ayant cette tolérance ne sont pas retirés d'un nœud qui a des taches.
Pod
spécification pour la tolérance de toutes les taches
spec: tolerations: - operator: "Exists"
3.6.2. Ajout de taches et de tolérances
Vous ajoutez des tolérances aux modules et des taches aux nœuds pour permettre au nœud de contrôler les modules qui doivent ou ne doivent pas être planifiés sur eux. Pour les pods et les nœuds existants, vous devez d'abord ajouter la tolérance au pod, puis ajouter la taint au nœud afin d'éviter que les pods ne soient retirés du nœud avant que vous ne puissiez ajouter la tolérance.
Procédure
Ajouter une tolérance à un pod en modifiant la spécification
Pod
pour y inclure une strophetolerations
:Exemple de fichier de configuration d'un pod avec un opérateur Equal
spec: tolerations: - key: "key1" 1 value: "value1" operator: "Equal" effect: "NoExecute" tolerationSeconds: 3600 2
Par exemple :
Exemple de fichier de configuration d'un pod avec un opérateur Exists
spec: tolerations: - key: "key1" operator: "Exists" 1 effect: "NoExecute" tolerationSeconds: 3600
- 1
- L'opérateur
Exists
ne prend pas devalue
.
Cet exemple place une tare sur
node1
qui a la clékey1
, la valeurvalue1
, et l'effet de tareNoExecute
.Ajoutez une tare à un nœud en utilisant la commande suivante avec les paramètres décrits dans le tableau Taint and toleration components:
$ oc adm taint nodes <node_name> <key>=<value>:<effect>
Par exemple :
$ oc adm taint nodes node1 key1=value1:NoExecute
Cette commande place une tare sur
node1
qui a pour clékey1
, pour valeurvalue1
, et pour effetNoExecute
.NoteSi vous ajoutez une erreur
NoSchedule
à un nœud du plan de contrôle, le nœud doit avoir l'erreurnode-role.kubernetes.io/master=:NoSchedule
, qui est ajoutée par défaut.Par exemple :
apiVersion: v1 kind: Node metadata: annotations: machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c ... spec: taints: - effect: NoSchedule key: node-role.kubernetes.io/master ...
Les tolérances du module correspondent à l'altération du nœud. Un pod avec l'une ou l'autre des tolérances peut être programmé sur
node1
.
3.6.2.1. Ajout de taches et de tolérances à l'aide d'un ensemble de machines de calcul
Vous pouvez ajouter des taches aux nœuds à l'aide d'un ensemble de machines de calcul. Tous les nœuds associés à l'objet MachineSet
sont mis à jour avec l'erreur. Les tolérances réagissent aux taches ajoutées par un ensemble de machines de calcul de la même manière que les taches ajoutées directement aux nœuds.
Procédure
Ajouter une tolérance à un pod en modifiant la spécification
Pod
pour y inclure une strophetolerations
:Exemple de fichier de configuration d'un pod avec l'opérateur
Equal
spec: tolerations: - key: "key1" 1 value: "value1" operator: "Equal" effect: "NoExecute" tolerationSeconds: 3600 2
Par exemple :
Exemple de fichier de configuration d'un pod avec l'opérateur
Exists
spec: tolerations: - key: "key1" operator: "Exists" effect: "NoExecute" tolerationSeconds: 3600
Ajouter l'altération à l'objet
MachineSet
:Modifiez le fichier YAML de
MachineSet
pour les nœuds que vous souhaitez altérer ou créez un nouvel objetMachineSet
:$ oc edit machineset <machineset>
Ajoutez la souillure à la section
spec.template.spec
:Exemple d'altération dans la spécification d'un ensemble de machines de calcul
spec: .... template: .... spec: taints: - effect: NoExecute key: key1 value: value1 ....
Cet exemple place une taint qui a la clé
key1
, la valeurvalue1
, et l'effet de taintNoExecute
sur les nœuds.Réduire l'échelle de la machine de calcul à 0 :
$ oc scale --replicas=0 machineset <machineset> -n openshift-machine-api
AstuceVous pouvez également appliquer le YAML suivant pour mettre à l'échelle l'ensemble des machines de calcul :
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: name: <machineset> namespace: openshift-machine-api spec: replicas: 0
Attendez que les machines soient retirées.
Augmenter l'ensemble des machines de calcul en fonction des besoins :
$ oc scale --replicas=2 machineset <machineset> -n openshift-machine-api
Ou bien :
$ oc edit machineset <machineset> -n openshift-machine-api
Attendez que les machines démarrent. L'altération est ajoutée aux nœuds associés à l'objet
MachineSet
.
3.6.2.2. Lier un utilisateur à un nœud à l'aide de taches et de tolérances
Si vous souhaitez réserver un ensemble de nœuds à l'usage exclusif d'un groupe particulier d'utilisateurs, ajoutez une tolérance à leurs pods. Ajoutez ensuite une altération correspondante à ces nœuds. Les pods avec les tolérances sont autorisés à utiliser les nœuds altérés ou tout autre nœud du cluster.
Si vous voulez vous assurer que les pods sont programmés uniquement sur les nœuds altérés, ajoutez également une étiquette au même ensemble de nœuds et ajoutez une affinité de nœud aux pods de sorte que les pods ne puissent être programmés que sur des nœuds avec cette étiquette.
Procédure
Pour configurer un nœud de manière à ce que les utilisateurs ne puissent utiliser que ce nœud :
Ajouter une tare correspondante à ces nœuds :
Par exemple :
$ oc adm taint nodes node1 dedicated=groupName:NoSchedule
AstuceVous pouvez également appliquer le YAML suivant pour ajouter l'altération :
kind: Node apiVersion: v1 metadata: name: <node_name> labels: ... spec: taints: - key: dedicated value: groupName effect: NoSchedule
- Ajoutez une tolérance aux pods en écrivant un contrôleur d'admission personnalisé.
3.6.2.3. Créer un projet avec un sélecteur de nœuds et une tolérance
Vous pouvez créer un projet qui utilise un sélecteur de nœud et une tolérance, qui sont définis comme des annotations, pour contrôler le placement des pods sur des nœuds spécifiques. Toutes les ressources ultérieures créées dans le projet sont alors planifiées sur des nœuds dont l'altération correspond à la tolérance.
Conditions préalables
- Une étiquette de sélection de nœuds a été ajoutée à un ou plusieurs nœuds en utilisant un ensemble de machines de calcul ou en éditant le nœud directement.
- Une tare a été ajoutée à un ou plusieurs nœuds en utilisant un ensemble de machines de calcul ou en modifiant le nœud directement.
Procédure
Créer une définition de ressource
Project
, en spécifiant un sélecteur de nœud et une tolérance dans la sectionmetadata.annotations
:Exemple de fichier
project.yaml
kind: Project apiVersion: project.openshift.io/v1 metadata: name: <project_name> 1 annotations: openshift.io/node-selector: '<label>' 2 scheduler.alpha.kubernetes.io/defaultTolerations: >- [{"operator": "Exists", "effect": "NoSchedule", "key": "<key_name>"} 3 ]
- 1
- Le nom du projet.
- 2
- L'étiquette par défaut du sélecteur de nœud.
- 3
- Les paramètres de tolérance, tels que décrits dans le tableau Taint and toleration components. Cet exemple utilise l'effet
NoSchedule
, qui permet aux pods existants sur le nœud de rester, et l'opérateurExists
, qui ne prend pas de valeur.
Utilisez la commande
oc apply
pour créer le projet :$ oc apply -f project.yaml
Toutes les ressources créées ultérieurement dans l'espace de noms <project_name>
doivent désormais être planifiées sur les nœuds spécifiés.
Ressources supplémentaires
3.6.2.4. Contrôle des nœuds avec du matériel spécial à l'aide de taches et de tolérances
Dans un cluster où un petit sous-ensemble de nœuds dispose d'un matériel spécialisé, vous pouvez utiliser les taints et les tolérances pour empêcher les pods qui n'ont pas besoin de ce matériel spécialisé d'utiliser ces nœuds, laissant ainsi les nœuds aux pods qui ont besoin de ce matériel spécialisé. Vous pouvez également exiger que les modules qui ont besoin d'un matériel spécialisé utilisent des nœuds spécifiques.
Vous pouvez y parvenir en ajoutant une tolérance aux pods qui ont besoin d'un matériel spécial et en altérant les nœuds qui disposent de ce matériel.
Procédure
Pour s'assurer que les nœuds dotés d'un matériel spécialisé sont réservés à des modules spécifiques :
Ajouter une tolérance aux nacelles qui ont besoin d'un matériel spécial.
Par exemple :
spec: tolerations: - key: "disktype" value: "ssd" operator: "Equal" effect: "NoSchedule" tolerationSeconds: 3600
Attaquez les nœuds dotés du matériel spécialisé à l'aide de l'une des commandes suivantes :
oc adm taint nodes <node-name> disktype=ssd:NoSchedule
Ou bien :
oc adm taint nodes <node-name> disktype=ssd:PreferNoSchedule
AstuceVous pouvez également appliquer le YAML suivant pour ajouter l'altération :
kind: Node apiVersion: v1 metadata: name: <node_name> labels: ... spec: taints: - key: disktype value: ssd effect: PreferNoSchedule
3.6.3. Supprimer les tares et les tolérances
Vous pouvez supprimer les tares des nœuds et les tolérances des nacelles si nécessaire. Vous devez d'abord ajouter la tolérance au module, puis ajouter l'altération au nœud afin d'éviter que des modules soient retirés du nœud avant que vous ne puissiez ajouter la tolérance.
Procédure
Éliminer les tares et les tolérances :
Pour supprimer une tare d'un nœud :
$ oc adm taint nodes <node-name> <key>-
Par exemple :
$ oc adm taint nodes ip-10-0-132-248.ec2.internal key1-
Exemple de sortie
node/ip-10-0-132-248.ec2.internal untainted
Pour supprimer une tolérance d'un pod, modifiez la spécification de
Pod
pour supprimer la tolérance :spec: tolerations: - key: "key2" operator: "Exists" effect: "NoExecute" tolerationSeconds: 3600