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?
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 :
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
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:
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: