web-dev-qa-db-fra.com

KubeTès - Comment déboguer sur la planification échouée "0 nœuds sont disponibles"

Je me trouve souvent en essayant de faire tourner une nouvelle gousse, seulement pour avoir une erreur disant à dire qu'aucun nœud n'est disponible. Quelque chose comme:

0/9 nodes are available: 1 node(s) had no available volume zone, 8 node(s) didn't match node selector.

Je suis toujours à perte quand je reçois ces messages. Comment suis-je censé déboguer ça?

3
aspyct

Au début, mon conseil est de jeter un coup d'œil à composant KubeNettes Scheduler :

Composant du maître qui regarde des gousses nouvellement créées qui n'ont aucun nœud attribué et sélectionne un nœud pour qu'ils s'exécutent. [-] Les facteurs pris en compte pour les décisions de planification incluent les exigences de ressources individuelles et collectives, des contraintes matérielles/logicielles/stratégies, affinité et les spécifications anti-affinité, la localité de données, les interférences de charge inter-workload et les délais.

Un planificateur regarde des gousses nouvellement créées qui n'ont n ° Node attribué. Pour chaque POD que le planificateur découvre, le planificateur devient responsable de la recherche du meilleur Node pour cela POD à courir pour chaque gousses nouvellement créées ou d'autres pods non programmés, Kube-Scheduler sélectionne un nœud optimal pour qu'ils puissent s'exécuter. Cependant, chaque conteneur dans les pods a des exigences différentes pour les ressources et que chaque POD a également des exigences différentes. Par conséquent, les nœuds existants. doivent être filtrés en fonction des exigences de planification spécifiques.

Selon la documentation:

Dans un cluster, les nœuds qui répondent aux exigences de planification d'une cosse sont appelés nœuds réalisables. Si aucun des nœuds ne convient, la pod reste non programmée jusqu'à ce que le planificateur puisse le placer.

kube-Scheduler sélectionne un nœud pour la POD dans une opération en 2 étapes. Standard Kube-Scheduler basé sur Politiques par défaut :

  • filtrage
  • Scoring

En examinant ces deux politiques, vous pouvez trouver plus d'informations sur lesquelles les décisions ont été prises. Par exemple:

for scoring at the stage CalculateAntiAffinityPriorityMap This policy helps implement pod anti-affinity.

Vous trouverez ci-dessous une critique rapide basée sur l'influence décisions de planificateur Kubettes

  • Nom du nœud : En ajoutant le nom d'hôte d'un nœud au paramètre .spec.Nodename de la définition de la POD, vous forcez ce code à exécuter sur ce nœud spécifique. Tout algorithme de sélection utilisé par le planificateur est ignoré. Cette méthode est la moins recommandée.
  • Sélecteur de nœud : En plaçant des étiquettes significatives sur vos nœuds, une POD peut utiliser le paramètre NodeLector pour spécifier une ou plusieurs cartes d'étiquettes à valeur de clés qui doivent exister sur Le nœud cible à être sélectionné pour exécuter ce pod. Cette approche est plus recommandée car elle ajoute beaucoup de flexibilité et établit une relation de nœud de nœud à couplage de manière lâche.
  • Node Affinité : Cette méthode ajoute encore plus de flexibilité lors du choix duquel le nœud doit être pris en compte pour la planification d'une nacelle particulière. Utilisation Node Affinité, une gousse peut être strictement nécessaire d'être programmée sur des nœuds avec des étiquettes spécifiques. Il peut également exprimer un certain degré de préférence à des nœuds particuliers en influençant le planificateur de leur donner plus de poids.
  • Affinité POD et Anti-affinité: lorsque la coexistence (ou la non-coexistence) avec d'autres pods du même noeud est essentielle, vous pouvez utiliser cette méthode. L'affinité de la pod permet à une nacelle d'exiger qu'elle soit déployée sur des nœuds contenant des gousses avec des étiquettes spécifiques. De même, une pod peut forcer le planificateur de ne pas le placer sur des nœuds ayant des gousses avec des étiquettes particulières.
  • Taintes et tolérations : Dans cette méthode, au lieu de décider des nœuds que la POD devient programmée, vous décidez quels nœuds ne doivent pas accepter de pods ou uniquement PODS sélectionnés. En teignant un nœud, vous demandez au planificateur de ne pas envisager ce nœud pour n'importe quel placement de gousses, sauf si la POD tolère la souillure. La tolérance consiste en une clé, une valeur et l'effet de la souillure. À l'aide d'un opérateur, vous pouvez décider si l'intégralité de la tentative doit correspondre à la tolérance d'un placement de POD réussi ou qu'un sous-ensemble de données doit correspondre.

Selon K8S Documentations :

1 . NODENAME est la forme la plus simple de la contrainte de sélection des nœuds, mais en raison de ses limitations, elle n'est généralement pas utilisée. Certaines des limitations d'utilisation de nodename pour sélectionner des nœuds sont:

  • Si le nœud nommé n'existe pas, la POD ne sera pas exécutée et, dans certains cas, être automatiquement supprimée.
  • Si le nœud nommé n'a pas les ressources nécessaires pour accueillir le POD, la POD échouera et sa raison indiquera pourquoi, par ex. OutofMemory ou Outofcpu. Node Les noms dans les environnements cloud ne sont pas toujours prévisibles ou stables.

2 . L'affinité Affinity/Anti-Affinity La fonction élargit considérablement les types de contraintes que vous pouvez exprimer. Les principales améliorations sont les suivantes: - La langue est plus expressif (non seulement "(non seulement" et de la correspondance exacte ") - Vous pouvez indiquer que la règle est" douce "/" préférence "plutôt qu'une condition difficile, donc si le planificateur ne peut pas satisfaire Il sera toujours programmé - vous pouvez contraindre à l'encontre des étiquettes sur d'autres pods en cours d'exécution sur le nœud (ou un autre domaine topologique), plutôt que contre des étiquettes sur le nœud lui-même, ce qui permet aux règles sur lesquelles les pods peuvent et ne peuvent pas être co-localisés.

La fonction d'affinité comprend deux types d'affinité, Affinité de nœud et Affinity Inter-Pod/Anti-affinité . Node Affinité est comme le nœuds existant (mais avec les deux premiers avantages énumérés ci-dessus),

Il existe actuellement deux types d'affinité de pod et anti-affinité, appelé requisDuringschedulingignoredDuringExecution et PreferredRingSchedulingignoreDuringExection qui désignent les exigences "durs" vs "mous".

J'espère que cette aide.

Ressources additionnelles:

2
Hanx