## Introduction La classe de priorité Kubernetes (PriorityClass) est un mécanisme essentiel pour contrôler l'ordonnancement et la préemption des pods dans les clusters de production. Lorsque les ressources sont limitées, le planificateur utilise les priorités pour décider quels pods programmer en premier et quels pods de priorité inférieure peuvent être évincés pour libérer de la place. Une mauvaise configuration des priorités peut entraîner l'éviction inattendue de charges de travail critiques ou la privation de ressources pour des charges moins importantes. Cet article propose une exploration approfondie des concepts avancés de la classe de priorité, avec des conseils pratiques destinés aux développeurs, consultants DevOps et équipes techniques de startups. Nous couvrirons le fonctionnement interne, l'architecture, la configuration, la vérification, les modes de défaillance et la récupération, avec des commandes et des exemples concrets. Vous apprendrez à observer avant de modifier, à limiter le rayon d'impact, à vérifier les résultats et à documenter les procédures de récupération. ## Inventaire de l'environnement et des versions Avant de travailler avec les classes de priorité, établissez une vision claire de votre environnement de cluster. Vérifiez la version de Kubernetes et assurez-vous de disposer des autorisations nécessaires. Les classes de priorité sont des ressources à l'échelle du cluster, vous aurez donc besoin de droits d'administrateur de cluster (cluster-admin) ou équivalents pour les créer ou les modifier. Vérifiez la version de votre cluster : kubectl version --short Le résultat attendu inclut les versions client et serveur, par exemple : Client Version: v1.27.3 Server Version: v1.27.3 La classe de priorité est disponible depuis Kubernetes 1.11 et stable depuis la version 1.14. Vérifiez que la ressource API existe : kubectl api-resources | grep priorityclass Le résultat doit afficher : priorityclasses pc scheduling.k8s.io/v1 false PriorityClass Pour une observation en lecture seule, listez les classes de priorité existantes : kubectl get priorityclass Exemple de résultat : NAME VALUE GLOBAL-DEFAULT AGE system-cluster-critical 2000000000 false 30d system-node-critical 2000001000 false 30d default 0 false 30d high-priority 1000 false 2d Notez que la classe default avec la valeur 0 est appliquée aux pods sans priorityClassName si elle est définie comme valeur globale par défaut (Kubernetes ne crée pas de classe de priorité par défaut automatiquement ; vous devez la créer). Procédez par petits changements : commencez par créer une classe de priorité de test avec une valeur modeste, appliquez-la à un pod de test et observez le comportement de l'ordonnancement avant de modifier les charges de travail en production.
## Chemin de configuration sécurisé La classe de priorité est définie par un simple manifeste YAML. Voici un exemple de classe de priorité moyenne : apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: medium-priority value: 1000 globalDefault: false description: "Priorité moyenne pour les charges de travail standard" Appliquez-la : kubectl apply -f medium-priority.yaml Résultat attendu : priorityclass.scheduling.k8s.io/medium-priority created Champs clés : - value : un entier de 1 à 1 000 000 000. Plus la valeur est élevée, plus la priorité est haute. Les valeurs supérieures à 1 000 000 000 sont réservées aux composants critiques du système. - globalDefault : si vrai, cette classe de priorité est utilisée pour les pods qui ne spécifient pas de priorityClassName . Une seule classe de priorité peut avoir ce champ à vrai. - description : explication optionnelle lisible par l'humain. Une fois la classe de priorité créée, assignez-la à un pod : apiVersion: v1 kind: Pod metadata: name: test-priority-pod spec: containers: - name: nginx image: nginx priorityClassName: medium-priority Déployez et observez : kubectl apply -f test-priority-pod.yaml kubectl get pod test-priority-pod -o yaml | grep -A2 priority Le résultat attendu inclut : priority: 1000 priorityClassName: medium-priority La préemption se produit lorsqu'un pod de haute priorité ne peut pas être planifié en raison de contraintes de ressources et que le planificateur évince des pods de priorité inférieure. Cela peut entraîner des perturbations si des pods critiques se voient attribuer des priorités inférieures. Testez toujours d'abord dans un espace de noms non destiné à la production. ## Vérification et diagnostic Après avoir appliqué une classe de priorité et l'avoir assignée à des pods, vérifiez que le planificateur respecte la priorité. Utilisez kubectl describe pour inspecter les événements du pod et les décisions d'ordonnancement. Créez deux classes de priorité : high-priority (valeur 10000) et low-priority (valeur 100). Déployez des pods avec chacune d'elles, puis créez intentionnellement une pression sur les ressources. Par exemple, utilisez un pod gourmand en ressources avec une priorité élevée et observez si les pods de priorité inférieure sont évincés. Tout d'abord, listez les pods avec leurs priorités : kubectl get pods -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priority,CLASS:.spec.priorityClassName,STATUS:.status.phase,NODE:.spec.nodeName Exemple de résultat : NAME PRIORITY CLASS STATUS NODE critical-app 10000 high-priority Running node-1 batch-job 100 low-priority Pending Si le pod de haute priorité est en attente en raison de ressources insuffisantes, le planificateur peut évincer des pods de priorité inférieure. Vérifiez les événements : kubectl describe pod critical-app | tail -20 Recherchez des messages tels que : Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 3s default-scheduler 0/3 nodes are available: 1 Insufficient cpu, 2 Insufficient memory. Normal Preempted 2s default-scheduler Preempted pod batch-job to make room for critical-app L'événement Preempted indique une préemption réussie. Notez que la préemption ne se produit que si la priorité du pod en attente est supérieure à celle des pods en cours d'exécution et que les pods évincés ont une priorité inférieure et ne sont pas protégés par un PodDisruptionBudget ou d'autres contraintes. Diagnostiquez les problèmes de priorité : si un pod de haute priorité reste en attente, assurez-vous que la classe de priorité existe et que le priorityClassName du pod correspond. Utilisez kubectl get priorityclass pour confirmer. ## Modes de défaillance et récupération Les modes de défaillance courants incluent : - Classe de priorité manquante : la spécification du pod fait référence à une classe de priorité inexistante. Le pod échouera à l'admission avec une erreur similaire à : Error from server (NotFound): priorityclasses.scheduling.k8s.io "high-priority" not found Récupération : créez la classe de priorité ou corrigez la spécification du pod. - Valeur invalide : la valeur de la classe de priorité est en dehors de la plage autorisée ou n'est pas un entier. Le serveur d'API la rejette : The PriorityClass "invalid-pc" is invalid: value: Invalid value: 0: must be greater than 0 Récupération : corrigez la valeur et réappliquez. - Conflit de valeur par défaut globale : tenter de définir globalDefault: true sur plus d'une classe de priorité entraîne une erreur. Le serveur d'API garantit qu'une seule valeur par défaut globale existe. - Préemption inattendue : si des pods critiques sont évincés parce qu'ils ont une priorité trop basse, augmentez la valeur de leur classe de priorité ou attribuez-leur une classe de priorité supérieure. Inversement, si des charges de travail de faible priorité sont privées de ressources, envisagez de réduire la priorité du pod préempteur ou d'utiliser des quotas de ressources pour limiter le nombre de pods de haute priorité. - Pod bloqué en attente : même avec une priorité élevée, un pod peut ne pas être planifié si les ressources des nœuds sont complètement épuisées et que la préemption est désactivée (par exemple, lorsque les pods ont preemptionPolicy: Never ). Vérifiez la politique de préemption du pod : kubectl get pod