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 Red Hat OpenShift. Le contrôleur Red Hat OpenShift tient compte de la priorité d'un pod et peut même préempter (retirer) des pods dont la priorité est plus faible pour libérer de la place sur un noeud worker pour des pods de priorité plus élevée. Pour plus d'informations, voir la documentation de Red Hat OpenShift.

Pourquoi dois-je définir la priorité d'un 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 contrôleur Red Hat OpenShift pour privilégier les pods avec une priorité plus élevée par rapport aux pods avec une priorité plus faible. Le contrôleur Red Hat OpenShift peut même préempter (retirer) les pods de priorité plus faible en cours d'exécution 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 d'avoir configuré l'accès utilisateur approprié pour votre cluster, et, le cas échéant, des contraintes de contexte de sécurité (SCC). Les règles d'accès et les contraintes SCC 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 planification 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. Si vos nœuds de travail ne disposent plus de ressources suffisantes, le contrôleur « Red Hat OpenShift » peut préempter (supprimer) des pods afin de libérer suffisamment de ressources pour permettre la planification des pods ayant une priorité plus élevée. 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 n'avez pas de classe de priorité globalDefault, la priorité par défaut pour tous les pods est zéro (0). Par défaut, Red Hat OpenShift on IBM Cloud n'est pas défini sur 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 contrôleur Red Hat OpenShift, 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 de priorité des pods.
Scénarios de priorité des pods

  1. Trois pods avec une priorité élevée, moyenne et faible sont en attente de planification. Le contrôleur Red Hat OpenShift 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 contrôleur Red Hat OpenShift trouve un noeud worker disponible mais ce noeud a juste assez de ressources pour prendre en charge les pods de priorité élevée et 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 contrôleur Red Hat OpenShift préempte, ou retire, le pod de faible priorité, qui repasse alors à l'état En attente. Ensuite, le contrôleur Red Hat OpenShift tente de planifier le pod à priorité élevée. Cependant, le noeud worker ne dispose pas de ressources suffisantes pour planifier le pod de priorité élevée et le contrôleur Red Hat OpenShift planifie à la place le pod avec une priorité moyenne.

Pour plus d'informations, consultez la documentation d' Kubernetes concernant Priorité et préemption des pods.

Puis-je désactiver le contrôleur d'admission prioritaire 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.

Description des classes de priorité par défaut

Vos clusters Red Hat® OpenShift® on IBM Cloud® 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 Sélectionnez cette classe de priorité pour les pods déployés dans les espaces de noms système privilégiés lors de la création du cluster, afin de protéger les fonctionnalités critiques des nœuds de travail, telles que les pods liés à la mise en réseau, au stockage, à la journalisation, à la surveillance et aux métriques.
system-cluster-critical Kubernetes 2000000000 Sélectionnez cette classe de priorité pour les pods déployés dans les espaces de noms système privilégiés lors de la création du cluster, afin de protéger les fonctionnalités critiques de celui-ci, telles que les pods liés à la mise en réseau, au stockage, à la journalisation, à la surveillance et aux métriques.
ibm-app-cluster-critical IBM 900000000 Les pods 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 de l'équilibreur de charge.

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

oc 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.

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

    oc 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, la valeur Classes de priorité critique de cluster par défaut de la valeur de 900000000-2000001000, entrez une valeur inférieure à ces nombres pour les nouvelles classes de priorité, de sorte que rien n'est priorisés plus haut 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 oc 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.

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

    oc 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 Red Hat OpenShift on IBM Cloud.

Avant de commencer :

Suivez les étapes ci-dessous pour évaluer l'importance des autres pods déployés, afin de pouvoir choisir la classe de priorité appropriée pour vos pods en fonction de ce qui est déjà déployé.

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

    oc 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.

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

    oc 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.

    oc apply -f filepath/pod-deployment.yaml