3.9. Éviction des pods à l'aide de l'ordonnanceur
Alors que le planificateur est utilisé pour déterminer le nœud le plus approprié pour héberger un nouveau pod, le déscheduler peut être utilisé pour évincer un pod en cours d'exécution afin qu'il puisse être reprogrammé sur un nœud plus approprié.
3.9.1. À propos du déschedulateur
Vous pouvez utiliser l'ordonnanceur pour expulser les pods sur la base de stratégies spécifiques afin que les pods puissent être replanifiés sur des nœuds plus appropriés.
Vous pouvez bénéficier de la désimplantation des pods en cours d'exécution dans des situations telles que les suivantes :
- Les nœuds sont sous-utilisés ou surutilisés.
- Les exigences relatives aux pods et aux affinités entre nœuds, telles que les taches ou les étiquettes, ont changé et les décisions d'ordonnancement initiales ne sont plus appropriées pour certains nœuds.
- En cas de défaillance d'un nœud, les pods doivent être déplacés.
- De nouveaux nœuds sont ajoutés aux grappes.
- Les pods ont été redémarrés trop souvent.
L'ordonnanceur ne planifie pas le remplacement des pods expulsés. Le planificateur effectue automatiquement cette tâche pour les pods évincés.
Lorsque l'ordonnanceur décide d'expulser des pods d'un nœud, il utilise le mécanisme général suivant :
-
Les pods des espaces de noms
openshift-*
etkube-system
ne sont jamais expulsés. -
Les pods critiques dont la valeur de
priorityClassName
estsystem-cluster-critical
ousystem-node-critical
ne sont jamais expulsés. - Les pods statiques, en miroir ou autonomes qui ne font pas partie d'un contrôleur de réplication, d'un ensemble de réplicas, d'un déploiement ou d'un travail ne sont jamais expulsés car ces pods ne seront pas recréés.
- Les pods associés aux ensembles de démons ne sont jamais expulsés.
- Les pods disposant d'un stockage local ne sont jamais expulsés.
- Les pods "best effort" sont éliminés avant les pods "burstable" et "guaranteed".
-
Tous les types de pods ayant l'annotation
descheduler.alpha.kubernetes.io/evict
sont éligibles à l'expulsion. Cette annotation est utilisée pour passer outre les contrôles qui empêchent l'expulsion, et l'utilisateur peut choisir le pod qui sera expulsé. Les utilisateurs doivent savoir comment et si le pod sera recréé. - Les pods soumis au budget de perturbation des pods (PDB) ne sont pas expulsés si la désynchronisation viole leur budget de perturbation des pods (PDB). Les pods sont expulsés en utilisant la sous-ressource d'expulsion pour gérer le PDB.
3.9.2. Profils du déschedulateur
Les profils suivants sont disponibles :
AffinityAndTaints
Ce profil expulse les pods qui violent l'anti-affinité inter-pods, l'affinité des nœuds et les taches des nœuds.
Il permet de mettre en œuvre les stratégies suivantes :
-
RemovePodsViolatingInterPodAntiAffinity
: élimine les pods qui violent l'anti-affinité inter-pods. -
RemovePodsViolatingNodeAffinity
: supprime les pods qui ne respectent pas l'affinité des nœuds. RemovePodsViolatingNodeTaints
: supprime les pods qui violentNoSchedule
taints sur les nœuds.Les pods dont le type d'affinité de nœud est
requiredDuringSchedulingIgnoredDuringExecution
sont supprimés.
-
TopologyAndDuplicates
Ce profil expulse les pods afin de répartir uniformément les pods similaires ou les pods du même domaine topologique entre les nœuds.
Il permet de mettre en œuvre les stratégies suivantes :
-
RemovePodsViolatingTopologySpreadConstraint
il détecte les domaines topologiques déséquilibrés et tente d'expulser les pods des domaines les plus vastes lorsque les contraintes deDoNotSchedule
sont violées. -
RemoveDuplicates
: garantit qu'il n'y a qu'un seul pod associé à un ensemble de répliques, à un contrôleur de réplication, à un déploiement ou à un travail s'exécutant sur le même nœud. S'il y en a plus, ces pods dupliqués sont évincés pour une meilleure distribution des pods dans un cluster.
-
LifecycleAndUtilization
Ce profil permet d'expulser les pods qui fonctionnent depuis longtemps et d'équilibrer l'utilisation des ressources entre les nœuds.
Il permet de mettre en œuvre les stratégies suivantes :
RemovePodsHavingTooManyRestarts
: supprime les pods dont les conteneurs ont été redémarrés trop souvent.Pods où la somme des redémarrages de tous les conteneurs (y compris les conteneurs d'initialisation) est supérieure à 100.
LowNodeUtilization
le système de gestion des pods : trouve les nœuds qui sont sous-utilisés et expulse les pods, si possible, des nœuds surutilisés dans l'espoir que la recréation des pods expulsés sera programmée sur ces nœuds sous-utilisés.Un nœud est considéré comme sous-utilisé si son utilisation est inférieure à 20 ou à tous les seuils (CPU, mémoire et nombre de pods).
Un nœud est considéré comme surutilisé si son utilisation est supérieure à 50 ou à l'un des seuils (CPU, mémoire et nombre de pods).
PodLifeTime
: évince les nacelles trop anciennes.Par défaut, les pods datant de plus de 24 heures sont supprimés. Vous pouvez personnaliser la valeur de la durée de vie des pods.
SoftTopologyAndDuplicates
Ce profil est le même que celui de
TopologyAndDuplicates
, sauf que les pods ayant des contraintes topologiques douces, commewhenUnsatisfiable: ScheduleAnyway
, sont également pris en compte pour l'expulsion.NoteN'activez pas à la fois
SoftTopologyAndDuplicates
etTopologyAndDuplicates
. L'activation des deux entraîne un conflit.EvictPodsWithLocalStorage
- Ce profil permet aux pods disposant d'un stockage local d'être éligibles à l'éviction.
EvictPodsWithPVC
-
Ce profil permet aux pods ayant des réclamations de volumes persistants d'être éligibles à l'éviction. Si vous utilisez
Kubernetes NFS Subdir External Provisioner
, vous devez ajouter un espace de noms exclu pour l'espace de noms où le provisionneur est installé.
3.9.3. Installation du déschedulateur
Le descheduler n'est pas disponible par défaut. Pour l'activer, vous devez installer Kube Descheduler Operator depuis OperatorHub et activer un ou plusieurs profils de descheduler.
Par défaut, le descheduler fonctionne en mode prédictif, ce qui signifie qu'il ne fait que simuler les évictions de pods. Vous devez changer le mode en mode automatique pour que le descheduler effectue les évictions de pods.
Si vous avez activé les plans de contrôle hébergés dans votre cluster, définissez un seuil de priorité personnalisé pour réduire le risque d'éviction des pods dans les espaces de noms des plans de contrôle hébergés. Définissez le nom de la classe de seuil de priorité sur hypershift-control-plane
, car elle a la valeur de priorité la plus basse (100000000
) des classes de priorité du plan de contrôle hébergé.
Conditions préalables
- Privilèges d'administrateur de cluster.
- Accès à la console web d'OpenShift Container Platform.
Procédure
- Connectez-vous à la console web de OpenShift Container Platform.
Créer l'espace de noms requis pour l'opérateur Kube Descheduler.
-
Naviguez jusqu'à Administration
Namespaces et cliquez sur Create Namespace. -
Entrez
openshift-kube-descheduler-operator
dans le champ Name, entrezopenshift.io/cluster-monitoring=true
dans le champ Labels pour activer les métriques du déscheduler, et cliquez sur Create.
-
Naviguez jusqu'à Administration
Installez l'opérateur Kube Descheduler.
-
Naviguez jusqu'à Operators
OperatorHub. - Tapez Kube Descheduler Operator dans le champ de filtre.
- Sélectionnez le site Kube Descheduler Operator et cliquez sur Install.
- Sur la page Install Operator, sélectionnez A specific namespace on the cluster. Sélectionnez openshift-kube-descheduler-operator dans le menu déroulant.
- Ajustez les valeurs de Update Channel et Approval Strategy aux valeurs souhaitées.
- Cliquez sur Install.
-
Naviguez jusqu'à Operators
Créer une instance de déscheduler.
-
Dans la page Operators
Installed Operators, cliquez sur Kube Descheduler Operator. - Sélectionnez l'onglet Kube Descheduler et cliquez sur Create KubeDescheduler.
Modifiez les paramètres si nécessaire.
- Pour expulser des pods au lieu de simuler les expulsions, remplacez le champ Mode par Automatic.
Développez la section Profiles pour sélectionner un ou plusieurs profils à activer. Le profil
AffinityAndTaints
est activé par défaut. Cliquez sur Add Profile pour sélectionner d'autres profils.NoteN'activez pas à la fois
TopologyAndDuplicates
etSoftTopologyAndDuplicates
. L'activation des deux entraîne un conflit.Optionnel : Développez la section Profile Customizations pour définir des configurations optionnelles pour le déscheduler.
-
Définissez une valeur personnalisée de durée de vie des pods pour le profil
LifecycleAndUtilization
. Utilisez le champ podLifetime pour définir une valeur numérique et une unité valide (s
,m
, ouh
). La durée de vie par défaut est de 24 heures (24h
). Définissez un seuil de priorité personnalisé pour que les pods soient pris en compte pour l'expulsion uniquement si leur priorité est inférieure à un niveau de priorité spécifié. Utilisez le champ thresholdPriority pour définir un seuil de priorité numérique ou utilisez le champ thresholdPriorityClassName pour spécifier un certain nom de classe de priorité.
NoteNe spécifiez pas à la fois thresholdPriority et thresholdPriorityClassName pour le déscheduler.
Définissez des espaces de noms spécifiques à exclure ou à inclure dans les opérations du déscheduler. Développez le champ namespaces et ajoutez des espaces de noms à la liste excluded ou included. Vous ne pouvez définir qu'une liste d'espaces de noms à exclure ou une liste d'espaces de noms à inclure. Notez que les espaces de noms protégés (
openshift-*
,kube-system
,hypershift
) sont exclus par défaut.ImportantLa stratégie
LowNodeUtilization
ne prend pas en charge l'exclusion d'espaces de noms. Si le profilLifecycleAndUtilization
est défini, ce qui active la stratégieLowNodeUtilization
, aucun espace de noms n'est exclu, même les espaces de noms protégés. Pour éviter les expulsions des espaces de noms protégés lorsque la stratégieLowNodeUtilization
est activée, définissez le nom de la classe de priorité sursystem-cluster-critical
ousystem-node-critical
.Expérimental : Définir les seuils de sous-utilisation et de surutilisation pour la stratégie
LowNodeUtilization
. Utilisez le champ devLowNodeUtilizationThresholds pour définir l'une des valeurs suivantes :-
Low
: 10 % sous-utilisés et 30 % surutilisés -
Medium
20% de sous-utilisation et 50% de sur-utilisation (par défaut) -
High
: 40 % sous-utilisés et 70 % surutilisés
NoteCe paramètre est expérimental et ne doit pas être utilisé dans un environnement de production.
-
-
Définissez une valeur personnalisée de durée de vie des pods pour le profil
-
En option : Utilisez le champ Descheduling Interval Seconds pour modifier le nombre de secondes entre les exécutions du descheduler. La valeur par défaut est
3600
secondes.
- Cliquez sur Create.
-
Dans la page Operators
Vous pouvez également configurer les profils et les paramètres du descheduler ultérieurement en utilisant le CLI OpenShift (oc
). Si vous n'avez pas ajusté les profils lors de la création de l'instance de descheduler depuis la console web, le profil AffinityAndTaints
est activé par défaut.
3.9.4. Configuration des profils de désordre
Vous pouvez configurer les profils utilisés par le descheduler pour évincer les pods.
Conditions préalables
- Privilèges de l'administrateur du cluster
Procédure
Modifiez l'objet
KubeDescheduler
:$ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
Spécifiez un ou plusieurs profils dans la section
spec.profiles
.apiVersion: operator.openshift.io/v1 kind: KubeDescheduler metadata: name: cluster namespace: openshift-kube-descheduler-operator spec: deschedulingIntervalSeconds: 3600 logLevel: Normal managementState: Managed operatorLogLevel: Normal mode: Predictive 1 profileCustomizations: namespaces: 2 excluded: - my-namespace podLifetime: 48h 3 thresholdPriorityClassName: my-priority-class-name 4 profiles: 5 - AffinityAndTaints - TopologyAndDuplicates 6 - LifecycleAndUtilization - EvictPodsWithLocalStorage - EvictPodsWithPVC
- 1
- Facultatif : Par défaut, le descheduler n'expulse pas les pods. Pour évincer les modules, définissez
mode
surAutomatic
. - 2
- Facultatif : Définissez une liste d'espaces de noms créés par l'utilisateur à inclure ou à exclure des opérations de déscheduler. Utilisez
excluded
pour définir une liste d'espaces de noms à exclure ou utilisezincluded
pour définir une liste d'espaces de noms à inclure. Notez que les espaces de noms protégés (openshift-*
,kube-system
,hypershift
) sont exclus par défaut.ImportantLa stratégie
LowNodeUtilization
ne prend pas en charge l'exclusion d'espaces de noms. Si le profilLifecycleAndUtilization
est défini, ce qui active la stratégieLowNodeUtilization
, aucun espace de noms n'est exclu, même les espaces de noms protégés. Pour éviter les expulsions des espaces de noms protégés lorsque la stratégieLowNodeUtilization
est activée, définissez le nom de la classe de priorité sursystem-cluster-critical
ousystem-node-critical
. - 3
- Facultatif : Activez une valeur personnalisée de durée de vie du pod pour le profil
LifecycleAndUtilization
. Les unités valides sonts
,m
, ouh
. La durée de vie du pod par défaut est de 24 heures. - 4
- Facultatif : Spécifiez un seuil de priorité pour que les pods soient pris en compte pour l'expulsion uniquement si leur priorité est inférieure au niveau spécifié. Utilisez le champ
thresholdPriority
pour définir un seuil de priorité numérique (par exemple,10000
) ou utilisez le champthresholdPriorityClassName
pour spécifier un certain nom de classe de priorité (par exemple,my-priority-class-name
). Si vous spécifiez un nom de classe de priorité, il doit déjà exister ou le descheduler lancera une erreur. Ne définissez pas à la foisthresholdPriority
etthresholdPriorityClassName
. - 5
- Ajouter un ou plusieurs profils à activer. Profils disponibles :
AffinityAndTaints
,TopologyAndDuplicates
,LifecycleAndUtilization
,SoftTopologyAndDuplicates
,EvictPodsWithLocalStorage
, etEvictPodsWithPVC
. - 6
- N'activez pas à la fois
TopologyAndDuplicates
etSoftTopologyAndDuplicates
. L'activation des deux entraîne un conflit.
Vous pouvez activer plusieurs profils ; l'ordre dans lequel les profils sont spécifiés n'est pas important.
- Enregistrez le fichier pour appliquer les modifications.
3.9.5. Configuration de l'intervalle de déschedulation
Vous pouvez configurer le temps qui s'écoule entre deux exécutions du Descheduler. La valeur par défaut est de 3600 secondes (une heure).
Conditions préalables
- Privilèges de l'administrateur du cluster
Procédure
Modifiez l'objet
KubeDescheduler
:$ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
Mettez à jour le champ
deschedulingIntervalSeconds
avec la valeur souhaitée :apiVersion: operator.openshift.io/v1 kind: KubeDescheduler metadata: name: cluster namespace: openshift-kube-descheduler-operator spec: deschedulingIntervalSeconds: 3600 1 ...
- 1
- Définit le nombre de secondes entre les exécutions du planificateur. Une valeur de
0
dans ce champ permet d'exécuter le descheduler une fois et de le quitter.
- Enregistrez le fichier pour appliquer les modifications.
3.9.6. Désinstallation du déscheduler
Vous pouvez supprimer le descheduler de votre cluster en supprimant l'instance du descheduler et en désinstallant Kube Descheduler Operator. Cette procédure nettoie également l'espace de noms KubeDescheduler
CRD et openshift-kube-descheduler-operator
.
Conditions préalables
- Privilèges d'administrateur de cluster.
- Accès à la console web d'OpenShift Container Platform.
Procédure
- Connectez-vous à la console web de OpenShift Container Platform.
Supprime l'instance du déscheduler.
-
Sur la page Operators
Installed Operators, cliquez sur Kube Descheduler Operator. - Sélectionnez l'onglet Kube Descheduler.
- Cliquez sur le menu Options à côté de l'entrée cluster et sélectionnez Delete KubeDescheduler.
- Dans la boîte de dialogue de confirmation, cliquez sur Delete.
-
Sur la page Operators
Désinstaller l'opérateur Kube Descheduler.
-
Naviguez jusqu'à Operators
Installed Operators. - Cliquez sur le menu Options à côté de l'entrée Kube Descheduler Operator et sélectionnez Uninstall Operator.
- Dans la boîte de dialogue de confirmation, cliquez sur Uninstall.
-
Naviguez jusqu'à Operators
Supprimer l'espace de noms
openshift-kube-descheduler-operator
.-
Naviguez jusqu'à Administration
Namespaces. -
Saisissez
openshift-kube-descheduler-operator
dans le champ de filtre. - Cliquez sur le menu Options à côté de l'entrée openshift-kube-descheduler-operator et sélectionnez Delete Namespace.
-
Dans la boîte de dialogue de confirmation, saisissez
openshift-kube-descheduler-operator
et cliquez sur Delete.
-
Naviguez jusqu'à Administration
Supprimer le CRD
KubeDescheduler
.-
Naviguez jusqu'à Administration
Custom Resource Definitions. -
Saisissez
KubeDescheduler
dans le champ de filtre. - Cliquez sur le menu Options à côté de l'entrée KubeDescheduler et sélectionnez Delete CustomResourceDefinition.
- Dans la boîte de dialogue de confirmation, cliquez sur Delete.
-
Naviguez jusqu'à Administration