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.
- 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, 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.
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 :
- Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
- Assurez-vous que vous avez le 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 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 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 sanspriorityClassName
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éfiniglobalDefault
en exécutantkubectl describe priorityclass <name>
.description
Facultatif : 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 que vous disposez 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.
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é.
-
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
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>
-
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