Ministères
sociaux

Atlas
Plateforme d'hébergement des ministères sociaux
Prérequis et bonnes pratiques pour les applications
Prérequis pour les applications sur Atlas
Ce document explique les prérequis et les bonnes pratiques pour les applications déployées sur la plateforme Atlas, ainsi que les antipatterns à éviter.
Applications Cloud Native
La plateforme Atlas est conçue exclusivement pour héberger des applications cloud native. Ces applications sont spécifiquement développées pour tirer parti des avantages du cloud computing et des environnements conteneurisés comme Kubernetes.
Caractéristiques des applications cloud native
Les applications cloud native présentent généralement les caractéristiques suivantes :
- Conteneurisées : Empaquetées dans des conteneurs Docker pour garantir la cohérence entre les environnements
- Orchestrées dynamiquement : Gérées par Kubernetes pour optimiser l'utilisation des ressources
- Orientées microservices : Composées de services faiblement couplés et indépendamment déployables
- Résilientes : Capables de gérer les pannes sans impact majeur sur la disponibilité
- Scalables : Pouvant s'adapter automatiquement à la charge
- Observable : Fournissant des métriques, des logs et des traces pour le monitoring
- Automatisées : Déployées via des pipelines CI/CD
Méthodologie Twelve-Factor App
Pour garantir que vos applications sont véritablement cloud native, nous recommandons fortement de suivre la méthodologie Twelve-Factor App, qui définit un ensemble de bonnes pratiques pour le développement d'applications modernes.
Antipatterns et mauvaises pratiques
Voici une liste d'antipatterns et de mauvaises pratiques à éviter lors du développement d'applications pour la plateforme Atlas, ainsi que des alternatives recommandées.
1. Stockage de fichiers dans le système de fichiers local
Problème : Les conteneurs sont éphémères par nature. Toutes les données stockées dans le système de fichiers local d'un conteneur sont perdues lorsque le conteneur est redémarré ou recréé. De plus, si plusieurs instances de l'application sont exécutées, chacune aura son propre système de fichiers isolé.
Conséquences : - Perte de données lors des redémarrages ou des mises à jour - Incohérences entre les instances de l'application - Impossibilité de scaler horizontalement
Alternatives :
- Utiliser des buckets S3 pour le stockage persistant des fichiers
- Stocker les données structurées dans une base de données
- Pour les fichiers temporaires, utiliser la mémoire ou un volume temporaire (emptyDir
) avec la conscience que ces données sont éphémères
Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 |
|
2. Supposition d'instance unique (singleton)
Problème : Supposer qu'il n'y a qu'une seule instance de l'application en cours d'exécution est une erreur courante. Dans un environnement cloud, les applications sont souvent exécutées avec plusieurs réplicas pour la haute disponibilité et la scalabilité.
Conséquences : - Problèmes de concurrence et de verrouillage - Incohérences de données - Impossibilité de scaler horizontalement - Points uniques de défaillance
Alternatives : - Concevoir l'application pour être sans état (stateless) - Utiliser des mécanismes de verrouillage distribué pour les opérations critiques - Stocker l'état partagé dans des services externes (bases de données, caches distribués) - Implémenter des mécanismes de synchronisation si nécessaire
Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
3. Migrations de base de données au démarrage de l'application
Problème : Exécuter des migrations de base de données au démarrage de l'application peut causer des problèmes dans un environnement avec plusieurs instances, où plusieurs migrations pourraient s'exécuter simultanément.
Conséquences : - Verrouillage de la base de données - Migrations concurrentes causant des erreurs - Temps de démarrage prolongés - Échecs de déploiement si la migration échoue
Alternatives : - Exécuter les migrations comme une tâche séparée avant le déploiement de l'application - Utiliser des outils de migration avec support de verrouillage - Implémenter un mécanisme de leader election pour que seule une instance exécute la migration - Concevoir des migrations idempotentes et réversibles
Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
4. Dépendance à l'adresse IP ou au nom d'hôte
Problème : Coder en dur des adresses IP ou des noms d'hôte spécifiques dans l'application limite sa portabilité et sa flexibilité dans un environnement cloud où les adresses peuvent changer.
Conséquences : - Fragilité lors des redéploiements - Difficultés à migrer entre environnements - Problèmes lors du scaling
Alternatives : - Utiliser des variables d'environnement pour toutes les configurations d'adresse - Utiliser la découverte de services fournie par Kubernetes - Implémenter des mécanismes de retry et de circuit breaker pour la résilience
Exemple :
1 2 3 4 5 |
|
5. Sessions utilisateur stockées en mémoire
Problème : Stocker les sessions utilisateur en mémoire empêche le scaling horizontal et cause la perte des sessions lors des redémarrages.
Conséquences : - Déconnexions utilisateur lors des redéploiements - Impossibilité de répartir la charge entre plusieurs instances - Consommation excessive de mémoire
Alternatives : - Utiliser un store de sessions externe (Redis, MongoDB) - Implémenter des sessions sans état avec JWT - Utiliser des cookies chiffrés côté client
Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
6. Logs écrits dans des fichiers
Problème : Écrire des logs dans des fichiers locaux rend difficile leur collecte et leur analyse dans un environnement distribué.
Conséquences : - Difficulté à accéder aux logs après un crash - Impossibilité de centraliser les logs - Consommation d'espace disque dans le conteneur
Alternatives : - Écrire les logs sur la sortie standard (stdout/stderr) - Utiliser un format structuré (JSON) pour faciliter l'analyse - Laisser l'infrastructure de la plateforme gérer la collecte et l'agrégation des logs
Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
7. Longues opérations de démarrage
Problème : Les applications qui prennent beaucoup de temps à démarrer ralentissent les déploiements et peuvent causer des problèmes avec les health checks de Kubernetes.
Conséquences : - Déploiements lents - Échecs de readiness probes - Temps d'arrêt prolongés lors des mises à jour
Alternatives : - Optimiser le temps de démarrage de l'application - Séparer les tâches longues en jobs distincts - Implémenter un démarrage progressif (lazy loading) - Utiliser des readiness probes appropriées
Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
8. Configuration en dur dans le code
Problème : Coder en dur la configuration dans l'application limite sa flexibilité et nécessite une recompilation pour chaque changement.
Conséquences : - Difficultés à adapter l'application à différents environnements - Nécessité de maintenir plusieurs versions du code - Risques de sécurité (secrets exposés)
Alternatives : - Utiliser des variables d'environnement pour la configuration - Implémenter un système de configuration externe - Séparer clairement le code de la configuration
Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
9. Absence de health checks
Problème : Sans health checks appropriés, Kubernetes ne peut pas déterminer si une application fonctionne correctement et quand elle est prête à recevoir du trafic.
Conséquences : - Trafic envoyé à des instances non fonctionnelles - Redémarrages inutiles ou manqués - Déploiements instables
Alternatives : - Implémenter des liveness probes pour détecter les blocages - Implémenter des readiness probes pour indiquer quand l'application est prête - Concevoir des health checks qui vérifient les dépendances critiques
Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
10. Gestion inappropriée des signaux de terminaison
Problème : Ne pas gérer correctement les signaux de terminaison (SIGTERM, SIGINT) peut entraîner une fermeture brutale de l'application et potentiellement une perte de données.
Conséquences : - Connexions interrompues - Transactions non terminées - Ressources non libérées - Perte de données
Alternatives : - Implémenter des gestionnaires de signaux pour une fermeture gracieuse - Fermer proprement les connexions aux bases de données et autres ressources - Terminer les requêtes en cours avant de s'arrêter
Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
Liens utiles
- The Twelve-Factor App - Méthodologie pour construire des applications SaaS modernes
- Cloud Native Computing Foundation - Organisation qui promeut l'adoption des technologies cloud native
- Kubernetes Patterns - Patterns de conception pour applications cloud native
- Cloud Native DevOps with Kubernetes - Guide pour le développement et le déploiement d'applications cloud native