Docker, Nginx et déploiement

Le problème exposé dans ce sujet a été résolu.

Par contre, les offres comme GCP, AWS et autre nous font pas mal peur, car on ne maîtrise pas les coût, et il me semble que les prix peuvent monter en flèche en un claquement de doigt (surtout quand on à un nombre d’utilisateur très important).

FougereBle

Ça peut effectivement arriver si tu configures un autoscaling un peu violent ou des lambdas, mais quand tu bosses avec GKE, par exemple, ta facture est parfaitement détaillée et tu peux déterminer où la dépense a été trop forte, et ainsi t’adapter pour maîtriser les choses. Par exemple, faire tourner tes services majoritairement sur des machines préemptibles pas chères, sachant que kubernetes se débrouille pour que ton service ne soit pas interrompu quand une machine disparait, le temps qu’elle soit remplacée par une nouvelle… Ou encore, dé-commissionner 90% de ton cluster pour ne les provisionner, à chaud, que pendant les heures de pointe.

Je saurais pas trop te conseiller sur la maîtrise des coûts parce que je suis moi-même en plein apprentissage là-dessus. Ce que je sais c’est que GCP, notamment, a une campagne de soutien aux startups, et que tu peux bénéficier de 100K$ de crédits cloud gratuits à dépenser en un an1, ce qui te laisse une très grande marge de manœuvre pour apprendre à contrôler et optimiser ton cluster, justement pour maîtriser ta facture de cloud : si tu te plantes, c’est des crédits "gratuits" qui se retrouvent dépensés, et ça te laisse le temps de t’adapter. C’est ce genre de truc dont bénéficie ma boîte à l’heure actuelle, et ça peut s’accompagner de consulting pour qu’un expert audite ton archi et te conseille, sans débourser un rond.

Et même sans se diriger forcément vers GCP, il y a des tas de fournisseurs qui proposent du kubernetes en IaaS.


  1. Dans notre cas à nous, 100K$ ça dépasse très, très largement la consommation qu’on risque d’avoir en un an, c’est 10 fois plus que "confortable" comme marge.
+0 -0

Je voulais suivre le tuto sur Kubernetes.io et je suis bloqué à la première ligne. :(

J’ai installé Docker et Minikube sur mon Mac (un Mac M1, je sais pas si ça à son importance), et au lancement de la commande kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4 j’ai ça :

Capture d’écran 2021-04-17 à 19.22.54.png
Capture d’écran 2021-04-17 à 19.22.54.png

:(

+0 -0

un Mac M1, je sais pas si ça à son importance

Ah oui, ça joue grave : le mac M1 tourne sur une architecture arm64, qui est très récente et probablement pas prévue par l’image du conteneur de test que tu essayes de lancer, du coup tu risques d’avoir un peu de mal, et ça explique en tout cas que ton conteneur crashe en boucle au démarrage.

Une alternative serait d’utiliser un petit cluster gratos sur le net. Par exemple, okteto peut mettre un cluster à ta dispo (limité à un seul namespace et un seul pod qui ne peut pas tourner plus de 24h… mais ça suffit largement pour jouer et apprendre). Il suffit de t’y connecter avec ton compte github.

PS: Autre possibilité, avoir un cluster d’essai gratuit pendant 30 jours sur OpenShift (RedHat) : https://developers.redhat.com/developer-sandbox

Tu as aussi la possibilité de suivre gratuitement des cours interactifs (avec à chaque fois un petit cluster qui est mis à ta disposition pour chaque cours) sur katacoda.

Ou encore, similaire à okteto, peut-être moins limité tu as aussi Kubernauts avec une offre à 0$, qui n’a pas l’air spécialement limitée en dehors de "1CPU et 1Go de RAM". En tout cas suffisante pour expérimenter.

+0 -0

Salut !

J’ai l’impression que tu pars un peu rapidement vers Kubernetes. Mettre en production et gérer une infrastructure peut demander beaucoup de temps. C’est d’ailleurs souvent un emploi à temps plein. Si vous n’êtes que 4 développeurs, vous devez déjà avoir assez de travail j’imagine !

Je ne connais pas les contraintes de ton entreprise en terme de planning, de budget mais je crois que dans un premier temps vous feriez mieux de déléguer cette tâche à un SaaS. Les prix ne sont pas nécessairement plus élevés qu’un cluster Kubernetes équivalent chez AWS ou GCP en plus. Je pense notamment à Heroku, Dokku etc. Ces solutions conviennent dans 95% des cas (faites sur ces plateformes des tests de montées en charges…!).

Tout le temps gagné, vous le passerez à développer votre produit ! Et c’est les clients qui seront contents :D

Rien ne t’empêchera en parallèle de te former à Kubernetes. Tu pourras l’utiliser quand tu te sentiras prêt et si tu considèreras que cette technologie apporte une vraie plus value à votre produit. Mais au moins cela ne sera pas fait dans la précipitation !

Je te conseille le livre Kubernetes in Action de Marko Lukša qui est très accessible et contient de nombreux cas pratiques.

Alors ça c’est une réponse qui me plaît. ^^

Personellement, je ne connais pas les chiffres exactes de la charge prévue. Tout ce que je sais, c’est que la base actuelle fait plusieurs centaines de Go, et qu’on aura plusieurs milliers (dizaine ? Plus ? Je sais pas) de visite (chaque jour ? Chaque mois ? Là encore, pas plus d’info).

Mais ce que je sais, c’est que ce sera assez important… ce qui me fait penser que c’est compliqué de mettre en place une architecture quand on à pas plus d’info que ça. ^^

J’avais déjà utilisé Heroku par le passé, pour des App Ruby. Ça marche vraiment bien, ça je sais. Mais je l’avais utilisé uniquement pour des petites applications jouet. Ça peut supporter quoi comme charge ça ?

Edit : Par contre Heroku ça pique un peu. J’arrive à 900$/m avec leur calculateur. Leurs base de données Postgres coûte un bras.

+0 -0

C’est d’ailleurs souvent un emploi à temps plein. Si vous n’êtes que 4 développeurs, vous devez déjà avoir assez de travail j’imagine !

Ceci entre en contradiction directe avec ma propre expérience quotidienne depuis plus d’un an. Tu es sûr que tu ne confonds pas utiliser Kubernetes en IaaS avec maintenir son propre cluster sur son infrastructure privée ? Dans ce cas je comprendrais beaucoup mieux ta remarque.

Autrement, je ne doute pas qu’Heroku puisse faire le job. C’est juste que si c’est pour commencer avec du PaaS pour ne pas se prendre la tête (ce qui est parfaitement compréhensible), il existe aussi des choses comme porter, pour faire "comme Heroku, sans s’enfermer chez Heroku" (parce qu’Heroku, à une certaine échelle, ça coûte quand même une blinde), et qui ont le mérite de rendre trivial le passage à du k8s pur puisque ça tourne dedans dès le départ, tout en restant compatible avec sa stack "standard" (helm et kubectl).

Edit: je viens de faire le test en connectant Porter à un de mes clusters du boulot, ça m’a affiché mes déploiements avec mes packages helm custom sous forme de graphes, leur historique de déploiement, mes workloads avec leurs logs, etc. Donc c’est vraiment compatible avec du "vrai" kubernetes. Si j’avais su que ça existait il y a un an, je crois que je l’aurais utilisé pour me rassurer au début, et je pense que je vais le garder pour que mon CTO (qui ne maîtrise pas k8s) puisse jouer avec.

+1 -0

J’ai l’impression que tu pars un peu rapidement vers Kubernetes. Mettre en production et gérer une infrastructure peut demander beaucoup de temps. C’est d’ailleurs souvent un emploi à temps plein. Si vous n’êtes que 4 développeurs, vous devez déjà avoir assez de travail j’imagine !

Nostalgique

Tout à fait d’accord avec toi - appliquer une solution sans raison technique apparente est totalement contre-productif.

En revanche, on peut aussi apprendre chez soi pour monter en compétences et le proposer à ses collaborateurs une fois un palier de connaissances acquis. Typiquement monter son site internet ou une application que l’on a développé, c’est le genre de chose passionnante à réaliser. Enfin je trouve :p

@FougereBle je viens de tomber sur un tuto super simple pour commencer un petit environnement Kubernetes : https://ubuntu.com/tutorials/install-a-local-kubernetes-with-microk8s#1-overview.

Tout à fait d’accord avec toi - appliquer une solution sans raison technique apparente est totalement contre-productif.

Ah oui là-dessus on est tous d’accord. Il ne faut pas se jeter sur le premier truc qui remonte. Et c’est pour ça que je plussoie ceci :

En revanche, on peut aussi apprendre chez soi pour monter en compétences et le proposer à ses collaborateurs une fois un palier de connaissances acquis. Typiquement monter son site internet ou une application que l’on a développé, c’est le genre de chose passionnante à réaliser. Enfin je trouve :p

Que ce soit pour élargir ses horizons à titre individuel ou en vue d’alimenter une discussion plus générale pour un choix dans une entreprise, c’est une excellente chose à faire. C’est même "la" chose à faire.

Le mouvement Software Craftsmanship donne un nom à ce pattern : c’est un Breakable Toy.

À titre personnel, j’applique régulièrement ce pattern. En ce moment, c’est en essayant de développer une UI en Flutter qui rendra service à mes collègues pour interagir avec un composant assez velu de mon infra : de mon côté j’apprends à faire des UI avec Flutter, et je le fais pour apporter de la valeur immédiate à mes collègues. Si ça échoue, tant pis on aura toujours gagné une expérience.

+0 -0

J’avais déjà utilisé Heroku par le passé, pour des App Ruby. Ça marche vraiment bien, ça je sais. Mais je l’avais utilisé uniquement pour des petites applications jouet. Ça peut supporter quoi comme charge ça ?

FougereBle

Malheureusement il n’y a pas de réponse générique pour ce type de question. Cela dépend de tellement de paramètres. Il faut calculer les ressources que consomment N visiteurs sur ton produit.
Je suis persuadé que Heroku pourra supporter vos demandes… la question c’est à quel prix ?

Edit : Par contre Heroku ça pique un peu. J’arrive à 900$/m avec leur calculateur. Leurs base de données Postgres coûte un bras.

FougereBle

Ouais comme tu le soulignes le problème de Heroku c’est le prix.

C’est d’ailleurs souvent un emploi à temps plein. Si vous n’êtes que 4 développeurs, vous devez déjà avoir assez de travail j’imagine !

Ceci entre en contradiction directe avec ma propre expérience quotidienne depuis plus d’un an. Tu es sûr que tu ne confonds pas utiliser Kubernetes en IaaS avec maintenir son propre cluster sur son infrastructure privée ? Dans ce cas je comprendrais beaucoup mieux ta remarque.

nohar

Le travail qu’évoque dans ce topic FougereBle fait entièrement partie de la méthodologie DevOps.

Le cycle DevOps. Source : plunge.cloud
Le cycle DevOps. Source : plunge.cloud

Mettre en place les différentes étapes de cette méthodologie est un travail à part entière. Même utiliser Kubernetes en IaaS demande pas mal de travail pour définir et mettre en place correctement un cluster. Par contre une fois que tout est configuré, il n’y a plus rien à faire en effet :D

Autrement, je ne doute pas qu’Heroku puisse faire le job. C’est juste que si c’est pour commencer avec du PaaS pour ne pas se prendre la tête (ce qui est parfaitement compréhensible), il existe aussi des choses comme porter, pour faire "comme Heroku, sans s’enfermer chez Heroku" (parce qu’Heroku, à une certaine échelle, ça coûte quand même une blinde), et qui ont le mérite de rendre trivial le passage à du k8s pur puisque ça tourne dedans dès le départ, tout en restant compatible avec sa stack "standard" (helm et kubectl).

nohar

Je ne connaissais pas Porter mais cela semble une très bonne alternative à Heroku. Comme tu le dis, cela évite de s’enfermer dans leur écosystème.


Je persiste à penser que votre plus-value est vraiment dans le développement de votre produit. Votre CEO et votre CTO comprendront très certainement qu’ils y gagneront davantage à déléguer cette tâche à un service externe. Vous pourrez ainsi vous consacrer entièrement aux besoins de vos clients (et non pas à la configuration de votre cluster Kubernetes qui est complètement invisible pour eux ! )

Comme on dit :

A vouloir tout faire, on ne fait rien de bien !

Mettre en place les différentes étapes de cette méthodologie est un travail à part entière.

Je te remercie pour la jolie image, ainsi que le proverbe en conclusion mais… tu parles exactement du travail que j’ai moi-même effectué dans ma boîte actuelle, donc ta réponse, en plus de paraître condescendante ("je t’explique ton boulot"), ne répond pas vraiment à mon interrogation.

Tu dis que c’est du boulot, tu répètes que c’est "un travail à part entière", mais concrètement j’évalue rétrospectivement ce travail à une charge cumulée de 2–3 jours (allez, comptons large, disons 5) étalée sur 2 mois, par itérations et petites améliorations successives avant d’aboutir à quelque chose de "final" que je n’ai plus vraiment retouché depuis. Le reste du temps, je l’ai passé concentré sur le développement de ma partie du projet.

Du coup, je me demande vraiment ce que quelqu’un "à temps plein" aurait bien pu trouver à faire pour s’occuper pendant tout ce temps.

Edit :

Je persiste à penser que votre plus-value est vraiment dans le développement de votre produit. Votre CEO et votre CTO comprendront très certainement qu’ils y gagneront davantage à déléguer cette tâche à un service externe. Vous pourrez ainsi vous consacrer entièrement aux besoins de vos clients.

Ça aussi, c’est un raisonnement que j’ai appris, avec les années, à reconnaître comme successivement :

  • Sembler au départ relever du bon sens (ben oui, c’est Agile, il faut créer de la valeur pour les utilisateurs),
  • Une fin de non-recevoir pour refuser une refactorisation estimée nécessaire,
  • Un prétexte à ne jamais débloquer des ressources pour rembourser la dette technique,
  • … Jusqu’à ce que les projets en question se retrouvent freinés au point qu’un changement d’une clé de configuration finisse par mobiliser 4 heures d’efforts de la part de 3 personnes distinctes.
  • … Et meurent.

Le culte de la Sacro-Sainte Valeur Utilisateur est extrêmement dangereux. Il s’agit de l’une des plus grosses mécompréhensions du manifeste Agile, que l’on retrouve le plus souvent défendue par de jeunes ingénieurs récemment promus à un rôle de middle-management, et qui ne se rendent pas compte qu’un investissement (un effort initial pour refactoriser quand les requirements bougent, pour rembourser la dette technique, pour former les gens et les rendre autonomes sur leur infrastructure de prod, …) peut en retour servir à anéantir des coûts cachés, à savoir réduire la force de frottement qui fait qu’une équipe livre de moins en moins de Valeur Utilisateur dans le temps parce qu’elle doit se traîner des casseroles accumulées de plus en plus lourdes.

Bref, non, la valeur livrée à un utilisateur n’est pas le pinacle indépassable de tous les KPI : la productivité de l’équipe maintenue sur le long terme crée infiniment plus de valeur pour les clients que le temps soit-disant économisé à ne pas répondre à un besoin avéré ou anticipé de l’équipe.

Autrement dit, c’est un raisonnement fallacieux qui oppose artificiellement des choses qui sont par nature complémentaires. C’est comme si tu arrivais sur une chaîne de production automobile et que tu disais aux gens de ne surtout pas s’arrêter et de continuer à sortir 3 voitures par jour, plutôt que d’arrêter la chaine pendant une semaine pour effectuer la maintenance qui leur permettrait de passer à 5.

+0 -0

Je reviens vers vous :p

Alors Porter, c’est vraiment génial. Ça simplifie beaucoup la vie, et j’arrive à déployer mes applications avec.

J’ai juste un souci :D

J’ai une application Nuxt qui récupère une variable de Header de la requête (X-Ma-Variable). Cette variable contient en fait le sous domaine par défaut (donc cettevaleur.monsite.com).

Mais il se peut qu’un deuxième non de domaine pointe vers ce même site (monsite.com) avec la même valeur.

Par exemple :

  • exemple.monsite.com => X-Ma-Var = exemple
  • second.monsite.com => X-Ma-Var = second
  • autredomaine.com => X-Ma-Var = second (ici, je veut que ce domaine correspondent à "second", mais il se pourrait qu’un troisième domaine pointe vers "exemple" ou autre).

Jusqu’à maintenant, j’utilisais un Docker avec un reverse proxy Nginx.

J’avais quelque chose comme ceci : (ce code est faux, mais je n’ai plus le code exacte sur ce PC)

server {
    server_name (*.).monsite.com;
    add_header X-Ma-Var $1;

    proxy_pass http://monsite:3000;
}

J’ai pas encore ajouté de second NDD, mais j’imagine que j’aurais simplement du ajouter à la suite :

server {
    server_name autresite.com;
    add_header X-Ma-Var autresite;

    proxy_pass http://monsite:3000;
}

Sauf que là, avec Kubernetes (ce qu’utilise Porter), j’ai plus de reverse proxy Nginx… :(

Avez-vous une astuce pour faire ce dont j’ai besoin ? Ou une ressource à me conseiller ?

J’ai entendu parler de "Nginx Ingress" mais j’avoue être perdu.

+0 -0

J’ai entendu parler de "Nginx Ingress" mais j’avoue être perdu.

C’est effectivement la ressource qu’on utilise pour faire ce genre de choses fans kubernetes : un ingress. Autrement dit c’est une ressource qui décrit tes routes, le nom de domaine où elles arrivent, et c’est même là que tu configures la terminaison TLS.

Comment se présente ton appli actuellement ? Je suppose que tu as plusieurs deployments qui sont chacun exposés par des services différents ?

Pour le savoir le plus simple est de faire :

kubectl get services

+0 -0

Je reviens vers vous après un petit temps de silence. ^^

En effet, j’ai préféré attendre un peu avant de poster dans ce sujet pour voir comment je m’en sortais.

Au final, nous avons opté pour un hébergeur qui utilise Jelastic. Et Jelastic, c’est la vie ! :D

J’ai pu déployer une application NodeJS, Vue et Nuxt, ainsi qu’un reverse proxy avec Nginx. Tout fonctionne à merveille !

Comment se passe le déploiement ?

C’est simple : Je lance la commande docker build -t nom/image:tag . qui me créé mon image Docker. Ensuite, je la publie sur Docker Hub en privé. En effet, nous avons décidé de prendre un abonnement Docker Hub qui, très honnêtement, nous facilite grandement le déploiement.

Une fois l’image publiée, je me rend sur mon Dashboard Jelastic pour déployer mon application en quelques clic. C’est vraiment super bien fait et très intuitif.

Nos applications tournent sans problème, et tout à l’air très solide. Ça me rassure beaucoup, car quand je voyais le système que j’avais mis en place sur nos serveurs OVH, j’avais un peu peur. ^^

Nous ne passons donc pas par Kubernetes (à moins que Jelastic l’utilise en interne, mais comme c’est invisible, on s’en fiche un peu).

Du coup, je me suis dit que si Jelastic existais, il y avait peut être des alternatives auto hébergée. J’ai en effet regardé, juste par curiosité. J’ai pas trouvé quand chose, hormis Portainer que j’ai pu testé et qui est vraiment bien aussi, sauf le fait qu’il est très difficile (je n’ai pas réussi) de pointer un sous domaine sur un container simplement, via l’interface.

D’ailleurs, si vous savez comment faire, je suis preneur. ^^ Aussi, si vous connaissez des alternatives à Jelastic mais gratuite et auto hébergée, je prend également (juste pour le plaisir de découvrir de nouvelles choses).

En attendant, je passe ce sujet en résolu, même si le problème initial n’a toujours pas trouvé de réponse, je suis simplement passé par un autre moyen.

Encore merci à tous ce qui m’ont apportés leurs aide.

+1 -0

Avec ton montage, c’est Jelastic qui héberge ta solution ? Ou c’est sur un de vos serveurs avec un programme de déploiement déporté ?

Sinon as-tu essayé Netlify ?

De mon côté, j’ai également changé le système de déploiement de mon application Node.js : un script CI/CD Gitlab qui me rebuild mon application chaque fois que je merge sur la branche master. J’ai réussi à configurer un runner sur un de nos serveurs pour que le build soit gratuit et ça utilise la version des images précédentes comme cache. Les images sont stockés sur Gitlab (gratuit semble t-il), c’est bien que ce soit rattaché au projet directement. J’ai plus qu’à relancer en production docker-compose en choisissant les images Gitlab et roule ! Pour l’instant Kubernetes me semble aussi trop complexe à mettre en place et il faudrait que je décide mon patron. :p

+0 -0

Nous sommes hébergés sur Hosteur, qui utilise Jelastic. J’ai aussi pris un abonnement Infomaniak qui utilise aussi Jelastic dans leurs version Cloud pour m’amuser un peu de mon côté.

Pour Netlify, je n’ai pas essayé, mais de mémoire, c’est uniquement pour du frontend non ?

Sinon, fun fact, j’ai essayé d’héberger sur Infomaniak un petit projet Nuxt que j’ai fait pour les tests, et impossible de créer un container (sur Infomaniak ou autre part) avec une image créée via un Mac M1. Si j’ai bien compris, c’est à cause de l’architecture ARM.

Je sais pas si il est possible de choisir l’architecture lors de la création d’une image Docker, mais ça serait vraiment utile pour moi. ^^ Actuellement, Docker est inutilisable sur mon Mac à cause de ça (du moins, pour un déploiement).

+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