IBM Cloud Docs
Définition d'une priorité de pod

Définition d'une priorité de pod

Avec la priorité et la préemption des pods, vous pouvez configurer des classes de priorité pour indiquer la priorité relative des pods qui constituent la charge de travail de votre cluster Kubernetes. Le planificateur de Kubernetes tient compte de la priorité d'un pod et peut même préempter (retirer) des pods dont la priorité est faible pour faire de la place sur un noeud worker aux pods avec une priorité plus élevée.

Pourquoi donner la priorité au pod?
En tant qu'administrateur de cluster, vous souhaitez contrôler les pods essentiels à la charge de travail de votre cluster. Les classes de priorité peuvent vous aider à contrôler les décisions du planificateur de Kubernetes pour privilégier les pods avec une priorité élevée par rapport aux pods avec une priorité plus faible. Le planificateur de Kubernetes peut même préempter (retirer) les pods en cours d'exécution avec une priorité plus faible de sorte que les pods en attente dont la priorité est plus élevée puissent être planifiés.

En définissant la priorité des pods, vous pouvez empêcher des charges de travail avec une priorité plus faible d'impacter des charges de travail essentielles dans votre cluster, notamment dans les cas où le cluster commence à atteindre la limite de capacité de ses ressources.

Assurez-vous que vous avez mis en place un accès utilisateur approprié à votre cluster et, le cas échéant, des politiques de sécurité des pods (PSP). Les règles d'accès et les PSP permettent d'éviter que des utilisateurs non fiables déploient des pods de priorité élevée empêchant la planification d'autres pods.

Comment fonctionnent la programmation prioritaire et la préemption?

En général, les pods en attente ayant une priorité plus élevée sont planifiés avant les pods avec une priorité plus faible. S'il ne reste pas suffisamment de ressources dans les nœuds de travail, le planificateur Kubernetes peut préempter (supprimer) des pods afin de libérer suffisamment de ressources pour que les pods les plus prioritaires puissent être planifiés. La préemption est également affectée par les périodes d'arrêt approprié, les objets pod disruption budget et l'affinité des noeuds worker.

Si vous ne spécifiez pas de priorité pour votre déploiement de pod, la classe de priorité globalDefault est utilisée par défaut. Si vous ne disposez pas de classe de priorité globalDefault, la priorité par défaut de tous les pods est zéro (0). Par défaut, IBM Cloud Kubernetes Service ne définit pas de globalDefault. Par conséquent, la priorité par défaut de pod est zéro.

Pour comprendre comment s'articule la priorité des pods avec le planificateur de Kubernetes, considérez les scénarios illustrés dans la figure suivante. Vous devez placer les pods dont la priorité est définie sur des noeuds worker avec des ressources disponibles. Autrement, les pods de priorité élevée dans votre cluster peuvent rester en attente, alors que des pods existants sont retirés au même moment, comme dans le scénario 3.

Scénarios prioritaires pour les pods.
Scénarios prioritaires pour les pods

  1. Trois pods avec une priorité élevée, moyenne et faible sont en attente de planification. Le planificateur de Kubernetes trouve un noeud worker disponible disposant d'assez d'espace pour les trois pods et planifie ces pods par ordre de priorité, en planifiant en premier le pod dont la priorité est la plus élevée.
  2. Trois pods avec une priorité élevée, moyenne et faible sont en attente de planification. Le planificateur de Kubernetes trouve un noeud worker disponible mais ce noeud n'a pas assez de ressources pour prendre en charge les pods avec une priorité élevée ou moyenne. Le pod de priorité faible n'est pas planifié et reste en attente.
  3. Deux pods avec une priorité élevée et moyenne sont en attente de planification. Il existe déjà un troisième pod avec une priorité faible sur un noeud worker disponible. Cependant, le noeud worker ne dispose pas de ressources suffisantes pour planifier les pods en attente. Le planificateur de Kubernetes préempte, ou retire, le pod de faible priorité, qui repasse alors à l'état en attente. Ensuite, le planificateur de Kubernetes tente de planifier le pod avec une priorité élevée. Cependant, le noeud worker ne dispose pas de ressources suffisantes pour planifier le pod de priorité élevée et le planificateur de Kubernetes planifie à la place le pod avec une priorité moyenne.

Pour plus d'informations, voir la documentation de Kubernetes sur la priorité et la préemption des pods.

Puis-je désactiver le contrôleur d'admission des priorités des pods?
Non. Si vous ne souhaitez pas utiliser la priorité pod, ne définissez pas globalDefault ou incluez une classe de priorité dans vos déploiements de pod. Tous les pods prennent la valeur zéro, sauf les pods essentiels pour le cluster qu'IBM déploie avec les classes de priorité par défaut. Comme la priorité des pods est relative, cette configuration de base garantit que les pods essentiels pour le cluster sont prioritaires pour les ressources et planifie tous les autres pods en suivant les règles de planification existantes en vigueur.
Comment les quotas de ressources affectent-ils la priorité des pods?
Vous pouvez utiliser la priorité des pods en combinaison avec les quotas de ressources, y compris les champs d'application des quotas. Avec les portées de quotas, vous pouvez configurer vos quotas de ressources en fonction de la priorité des pods. Ainsi, les pods de priorité plus élevée consomment des ressources système limitées par le quota de ressources avant les pods de priorité plus faible.

Description des classes de priorité par défaut

Vos clusters IBM Cloud® Kubernetes Service sont fournis avec des classes de priorité par défaut.

Ne modifiez pas les classes par défaut qui sont utilisées pour gérer correctement votre cluster. Vous pouvez utiliser ces classes dans les déploiements de vos applications ou créer vos propres classes de priorité.

Le tableau suivant présente les classes de priorité fournies par défaut dans votre cluster et indique pourquoi elles sont utilisées.

Classes de priorité par défaut que vous ne devez pas modifier
Nom Définie par Valeur de priorité Objectif
system-node-critical Kubernetes 2000001000 Les pods de sélection déployés dans des espaces de noms privilégiés lors de la création du cluster utilisent cette classe de priorité pour protéger les fonctionnalités critiques des nœuds de travail, telles que les pods de mise en réseau, de stockage, de journalisation, de surveillance et de métrologie.
system-cluster-critical Kubernetes 2000000000 Les pods de sélection qui sont déployés dans des espaces de noms de systèmes privilégiés lors de la création du cluster utilisent cette classe de priorité pour protéger les fonctionnalités critiques des clusters, telles que les pods de réseau, de stockage, de journalisation, de surveillance et de métrologie.
ibm-app-cluster-critical IBM 900000000 Les pods sélectionnés qui sont déployés dans des espaces de noms système privilégiés lors de la création du cluster utilisent cette classe de priorité pour protéger les fonctionnalités critiques des applications, telles que les pods d'équilibreur de charge.

Vous pouvez vérifier les pods qui utilisent des classes de priorité en exécutant la commande suivante.

kubectl get pods --all-namespaces -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName

Création d'une classe de priorité

Pour définir la priorité d'un pod, vous devez utiliser une classe de priorité.

Avant de commencer :

  1. Répertoriez les classes de priorité existantes. Vous pouvez utiliser une classe de priorité existante comme modèle pour la nouvelle classe.

    kubectl get priorityclasses
    
  2. Sélectionnez la classe de priorité que vous voulez copier et créez un fichier YAML local.

    kubectl get priorityclass <priority_class> -o yaml > Downloads/priorityclass.yaml
    
  3. Créez un fichier YAML pour votre classe de priorité.

    apiVersion: scheduling.k8s.io/v1alpha1
    kind: PriorityClass
    metadata:
      name: <priority_class_name>
    value: <1000000>
    globalDefault: <false>
    description: "Use this class for XYZ service pods only."
    
    Description des composants du fichier YAML
    Composants Description
    name Obligatoire : nom de la classe de priorité que vous souhaitez créer.
    value Obligatoire : entrez un entier inférieur ou égal à 1 milliard (1000000000). Plus la valeur est élevée, plus la priorité est élevée. Les valeurs sont relatives aux valeurs des autres classes de priorité dans le cluster. Réservez des nombres très élevés pour les gousses critiques système que vous ne souhaitez pas préempter (supprimé).

    Par exemple, les classes de priorité par défaut essentielles pour le cluster sont comprises entre 900000000 et 2000001000, par conséquent, entrez une valeur inférieure à ces nombres pour les nouvelles classes de priorité, de sorte qu'aucun élément n'ait une priorité plus élevée que ces pods.

    globalDefault Facultatif : définissez cette zone sur true pour faire en sorte que cette classe de priorité soit la valeur par défaut globale appliquée à tous les pods planifiés sans valeur priorityClassName. Une seule classe de priorité dans votre cluster peut être définie avec cette valeur par défaut globale. S'il n'y a pas de valeur par défaut globale, les pods sans priorityClassName spécifiées ont une priorité de zéro (0).

    La classes de priorité par défaut n'est pas défini sur globalDefault. Si vous avez créé d'autres classes de priorité dans votre cluster, vous pouvez vérifier qu'elles n'ont pas défini globalDefault en exécutant kubectl describe priorityclass <name>.

    description Facultatif : informez les utilisateurs de la fonction de cette classe de priorité. Mettez cette chaîne entre guillemets ("").
  4. Créez la classe de priorité dans votre cluster.

    kubectl apply -f filepath/priorityclass.yaml
    
  5. Vérifiez que la classe de priorité a été créée.

    kubectl get priorityclasses
    

Parfait ! Vous avez créé une classe de priorité. Informez votre équipe de l'existence de cette classe de priorité en indiquant la classe de priorité qu'ils doivent utiliser pour leurs déploiements de pods, le cas échéant.

Affectation de priorité à vos pods

Affectez une classe de priorité à la spécification de votre pod pour définir la priorité du pod au sein de votre cluster IBM Cloud Kubernetes Service.

Avant de commencer :

Effectuez les étapes suivantes pour vérifier l'importance des autres pods déployés afin de choisir la classe de priorité correcte pour vos pods par rapport à ce qui est déjà déployé.

  1. Affichez les classes de priorité utilisées par les autres pods dans l'espace de noms.

    kubectl get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
    
  2. Obtenez les caractéristiques de la classe de priorité et notez le nombre correspondant à sa valeur. Les pods ayant les nombres les plus élevés sont prioritaires par rapport aux pods avec des nombres plus faibles. Répétez cette étape pour chaque classe de priorité que vous désirez passer en revue.

    kubectl describe priorityclass <priorityclass_name>
    
  3. Obtenez la classe de priorité que vous désirez utiliser ou créez votre propre classe de priorité.

    kubectl get priorityclasses
    
  4. Dans votre spécification de pod, ajoutez la zone priorityClassName avec le nom de la classe de priorité que vous avez obtenue à l'étape précédente.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ibmliberty
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ibmliberty
      template:
        metadata:
          labels:
            app: ibmliberty
        spec:
          containers:
          - name: ibmliberty
            image: icr.io/ibm/liberty:latest
            ports:
            - containerPort: 9080
          priorityClassName: <priorityclass_name>
    
  5. Créez vos pods hiérarchisés dans l'espace de noms où vous voulez les déployer.

    kubectl apply -f filepath/pod-deployment.yaml