Le DevOps expliqué à mes parents (et à nos collègues non-initiés)

Le développement d’une application implique plusieurs domaines de connaissances. Depuis la définition des besoins et des exigences jusqu’à la maintenance de l’application finie, plusieurs profils de professionnels de l’informatique seront amenés à intervenir (développeur, administrateur, designer…). Le processus de développement logiciel contient plusieurs étapes :

  • définir les besoins et les exigences du client,
  • programmer le logiciel,
  • déployer et maintenir le système.

Réduire les coûts et accélérer la production de valeur ajoutée sont des objectifs communs à toutes les entreprises. Nous allons voir dans cet article ce qu’est le DevOps et comprendre comment il peut répondre à ces objectifs.

Le fonctionnement d’une entreprise traditionnelle sans DevOps

Le maître d'ouvrage collecte les besoins et les exigences du client. Ces besoins sont ensuite transmis à l’équipe de développement. L’application et les fonctionnalités demandées sont développées puis livrées à l’équipe opérationnelle chargée de déployer et de maintenir le système.

Les objectifs de ces deux équipes sont antagonistes. L’équipe de développement souhaite que l’application évolue rapidement et que les dernières fonctionnalités soient disponibles pour le client. L’équipe opérationnelle fait en sorte que l’application soit la plus stable possible pour éviter les erreurs logicielles. Les développeurs tiennent pour responsable l’équipe opérationnelle pour le temps de livraison des nouvelles fonctionnalités. L’équipe opérationnelle tient pour responsable les développeurs pour les erreurs de l’application en production.

Le fonctionnement d’une entreprise avec DevOps

L’approche DevOps souhaite réconcilier les deux équipes en créant une culture de collaboration sur la base d’objectifs, projets communs et sur l’apport de valeur. Les communications sont facilitées, les informations, les problèmes et les retours d’expérience sont partagés par les deux équipes.

Les principes DevOps (CALMS) :

  • Culture : Comprendre et améliorer les valeurs et les attitudes de l’environnement d’entreprise au service du développement.
  • Automation : Tout ce qui peut être automatisé doit l’être.
  • Lean : Économie de coûts et élimination des ressources inutiles.
  • Mesure : Localiser rapidement les erreurs logicielles et analyser le comportement des utilisateurs par la mise en place de remontées d’informations.
  • Sharing (partage) : Partage et communication entre les équipes.

Le travail de l’équipe opérationnelle est simplifié. Les développeurs prennent en compte dans leur code des problématiques opérationnelles.

L’équipe opérationnelle comprend mieux les besoins des développeurs et améliore le monitoring, optimise l’utilisation des ressources et la remontée des erreurs liées au code.
La remonté d’informations sur le comportement des applications est cruciale. Les erreurs logicielles peuvent coûter énormément de temps et de ressources, surtout s’il est impossible de connaître leur origine.

Le rapprochement de ces deux équipes autrefois séparées permet leur fusion. On ne parle plus de deux équipes distinctes mais d’une seule équipe DevOps.

Le DevOps permet de gagner du temps en accélérant le déploiement et en éliminant les temps morts. Il permet d’amener une rapidité et une fluidité supplémentaire par l’automatisation d’un maximum de tâches. Les développeurs n’ont plus à attendre le déploiement manuel des équipes opérationnelles pour effectuer les tests d’acceptation utilisateurs. Ce déploiement est maintenant automatique.

L’équipe chargée du DevOps n'attend plus les raisons des échecs de déploiement. Les déploiements automatiques sont ajustés pour correspondre au mieux aux besoins des développeurs.

En accélérant les étapes du développement, les nouvelles fonctionnalités peuvent être rapidement testées auprès des utilisateurs finaux et déployées en production.
Ce gain de temps permet de réduire les coûts et d’accélérer la mise à disposition de valeur ajoutée.

Après avoir évoqué les principes du DevOps, la suite de cet article a pour vocation de présenter la boîte à outils technique. L’objectif est de comprendre le langage parfois obscur de l’équipe DevOps quand elle discute à la machine à café.

Les outils DevOps

Le changement d’organisation dans la production d’une application nécessite de nouveaux outils.

Commençons par l’incontournable : la conteneurisation. Le logiciel Docker permet d’empaqueter une application et ses dépendances dans un conteneur isolé, qui pourra être exécuté sur n’importe quel serveur. L’utilisation permet au développeur d’avoir en local (sur sa machine de développement) un environnement iso-prod, les versions et configurations d’un logiciel seront les mêmes qu’en production. La similarité des environnements rend l’identification des bugs et le déploiement plus simples. Les logiciels deviennent des conteneurs indépendants. Ils peuvent être déplacés et multipliés à volonté.

Imaginons que vous ayez terminé de développer l’application de vos rêves. Elle est conteneurisée et prête à être envoyée en production. Que se passe-t-il si votre application fraîchement conteneurisée tombe en panne ? (spoiler : vos clients ne seront pas satisfaits).

Certaines applications modernes sont composées de plusieurs dizaines de conteneurs qui doivent fonctionner ensemble. Ces composants ont besoin d’être organisés (orchestrés). C’est alors qu’un nouvel outil fait son entrée dans la boîte à outils DevOps.

Kubernetes est un système open source qui vise à fournir une « plate-forme permettant d'automatiser le déploiement, la montée en charge et la mise en œuvre de conteneurs d'applications sur des clusters de serveurs ». Wikipédia

Plus concrètement, en production, une application doit être résiliente (tolérante aux pannes) et scalable (capacités ajustables en fonction de la demande). Pour atteindre ce niveau de qualité, elle doit être hébergée sur un cluster. Un cluster est un regroupement de plusieurs ordinateurs indépendants appelés noeuds. Si l’un des noeuds du cluster tombe en panne, les autres prennent le relais. Si la capacité du cluster devient insuffisante, le cluster grandit en ajoutant de nouveaux noeuds. Le déploiement d’une application sur un cluster est complexe. C’est ici que Kubernetes intervient. Il va aider à la gestion de la répartition d’une application sur plusieurs noeuds ainsi que la communication entre les différents éléments qui la composent. Voici un peu de vocabulaire :

  • pod : brique élémentaire qui permet de gérer le cycle de vie d’un conteneur. Si le conteneur tombe en panne, le pod va le redémarrer. Un pod peut contenir plusieurs containers.
  • noeud : ordinateur faisant partie d’un cluster.
  • déploiement : objet de kubernetes qui gère une application.
Fig 1 : Un noeud avec ses pods

Vous souhaitez aller plus loin pour étonner vos collègues ? Vous pouvez consulter le glossaire de base de Kubernetes (lien en bas de l’article).

Kubernetes est installé sur des ressources physiques (des noeuds). Ces serveurs peuvent se trouver dans votre entreprise (on premise) ou loués chez un provider (le cloud) comme AWS ou Azure.

L’hébergement

Le choix du type d’hébergement dépend de plusieurs facteurs : la politique de protection des données, le budget ou encore les connaissances disponibles dans l’entreprise. Le choix d’un provider donne une solution clé en main pour l’accès à des machines physiques ou virtuelles.

Un des grands acteurs du marché est AWS, filiale du très connu Amazon. Cette division du groupe américain est spécialisée dans les services de cloud computing pour les entreprises et les particuliers. Cette entreprise propose des services comme la location de serveurs à la demande ou le stockage de données. Une application comme kubernetes peut être installée sur un cluster loué sur AWS.

Dans le cycle de production d’une application, certaines tâches peuvent devenir répétitives et sans valeur ajoutée. La compilation, tests et déploiement, sont des activités automatisables. Le Déploiement Continu (CD) consiste à intégrer les changements apportés au code d’un projet de façon continuelle afin de détecter et de corriger le plus tôt possible les bugs.

Très utilisé pour ses pipelines d’automatisation, GitLab Ci est une solution qui vient ajouter de nombreuses fonctionnalités au célèbre gestionnaire de version git. GitLab CI propose des fonctionnalités de wiki, un système de suivi des bugs, l'intégration continue et le déploiement continu.

Les scripts de build, tests et déploiement sont écrits par l’équipe DevOps. Ces scripts sont envoyés sur Gitlab qui est capable de les exécuter et ainsi de tester de A à Z le déploiement. Un pipeline est composé de jobs. Chaque job exécute du code qui a un objectif : compiler, tester, déployer... (un job est complètement customisable).

Encore un petit glossaire :

  • pipeline : ensemble des tâches (jobs) qui composent la routine de déploiement.
  • stage : regroupement de jobs exécutés en parallèle.
  • job : définit ce qui doit être fait (par exemple, compiler ou tester du code).
Fig 2. Pipeline gitlab

La figure ci-dessus présente un pipeline. Les colonnes de la pipeline sont appelées stages. Un ou plusieurs jobs peuvent composer un stage.

Si vous souhaitez en apprendre plus sur les outils DevOps, vous trouverez en bas de l’article des sources pour aller plus loin.

Partie 4 : Un exemple concret

Afin de mieux comprendre les outils et les concepts présentés, je vais prendre comme exemple une application Web monolithique générée à l’aide de JHipster. JHipster permet de créer en quelques minutes l’architecture d’une application web avec un front-end Angular, React ou Vue.js et back-end Java Spring Boot.

Dans un processus de développement et de déploiement avec DevOps avec CD (déploiement continu):

Du côté développement, l’application est générée à l’aide de JHipster. Le développement de nouvelles fonctionnalités se fait en local.

Du côté opérationnel, les machines sont configurées et Kubernetes est installé. Les jobs du pipeline gitlab sont définis selon les besoins et les attentes des développeurs (environnement de staging, test end-to-end).

Lorsqu’un développeur a fini une fonctionnalité, le code est envoyé sur Gitlab. Le pipeline est lancé. La construction et le déploiement de l’application sont lancés si les tests sont réussis. L’application est maintenant disponible dans un environnement de staging pour les tests end-to-end.

Une validation manuelle peut être requise pour déployer l’application en production.

Un article sur le blog Ippon est disponible. Il décrit techniquement les étapes nécessaires à la création d’un pipeline de CD avec une application JHipster. https://blog.ippon.fr/2018/03/29/deployer-une-application-en-2-minutes-dans-le-cloud-avec-openshift-online/

Glossaire :

Métriques : ensemble des mesures effectuées sur les propriétés techniques ou fonctionnelles d’un logiciel.

Monitoring (surveillance) : mesure de l’activité d’une application informatique.

Ressources : composants matériels ou logiciels.

Environnement : ensemble des matériels et des logiciels système.

Iso-prod : environnement identique à celui de la production.

Environnement de staging : environnement de simulation qui permet d’effectuer des tests. Environnement de production : environnement de copie de l’environnement de staging. C’est cet environnement qui sera utilisé par les clients de l’application.

OpenSource : Licence appliquée à un logiciel qui autorise sa libre redistribution d'accès au code source et de création de travaux dérivés.

Cycle de vie : toutes les étapes par lesquelles passe un composant logiciel.

Cloud computing : permet l’accès à des services informatiques via internet.

Compilation : consiste à transformer un code source lisible par un humain en fichier binaire exécutable par une machine.

Déploiement : mise en oeuvre d’un nouveau logiciel qui remplace la version précédente.

Webographie :

Le DevOps expliqué en emojis. Youtube. Consulté juillet 2020. https://www.youtube.com/watch?v=M6F6GWcGxLQ

Comprendre Kubernetes en 3 minutes. Youtube. Consulté juillet 2020. https://www.youtube.com/watch?v=uyiDNcSmwFw

DevOps : quels sont les outils DevOps les plus utilisés aujourd’hui ? Consulté juillet 2020. https://www.padok.fr/blog/outils-devops

Standardized Glossary. Consulté juillet 2020. https://kubernetes.io/fr/docs/reference/glossary/?fundamental=true

DevOps : comment apporter une réelle valeur aux clients. Consulté juillet 2020.

https://www.silicon.fr/avis-expert/devops-comment-apporter-une-reelle-valeur-aux-clients

Définition de l’orchestration de conteneur. Consulté juillet 2020

https://www.hpe.com/fr/fr/what-is/container-orchestration.html