2017-09-11 4 views
0

Le titre de la question est le problème spécifique que j'essaie de résoudre. Mais encore plus simplement, est-il possible de lister toutes les tâches d'un service avec les adresses IP des nœuds qui les exécutent?Dans un Docker Swarm, comment puis-je trouver quel nœud IP exécute une tâche donnée?

docker service ps liste les ID de tâche avec le nom d'hôte du noeud sur lequel s'exécute la tâche. Aucun autre identificateur de noeud n'est fourni tel que ID ou IP. Mais j'utilise Vagrant pour gérer les machines virtuelles et sans nom d'hôte configuré, tous les noms d'hôte sont nommés de la même façon ("vagabond"). Cela rend très difficile pour moi de comprendre exactement quel nœud exécute la tâche!

Ceci est important parce que je dois manually delete unused images ou risquer de faire planter les machines à l'avenir quand il n'y a plus d'espace disque. Donc, déterminer où une tâche est exécutée est la première étape de ce processus lol.

Pour vous les utilisateurs vagabonds, j'ai changé mon nom d'hôte assez facilement dans le fichier Vagrant en utilisant l'option config.vm.hostname. Mais bien sûr, la question est encore totalement légitime.

je peux exécuter manuellement docker images ou docker ps sur chaque noeud pour déterminer quel magasin de noeud de l'image attendue et/ou est actuellement en cours d'exécution qui conteneur (le nom du conteneur serait une concaténation de l'identificateur de tâche et le nom de la tâche, séparés par un point). Mais c'est lourd.

Je pourrais également lister tous les nœuds avec leurs ID en utilisant docker node ls et ensuite chasser la tâche pour chaque nœud, par exemple en utilisant docker node ps 7b ("7b" est les deux premières lettres dans un de mes ID de nœud). Mais c'est trop lourd et au mieux, je vais "seulement" apprendre l'ID du nœud et non l'IP. Mais, je peux trouver l'adresse IP en utilisant un ID de nœud avec une commande comme ceci: docker inspect 7b --format '{{.Status.Addr}}'. Obtenir directement l'adresse IP n'est donc pas une exigence stricte et pour un moment - quand j'ai compris cela - je pensais que trouver un identifiant de nœud pour un ID de tâche donné serait beaucoup plus facile!

Mais non. Même cela semble être impossible? Comme indiqué précédemment, docker service ps ne me donne pas l'ID de nœud. Le docs pour la commande dit que l'espace réservé .Name devrait me donner le "Node ID" mais c'est faux.

Jusqu'à ce moment, je dois avoir essayé un milliard de hacks différents.

Une chose en particulier que je trouve inquiétant est que la docs pour la commande docker node ps indique expressément qu'il peut être utilisé pour « tâches de la liste en cours d'exécution sur un ou plusieurs noeuds » (mettre l'accent sur le mien). Mais si je fais ceci: docker node ps vagrant Je reçois un message d'erreur que le nom d'hôte est ambigu car il résout à plus d'un nœud! lol n'est pas si drôle (même sans utiliser les noms d'hôte, je n'ai pas eu cette commande pour travailler sur la liste des tâches sur plusieurs nœuds). Pas que cela ait de l'importance, car docker node ps tout comme docker service ps ne produit même pas d'ID de noeud et les docs pour ces deux commandes reposent sur le fait de pouvoir le faire.

Donc là vous l'avez. Je me demande s'il y a quelque chose en face de moi qui me manque ou si le monde entier se fie à des noms d'hôtes uniques? C'est comme si je devais manquer quelque chose d'évident. Sûrement ce produit si populaire Docker doit être en mesure de fournir un moyen de trouver un ID de nœud ou IP de nœud donné un ID de tâche? hmm.

Je suis sous Docker version 17.06.2.

Répondre

2

Littéralement cinq minutes après que j'ai posté ma question, je parviens à obtenir une traction lol.

Cela me donne l'ID de nœud , donné une < tâche ID>:

docker inspect <task ID> --format '{{.NodeID}}' 

Utilisez le ID de nœud pour obtenir l'adresse IP du nœud :

docker inspect <node ID> --format '{{.Status.Addr}}' 

Ou, tout en une ligne comprimée:

docker inspect -f '{{.Status.Addr}}' $(docker inspect -f '{{.NodeID}}' <task ID>) 

En prime, si vous voulez l'adresse MAC:

docker inspect -f '{{.NetworkSettings.Networks.ingress.MacAddress}}' $(docker inspect -f '{{.Status.ContainerStatus.ContainerID}}' <task ID>) 

Je ne marque pas cette réponse acceptée, du moins pas pour le moment, car il est laid comme l'enfer. Sûrement il doit y avoir un autre moyen plus direct!