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 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 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 d'avoir configuré correctement les droits d'accès des utilisateurs à votre cluster et, le cas échéant, les 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 planification par priorité 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 vous ne disposez pas de ressources suffisantes sur vos nœuds de travail, le planificateur d' Kubernetes s 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 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 de priorité des
- 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.
- 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.
- 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, consultez la documentation d' Kubernetes concernant la priorité des pods et la préemption.
- Puis-je désactiver le contrôleur d'admission par priorité des pods?
- Non. Si vous ne souhaitez pas utiliser la priorité pod, ne définissez pas
globalDefaultou 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 influencent-ils la priorité des pods?
- Vous pouvez utiliser la priorité des pods en combinaison avec les quotas de ressources, y compris les portées de quota. 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.
| Nom | Définie par | Valeur de priorité | Objectif |
|---|---|---|---|
system-node-critical |
Kubernetes | 2000001000 | Sélectionnez les pods déployés dans des espaces de noms système privilégiés lors de la création du cluster et utilisez 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étriques. |
system-cluster-critical |
Kubernetes | 2000000000 | Sélectionnez les pods déployés dans des espaces de noms système privilégiés lors de la création du cluster et utilisez cette classe de priorité pour protéger les fonctionnalités critiques des clusters, telles que les pods de mise en réseau, de stockage, de journalisation, de surveillance et de métriques. |
ibm-app-cluster-critical |
IBM | 900000000 | Sélectionnez les pods déployés dans des espaces de noms système privilégiés lors de la création du cluster et utilisez cette classe de priorité pour protéger les fonctionnalités critiques des applications, telles que les pods de répartition 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 :
- Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
- Assurez-vous de disposer du rôle d'accès au service IAM Writer ou Manager IBM Cloud pour l'espace de noms
default.
-
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 -
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 -
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 nameObligatoire : nom de la classe de priorité que vous souhaitez créer. valueObligatoire : 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.
globalDefaultFacultatif : définissez cette zone sur truepour faire en sorte que cette classe de priorité soit la valeur par défaut globale appliquée à tous les pods planifiés sans valeurpriorityClassName. 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 sanspriorityClassNamespé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éfiniglobalDefaulten exécutantkubectl describe priorityclass <name>.descriptionFacultatif : informez les utilisateurs de la fonction de cette classe de priorité. Mettez cette chaîne entre guillemets ( ""). -
Créez la classe de priorité dans votre cluster.
kubectl apply -f filepath/priorityclass.yaml -
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 :
- Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
- Assurez-vous de disposer du rôle d'accès au service IAM Writer ou Manager IBM Cloud dans l'espace de noms dans lequel vous souhaitez déployer les pods.
- Familiarisez-vous avec le fonctionnement de la planification des priorités, car la priorité peut préempter des pods existants et affecter le mode de consommation des ressources de votre cluster.
Suivez les étapes suivantes pour vérifier 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é.
-
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 -
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> -
Obtenez la classe de priorité que vous désirez utiliser ou créez votre propre classe de priorité.
kubectl get priorityclasses -
Dans votre spécification de pod, ajoutez la zone
priorityClassNameavec 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> -
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