Éditer sur GitHub

DevOps - Les 12 facteurs

Les 12 facteurs sont des recommandations tirées de l'expérience d'Heroku parues en 2012. Elles guident dans la conception applications faciles à déployer et capables de s'adapter à la charge.

Cette page s'efforce d'en faire une lecture en lien avec les éléments vu dans le cours.

I. Base de code - Une base de code suivie avec un système de contrôle de version, plusieurs déploiements

Cette recommandation pose les règles suivantes :

En particulier, il conviendra de veiller à ne dupliquer le code d'une application pour faire plusieurs déploiements (chose que l'on observe parfois quand le code de l'application inclue des éléments de paramétrage des environnements). En revanche, nous soulignerons que dans le cadre d'une approche GitOps, il sera intéressant d'avoir :

II. Dépendances - Déclarez explicitement et isolez les dépendances

Cette recommandation pose les règles suivantes :

Nous noterons que l'utilisation de conteneurs permet de relaxer la première règle en considérant les points suivants :

III. Configuration - Stockez la configuration dans l’environnement

Cette recommandation pose le principe d'une stricte séparation entre le code et la configuration pouvant varier en fonction des déploiements. Elle invite à s'appuyer sur des variables d'environnement pour gérer le paramétrage des applications (ex : DB_HOST, DB_USER, DB_PASSWORD,...)

En pratique, nous noterons que :

Configurer des variables d'environnement lors du déploiement sera plus simple mais il restera par exemple possible de :

IV. Services externes - Traitez les services externes comme des ressources attachées

Il convient de ne pas faire de distinction entre les services locaux et les services externes.

Par exemple, un changement de configuration devra permettre de basculer entre l'utilisation de :

V. Assemblez, publiez, exécutez - Séparez strictement les étapes d’assemblage et d’exécution

En pratique, cette recommandation se traduit par la séparation en processus dédiés pour :

VI. Processus - Exécutez l’application comme un ou plusieurs processus sans état

Cette recommandation pose la règle qu'une application doit s'exécuter sous forme d'un ou plusieurs processus sans état (redhat.com - Stateful et stateless : quelle est la différence ?) qui ne partagent rien.

En pratique, nous remarquerons que cette recommandation amènera à externaliser le stockage des données :

Les fichiers stockés localement au niveau de l'application devront être jetables et propre à chaque instance de l'application (ex : cache applicatif).

VII. Associations de ports - Exportez les services via des associations de ports

Cette recommandation pose la règle qu'une application ne doit pas dépendre d'un serveur applicatif externe (tomcat, apache, nginx,...) pour s'exécuter. Elle doit être auto-suffisante et capable de répondre sur un ou plusieurs ports (ex : http://localhost:3000).

Nous noterons toutefois que l'utilisation de conteneur permet de rendre indolore le déploiement de ces serveurs applicatifs dans la mesure où ils sont embarqué dans les images.

VIII. Concurrence - Grossissez à l'aide du modèle de processus

En substance :

En outre, il est recommandé de s'appuyer sur l'OS (ex : systemd) ou des outils dédiés (ex : foreman) pour gérer proprement les arrêts et flux de sortie des processus (plutôt que gérer des "démons" à l'ancienne avec des pid).

En environnement conteneurisé, nous devrons nous inspirer de ce dernier point en nous appuyant au mieux sur les fonctionnalités disponibles au niveau du moteur d'exécution des conteneurs ou de Kubernetes.

IX. Jetable - Maximisez la robustesse avec des démarrages rapides et des arrêts gracieux

Les processus doivent pouvoir être démarrés, arrêtés et redémarrés rapidement. Ceci implique de :

En outre, la recommandation s'accompagne de conseils spécifiques aux traitements basées sur des piles de message.

X. Parité dev/prod - Gardez le développement, la validation et la production aussi proches que possible

Cette recommandation invite à utiliser les mêmes services externes (PostgreSQL, Redis,...) dans les environnements de développement et de production.

En pratique, s'appuyer sur des outils tels Vagrant ou Docker facilitera l'installation en local de ces services pour les besoins de développement.

Nous éviterons ainsi la tentation de travailler par exemple avec PostgreSQL en PROD et SQLITE en DEV pour échapper à l'installation de PostgreSQL sur les postes des développeurs.

XI. Logs - Traitez les logs comme des flux d’évènements

En substance, il est recommandé de produire les logs dans la sortie standard et de laisser des outils dédiés se charger de la collecte et de l'indexation de ces logs (logstash, fluent-bit, fluentd...).

En pratique, s'appuyer sur une bibliothèque dédiée à l'écriture des journaux applicatifs permettra généralement de :

XII. Processus d’administration - Lancez les processus d’administration et de maintenance comme des one-off-processes

En substance, les applications doivent embarquer les commandes utilitaires qui seront exécutées comme des processus indépendants.

En pratique, au niveau des applications web, nous noterons que les frameworks permettent généralement d'inclure des commandes en annexe du code dédié au traitement des requêtes HTTP :

Au niveau des conteneurs, nous pourrons intégrer des programmes utilitaires à l'image et noterons que généralement :