Déploiement d'instances node.js à la demande

a marqué ce sujet comme résolu.

Salut à tous,

J’ai besoin de déployer des instances node.js dynamiquement lors d’une demande émise par un utilisateur depuis mon application web et je me demandais quel était le moyen le plus simple de le faire. Je pensais dans un premier temps utiliser un service cloud tiers (du genre OVH et son public cloud ou AWS avec EC2) mais concrètement, via mon application, comment faire pour :

  • commander et lancer dynamiquement une nouvelle instance (ça je pense pouvoir le faire en utilisant leur API)
  • établir une connexion avec ce serveur (en SSH ou autre ? je ne sais pas exactement quel est le mieux ni comment faire concrètement)
  • installer node.js (je sais que ça se fait en ligne de commande mais comment ça se passe depuis une application externe ? en SSH également ? comment savoir quand l’installation est terminée pour exécuter d’autres commandes ?)
  • paramétrer node.js (comment faire pour éditer les fichiers app.js et package.json avec des informations envoyées par mon application web notamment ?)
  • établir une communication entre mon application web et node.js (après avoir installé, paramétré et lancé node.js, comment faire pour lui transférer des données ? via des requêtes HTTP ou toujours via SSH ?)

N’ayant pas beaucoup d’expérience en administration système et réseaux, connaissez-vous un tutoriel qui pourrait m’aider à y voir plus clair ?

Merci d’avance pour votre aide ! :)

Y’aurait bien des solutions "marton-pilon" à base de construction d’image Docker et de déploiement sur un orchestrateur de conteneur mais déjà ça va vraiment pas être simple à mettre en place et surtout j’ai l’impression qu’on pourrait avoir à faire à un X-Y problème.

Pourquoi tu veux faire ça ?

Sauf si tu es toi même fournisseur de service cloud, monter un node.js à la volée sur demande de l’utilisateur je vois pas bien le cas d’usage ?

(et si effectivement, tu te poses en fournisseur de service, genre hébergeur d’apps node.js ou de serveurs de jeu, etc. etc. à ce moment là oui, un orchestrateur te rendra d’immenses services)

+1 -0

Trop peu d’informations mais tu peux aussi structurer ton application node en fonction.

Tu peux avoir un master programme qui va exécuter des childprocess de ton application ; Ou si tu combines d’autres langages tu as toujours pm2 et changer le workfolder. Tu as beaucoup de possibilités.

paramétrer node.js (comment faire pour éditer les fichiers app.js et package.json avec des informations envoyées par mon application web notamment ?)

Je ne modifierais pas app.js ou package.json mais j’irais charger la config via un JSON via une requête POST en HTTPS à mon serveur (en utilisant une authentification). Et j’utiliserais le module node-convict pour pouvoir overload ma configuration par défaut par celle de mon application ! :)

+1 -0

Merci pour vos réponses les gars :)

et si effectivement, tu te poses en fournisseur de service, genre hébergeur d’apps node.js ou de serveurs de jeu, etc. etc. à ce moment là oui, un orchestrateur te rendra d’immenses services

Javier

C’est effectivement le cas. Je suis en train de développer un moteur de jeu et j’aimerais proposer un service d’hébergement cloud afin d’héberger les serveurs de jeu de mes utilisateurs.

Par "orchestrateur" tu entends serveur dédié avec un programme central qui gère les différentes instances ? Le problème c’est que ça m’oblige à gérer l’infrastructure (notamment la sécurité) et pour le scaling c’est plus compliqué…

Après si c’est vraiment la meilleure solution je dis pas non mais il faudrait que je me renseigne sur quoi exactement ?

Tu peux avoir un master programme qui va exécuter des childprocess de ton application ; Ou si tu combines d’autres langages tu as toujours pm2 et changer le workfolder. Tu as beaucoup de possibilités.

Ça pourrait fonctionner en effet mais le problème est que j’aurai besoin d’allouer des ressources très précises à mes utilisateurs. Je pense que le plus simple pour moi serait que j’utilise des instances cloud tiers et que je les configure une par une plutôt que de devoir gérer tout ça sur le même serveur.

Je ne modifierais pas app.js ou package.json mais j’irais charger la config via un JSON via une requête POST en HTTPS à mon serveur (en utilisant une authentification). Et j’utiliserais le module node-convict pour pouvoir overload ma configuration par défaut par celle de mon application ! :)

A-312

Merci beaucoup pour ton conseil sur ce point, ça m’aidera beaucoup !

Salut,

Je voudrais d’avertir d’un petit problème sur la réservation d’instances cloud.

Tous les fournisseurs ont des limites sur le nombre de nouvelles instances qu’il est possible de lancer sur une période donnée, et ce nombre peut être assez bas.

Par exemple, AWS Fargate semblerait intéressant pour ton besoin, mais on ne peut réserver que 50 nouvelles instances par jour.

Donc si tu veux lancer une instance pour chaque utilisateur, tu risques d’être coincé.

La solution serait de réserver moins instances mais plus grosses, et de caser plusieurs utilisateurs par instances, chacun dans un container docker.

J’ai en projet de lancer un service qui propose à chaque utilisateur un serveur jupyter pour l’apprentissage des frameworks de machine learning, et j’ai l’impression que les contraintes techniques sont les mêmes que les tiennes.

Je suis en train de faire des tests sur le cloud OVH, et sans être un expert, je pense que seul le couple Kubernetes + Docker permettra de faire grandir le service sans s’arracher les cheveux :D .

Ça me semble overkill une découpe comme tu veux faire (1 client = 1 VM) après je ne sais pas comment node s’en sort pour les gros serveurs.

J’ai vu ça et/ou tu peux créer d’autres contraintes que l’utilisation ram/cpu : Nombre d’utilisateurs/tâches.

+0 -0

Par "orchestrateur" tu entends serveur dédié avec un programme central qui gère les différentes instances ? Le problème c’est que ça m’oblige à gérer l’infrastructure (notamment la sécurité) et pour le scaling c’est plus compliqué…

C’est justement le rôle d’un orchestrateur.

Si vraiment ton besoin c’est de créer des instances de serveur à la volée, au besoin. On peut imaginer que ça soit "rentable" d’aller fouiller du côté de Docker / k8s.

Pour essayer de faire simple : avec Docker tu vas créer une image de ton serveur web. Une image, c’est la description d’un process, isolé, avec ce dont il a besoin pour fonctionner. Par exemple dans ton cas, l’image c’est un process node et ce dont il a besoin pour fonctionner c’est un système de fichier linux, avec node installé, et ton code quelque part.

L’image c’est la recette de cuisine en gros.

Une fois que tu as "instancié" ton image, tu obtiens un conteneur. Dans ce conteneur tu retrouves donc ton processus qui tourne, bien isolé, avec son système de fichier.

L’orchestrateur va se charger "d’instancier" ces conteneurs suivant contrat que tu auras défini, et les faire tourner sur un ensemble de machines virtuelles / physiques (instances EC2 si t’as choisi Amazon). C’est par exemple via l’orchestrateur que tu vas limiter les ressources allouées au conteneur (donc au process node), en lui disant qu’il n’a accès qu’à 0.5 CPU, et 128Mo de RAM par exemple.

Tu vas également lui dire comment gérer le réseau : faut-il que les utilisateurs en dehors de ton orchestrateur ait accès à ton conteneur (process) ? A quelle adresse ? Sur quel port ?

Tu vas aussi donner à l’orchestrateur un ensemble d’indices pour s’assurer que le conteneur tourne bien : comment peut-il le savoir ? En exécutant un shell dans le conteneur ? Ou plutôt en faisant une requête HTTP sur le port 80 ?

Bref, tu l’auras compris, ça a l’air de plutôt répondre à ce que tu nous décris de ton besoin, mais c’est (comme généralement tout ce qui touche aux architectures distribuées) très complexe (certains diront même que c’est TROP complexe pour ce que c’est, c’est pas entièrement faux).

Je te conseille d’aller dans cette voie soit si :

  • le sujet t’intéresse et tu souhaites te documenter avec un support concret
  • tu as besoin d’une qualité de service "industrielle", j’entends par là : c’est un sujet sur lequel tu envisages de travailler à plusieurs, de créer une activité commerciale autour de ça

Si ni l’un ni l’autre, à mon avis gères des instances Node.js en mode "sale" sur une seule instance EC2 par exemple, avec un reverse-proxy devant éventuellement.

Garde à l’esprit la solution envisagée ici pour le jour où ça deviendra vraiment trop galère à maintenir / industrialiser.


EDIT :

Ça me semble overkill une découpe comme tu veux faire (1 client = 1 VM)

Clairement! Surtout ne crée pas une VM par instance node, à moins que tu n’aies un trafic gigantesque à gérer et/ou une appli excessivement gourmande en CPU/RAM (mais à ce moment là, ça m’étonne que tu utilises node.js pour le faire).

Mais pour le coup je ne suis pas trop d’accord avec un routage "logiciel", il va se retrouver à recoder un reverse-proxy, et beaucoup d’autres composants, bref, réinventer la roue.

+1 -0

Pas besoin de tout recoder, il existe configurable-http-proxy, qui est utilisé dans les clusters jupyterhub pour justement faire le lien ente une url et un container.

Oui, ça veut dire que tu utilises des conteneurs, et pas une seule instance node qui fait du routage "logiciel" :)

Je répondais à la suggestion d’A-312 qui proposait d’avoir une seule instance node.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte