web-dev-qa-db-fra.com

Google Kubettes Moteur Node Pool n'est pas automatique de 0 nœuds

J'essaie d'organiser un travail d'apprentissage de la machine sur GKE et j'ai besoin d'utiliser un GPU.

J'ai créé une piscine de nœud avec Tesla K80, comme décrit dans cette procédure .

J'ai défini la taille minimale du nœud sur 0 et espérait que l'autoscaler déterminerait automatiquement le nombre de nœuds dont j'avais besoin basé sur mes emplois:

gcloud container node-pools create [POOL_NAME] \
--accelerator type=nvidia-tesla-k80,count=1 --zone [COMPUTE_ZONE] \
--cluster [CLUSTER_NAME] --num-nodes 3 --min-nodes 0 --max-nodes 5 \
--enable-autoscaling

Initialement, il n'existe aucun travail qui nécessite des GPU, de sorte que l'autoscaler de la grappe abresse correctement le pool de nœuds à 0.

Cependant, lorsque je crée un emploi avec les spécifications suivantes

resources:
  requests:
    nvidia.com/gpu: "1"
  limits:
    nvidia.com/gpu: "1"

Voici la configuration complète du travail . (Veuillez noter que cette configuration est partiellement générée automatiquement. J'ai également supprimé certaines variables d'environnement qui ne sont pas pertinentes pour la question).

le pod est coincé en attente avec Insufficient nvidia.com/gpu Jusqu'à ce que j'augmente manuellement le pool de nœuds à au moins 1 noeud.

Est-ce une limitation actuelle des pools de nœud GPU, ou ai-je oublié quelque chose?

7
notnami

L'autoscaler prend en charge la scalification des nœuds GPU (y compris de 0).

Une raison éventuelle de ce problème est que si vous avez activé Node provisioning auto-approvisionnement et définissez des limites de réson (via UI ou des drapeaux GCloud tels que --max-CPU, max-mémoire, etc.). Ceux-ci Les limites s'appliquent à tous les autochtones dans le cluster, y compris les nœudsPools que vous avez créés manuellement avec l'autosaling activé (voir la note dans la documentation: https://cloud.google.com/kubernettes-Engine/docs/how-to/node-auto -Provision # ressources_limites ).

En particulier, si vous avez activé NAP et que vous souhaitez que vous souhaitez définir des limites de récupération pour les GPU comme décrit dans https://cloud.google.com/kubernettes -Angine/Docs/How-to/Node-Auto-provisioning # GPU_LIMITS .

Enfin, l'autoprovisionnement prend également en charge les GPU. (Supposant que vous définissez les limites de ressources telles que décrites ci-dessus), vous n'avez pas besoin de créer NODEPOOL pour votre charge de travail GPU - NAP Créer une pour vous automatiquement.

====

Aussi, pour référence future - Si l'AutoSompaler omet de créer des nœuds pour certains de vos gousses, vous pouvez essayer de le déboguer à l'aide d'événements Autoscaler:

  • Sur votre pod (kubectl describe pod <your-pod>) Il devrait y avoir l'un des 2 événements (cela peut prendre une minute jusqu'à ce qu'ils se présentent):
    • TriggeredscaleUp - Cela signifie que l'autoscaler a décidé d'ajouter un nœud pour cette gousse.
    • NotTriggersCAleUp - AutoStoscaleur a repéré votre pod, mais cela ne pense pas qu'aucun andépool puisse être intensifié pour l'aider. En 1.12 et plus tard, l'événement contient une liste de raisons pour lesquelles l'ajout de nœuds à différents NODEPOOLS n'aiderait pas la gousse. C'est généralement l'événement le plus utile de débogage.
  • kubectl get events -n kube-system | grep cluster-autoscaler vous donnera des événements décrivant toutes les actions de l'autoscaleur (échelle, échelle). Si une échelle a été tentée, mais échoué pour une raison quelconque, il aura également des événements décrivant cela.

Notez que les événements ne sont disponibles que dans Kubettes pendant 1 heure après leur création. Vous pouvez voir des événements historiques à StackDriver en allant à l'interface utilisateur et à naviguer sur StackDriver-> Logging-> Bûches et choisissez "Opérations de groupe GKE" dans la liste déroulante.

Enfin, vous pouvez vérifier l'état actuel de l'autoscaler en exécutant kubectl get configmap cluster-autoscaler-status -o yaml -n kube-system.

4
Maciek Pytel