Lorsque les ressources du cluster sont limitées, les tâches prioritaires peuvent échouer en raison d'un manque de ressources. Une fois la préemption activée, ACK Scheduler simule la disponibilité des ressources et expulse les pods à faible priorité pour libérer des ressources de calcul, permettant ainsi aux tâches prioritaires de démarrer rapidement.
Prérequis
Consultez la documentation Priorité et préemption des pods afin de comprendre le concept de PriorityClass, le paramètre priorityClassName et l'impact de la priorité des pods sur l'ordonnancement et l'ordre d'expulsion.
Fonctionnement de la préemption
Lorsque la préemption est activée, ACK Scheduler suit la procédure suivante :
-
Spécifiez la priorité des tâches : ajoutez le paramètre
priorityClassNameà la configuration des pods.Les composants système tels que kube-proxy et etcd utilisent généralement la classe de priorité
system-node-critical. La plupart s'exécutent sous forme de DaemonSets et ne sont pas expulsés par défaut. Simulez la préemption : lorsque ACK Scheduler détecte un pod en attente qui ne peut pas être planifié, il simule l'expulsion des pods à faible priorité pour vérifier si cela libérerait suffisamment de ressources.
Expulsez les pods à faible priorité de manière sécurisée : après le déclenchement de la préemption par ACK Scheduler, kubelet expulse les pods identifiés, libérant ainsi des ressources pour le pod prioritaire.
Replanifiez les pods expulsés : les contrôleurs, tels que Deployments, recréent les pods expulsés et les planifient sur d'autres nœuds. Si les ressources restent insuffisantes, les pods demeurent en attente.
Politiques de préemption
ACK Scheduler prend en charge les politiques de préemption suivantes, configurables via le paramètre PreemptionAlgorithm.
**Politique**
|
**Description**
| | --- | --- | |
Default
|
Politique de préemption Kubernetes par défaut. Tente d'abord une planification directe, puis simule l'expulsion des pods à faible priorité en cas de ressources insuffisantes. Consultez la documentation [Priorité et préemption des pods](https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/).
| |
ElasticQuota
|
Effectue la préemption en fonction de l'[ElasticQuotaTree](https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/improve-resource-utilization-with-elasticquotatree-and-task-queues). Consultez les [détails de la politique ElasticQuota](#elasticquota-policy-details).
| |
Auto
|
Privilégie ElasticQuota et revient à Default si ElasticQuota ne s'applique pas.
| |
None
|
Désactive la préemption.
|
Le schéma suivant illustre le fonctionnement de la politique.
Détails de la politique ElasticQuota
Lorsque la politique ElasticQuota est active, ACK Scheduler effectue la préemption en trois étapes :
Identifiez la liste de préemption : contrairement aux tâches classiques, ACK Scheduler regroupe tous les pods en attente d'un gang dans une seule liste de préemption. Le gang n'est traité que si tous les pods peuvent être planifiés via la préemption. Si un pod possède une priorité élevée, l'ensemble du gang est considéré comme prioritaire.
-
Identifiez les nœuds faisables : ACK Scheduler détermine les nœuds candidats :
Si plusieurs pods du gang nécessitent une préemption, tout nœud correspondant à un pod est ajouté au pool de candidats. ACK Scheduler libère ensuite les ressources pour les autres pods.
Si un seul pod nécessite une préemption, ACK Scheduler filtre les nœuds non planifiables (Unschedulable) pour identifier ceux dont les ressources sont insuffisantes ou incompatibles.
-
Simulez la préemption : ACK Scheduler filtre les pods éligibles à la préemption parmi les nœuds faisables. Un pod est éligible si les deux conditions suivantes sont remplies :
Il n'est pas en cours de préemption par un autre pod ou une autre tâche.
Il peut être expulsé conformément aux PodDisruptionBudgets (PDB) applicables.
ACK Scheduler applique ensuite les règles de l'ElasticQuotaTree :
-
Si le pod qui initie la préemption appartient à un quota :
Si l'utilisation actuelle du quota est inférieure ou égale à sa garantie
Min: le pod peut préempter des pods appartenant à d'autres quotas qui utilisent des ressources au-delà de leur garantieMin.Si l'utilisation actuelle du quota dépasse sa garantie
Min: le pod ne peut préempter que des pods de priorité inférieure au sein de son propre quota (préemption intra-quota).
Si le pod qui initie la préemption n'appartient à aucun quota : la préemption n'est pas autorisée.
Après avoir identifié les pods à préempter, ACK Scheduler simule leur suppression et la replanification du pod initiateur. Si la simulation réussit, les pods sont expulsés et replanifiés. En cas d'échec, la préemption est arrêtée.
Activer la préemption
Personnalisez les paramètres du planificateur et définissez preemptionAlgorithm sur Default, ElasticQuota, Auto ou None. La valeur par défaut est Auto.
Étapes suivantes
Utiliser la planification par gang : interaction entre la planification par gang et la préemption ElasticQuota.
Améliorer l'utilisation des ressources avec ElasticQuotaTree et les files d'attente de tâches : définition des limites de quota pour la préemption ElasticQuota.
Priorité et préemption des pods : référence Kubernetes pour PriorityClass et la préemption.
PodDisruptionBudgets : protection des charges de travail critiques contre l'expulsion lors de la préemption.