Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Principes cloud native : immutabilité, déclaratif, observabilité

18 min de lecture

Une application cloud native n’est pas simplement une application déployée dans le cloud. C’est une application conçue pour tirer parti des environnements distribués : elle se déploie en conteneurs, communique via des API, se met à jour sans interruption et se répare toute seule. Ce guide détaille les grands principes qui distinguent le cloud native de l’approche traditionnelle, en restant aligné avec le vocabulaire de la CNCF et de la certification KCNA.

  • Les grands principes d’une architecture cloud native (conteneurisation, automatisation, déclaratif, faible couplage, immutabilité, observabilité)
  • La différence entre monolithe, monolithe modulaire et microservices
  • Ce qu’est l’infrastructure immuable et pourquoi c’est important
  • Les 12-factor apps : une base solide pour la portabilité
  • Le rôle des API déclaratives dans Kubernetes et GitOps
  • Les standards ouverts (OCI, CRI, CNI, CSI) et l’interopérabilité

Les grands principes d’une architecture cloud native

Section intitulée « Les grands principes d’une architecture cloud native »

On retrouve très souvent ces grands principes et technologies dans les architectures cloud native modernes :

PrincipeIdée clé
ConteneurisationEmpaqueter l’application avec ses dépendances dans une unité portable et standard
AutomatisationDéployer, mettre à jour et opérer sans action manuelle (CI/CD, GitOps, IaC)
DéclaratifDécrire l’état souhaité plutôt que les étapes pour y arriver
Faible couplageFaire évoluer les composants indépendamment grâce à des interfaces claires
ImmutabilitéRemplacer plutôt que modifier en place — chaque changement produit une nouvelle version
ObservabilitéComprendre le système en temps réel par les logs, les métriques et les traces distribuées

Le résultat visé est un système aux propriétés suivantes :

  • Résilient : les pannes sont attendues et gérées automatiquement (self-healing)
  • Scalable : chaque composant peut être ajusté indépendamment selon la charge
  • Gérable : les opérations sont automatisées et reproductibles
  • Observable : métriques, logs et traces permettent de diagnostiquer les problèmes rapidement
  • Sécurisé : les communications sont chiffrées, les identités vérifiées, les politiques appliquées

Au-delà des principes : patterns et capacités avancées

Section intitulée « Au-delà des principes : patterns et capacités avancées »

Ces principes de base se déclinent ensuite en patterns architecturaux et capacités plus spécifiques :

Pattern / CapacitéRôleQuand l’envisager
MicroservicesStyle architectural qui découpe l’application en services indépendantsQuand plusieurs équipes travaillent sur des domaines métier distincts
Service meshCouche réseau dédiée qui gère la communication, la sécurité (mTLS) et l’observabilité entre servicesQuand le nombre de services et la complexité réseau le justifient
ServerlessModèle d’exécution où le code s’exécute à la demande, sans gérer l’infrastructurePour les traitements événementiels, les fonctions ponctuelles

Ces patterns ne sont pas des prérequis pour faire du cloud native. Ce sont des options à adopter quand le contexte le justifie.

Un monolithe, c’est une application où tout le code vit dans un seul bloc déployable. Imaginez un restaurant où un seul cuisinier prépare l’entrée, le plat et le dessert : si le cuisinier est malade, le restaurant ferme.

Avantages du monolithe :

  • Simple à développer et à déployer au démarrage
  • Pas de latence réseau entre les composants
  • Transactions plus faciles (une seule base de données)
  • Moins de complexité opérationnelle

Entre le monolithe classique et les microservices, il existe une marche intermédiaire souvent sous-estimée : le monolithe modulaire. L’application reste un seul déployable, mais le code est organisé en modules bien séparés, avec des frontières claires entre domaines métier.

C’est souvent le meilleur point de départ pour un projet neuf ou une petite équipe. Vous bénéficiez de la simplicité opérationnelle du monolithe (un seul déploiement, une seule base, pas de réseau inter-services) tout en préparant le terrain pour une extraction future de services si le besoin se confirme.

Les microservices découpent l’application en services indépendants. Dans une architecture microservices mature, chaque service tend à maîtriser ses propres données et à limiter le partage direct de schéma avec les autres services. Ce n’est pas toujours « une base par service » au sens strict, mais une recherche d’autonomie de données et de frontières de responsabilité claires.

Reprenons l’analogie du restaurant : c’est un restaurant avec un chef pâtissier, un chef saucier et un chef rôtisseur. Si le pâtissier est absent, le restaurant fonctionne toujours (sans dessert).

Avantages des microservices :

  • Scalabilité indépendante : on scale uniquement le service qui en a besoin
  • Déploiement indépendant : une mise à jour du service de paiement n’affecte pas le catalogue
  • Équipes autonomes : chaque équipe gère son service de bout en bout
  • Liberté technologique : le service de recommandation peut être en Python, le service commande en Go
CritèreMonolitheMonolithe modulaireMicroservices
Taille de l’équipe< 5 développeurs5-15 développeurs> 15 développeurs, plusieurs équipes
Complexité du domaineUn seul domaine simplePlusieurs domaines identifiésDomaines matures avec frontières claires
Fréquence de déploiementMensuelleHebdomadairePlusieurs fois par jour
Besoin de scalabilitéUniformePrincipalement uniformeDifférencié par service
Budget opsLimitéLimitéÉquipe plateforme dédiée
RecommandationPrototype, MVPDéfaut pour la plupart des projetsOrganisations matures avec des besoins prouvés

Communication entre services : synchrone vs asynchrone

Section intitulée « Communication entre services : synchrone vs asynchrone »

Dans une architecture microservices, les services communiquent de deux manières :

  • Synchrone (REST, gRPC) : le service A appelle B et attend la réponse. Simple, mais risque d’effet cascade si un service est lent.
  • Asynchrone (files de messages, event streaming) : le service A publie un message et continue sans attendre. Les services sont découplés dans le temps — si B tombe, les messages s’accumulent et seront traités à son retour.

Le choix entre synchrone et asynchrone dépend du niveau de couplage acceptable et des garanties de latence requises. En général, on utilise le synchrone pour les requêtes qui nécessitent une réponse immédiate (affichage d’une page), et l’asynchrone pour les traitements en arrière-plan (envoi d’e-mails, génération de rapports).

Traditionnellement, on gère les serveurs comme des animaux de compagnie (pets) : on leur donne un nom, on les met à jour manuellement, on les répare quand ils tombent malades. Le problème ? Après des mois de mises à jour et correctifs, chaque serveur est unique — impossible de reproduire exactement le même environnement.

C’est le configuration drift : l’état réel du serveur diverge de ce qui est documenté. Et un jour, un serveur qui semblait identique aux autres se comporte différemment en production.

En infrastructure immuable, les serveurs sont du bétail (cattle) : anonymes, interchangeables, remplaçables. Au lieu de modifier un serveur existant, vous :

  1. Construisez une nouvelle image avec les changements souhaités (conteneur Docker, AMI, image VM)

  2. Déployez la nouvelle version à côté de l’ancienne

  3. Basculez le trafic vers la nouvelle version

  4. Détruisez l’ancienne une fois la bascule validée

AspectMutable (traditionnel)Immuable (cloud native)
Mise à jourSSH + apt upgrade + espérerNouvelle image → déploiement → rollback si erreur
Reproductibilité« Ça marchait avant le patch de mardi »L’image v2.3.1 est identique partout
RollbackComplexe, parfois impossibleRedéployer l’image précédente
AuditQui a changé quoi, quand ?Chaque version est tracée dans Git
ScalabilitéCloner et prierLancer N instances de la même image

L’infrastructure immuable va de pair avec l’Infrastructure as Code : votre infrastructure est définie dans des fichiers versionnés (Terraform, Pulumi, Crossplane). Chaque changement passe par Git → revue de code → CI/CD → déploiement. Pas de SSH, pas de modification manuelle.

Les 12-Factor Apps sont un ensemble de 12 règles formulées par Heroku en 2011 et ouvertes en open source en 2024. Elles décrivent comment construire des applications portables, scalables et exploitables en tant que service. Elles restent une excellente base pour concevoir une application cloud-ready.

#FacteurRègleExemple concret
1CodebaseUn repo Git = une applicationPas de monorepo mélangeant 3 apps différentes
2DependenciesDéclarer explicitement les dépendancesrequirements.txt, package.json, go.mod
3ConfigConfiguration dans l’environnementVariables d’environnement, ConfigMaps Kubernetes
4Backing servicesTraiter les services tiers comme des ressources attachablesLa base de données est une URL, changeable sans code
5Build, release, runSéparer build, release et exécutionCI build → image Docker → déploiement Kubernetes
6ProcessesL’app s’exécute en processus statelessPas de données en mémoire entre les requêtes
7Port bindingL’app exporte ses services via un portLe conteneur écoute sur un port, le Service Kubernetes route
8ConcurrencyScaler en multipliant les processusHPA Kubernetes augmente le nombre de pods
9DisposabilityDémarrage rapide, arrêt propreLe conteneur démarre en secondes, gère SIGTERM
10Dev/prod parityEnvironnements identiquesMême image Docker en dev, staging et prod
11LogsTraiter les logs comme des flux d’événementsÉcrire sur stdout, collecter avec Fluentd
12Admin processesExécuter les tâches admin comme des processus one-offMigrations via un Job Kubernetes, pas un SSH

Les 12-factor apps restent une excellente base pour penser portabilité, configuration et exploitation. Mais elles ne couvrent pas à elles seules toute l’architecture cloud native moderne :

  • Orchestration : la gestion du cycle de vie des conteneurs (scheduling, scaling, self-healing) n’est pas abordée
  • Sécurité : les politiques d’accès, le chiffrement des communications, la gestion des secrets vont au-delà du Factor 3
  • Workloads stateful : les bases de données, les systèmes de fichiers distribués et les caches ont des contraintes que le Factor 6 (stateless) ne résout pas seul
  • Observabilité : métriques, traces distribuées et alerting ne sont pas couverts par le Factor 11 (logs)

Ce sont des compléments à chercher dans l’écosystème cloud native (Kubernetes, Prometheus, OPA, service mesh) plutôt que des lacunes des 12-factor elles-mêmes.

C’est l’une des différences les plus importantes du cloud native.

  • Impératif : vous donnez les étapes pour arriver au résultat. « Crée un conteneur nginx, expose le port 80, lance 3 réplicas. »
  • Déclaratif : vous décrivez l’état souhaité et le système s’en occupe. « Je veux 3 réplicas de nginx sur le port 80. Débrouille-toi. »

Kubernetes fonctionne de manière déclarative : vous écrivez un manifeste YAML qui décrit l’état désiré, et les contrôleurs Kubernetes s’assurent en permanence que l’état réel correspond.

# Exemple déclaratif : je déclare ce que je veux
apiVersion: apps/v1
kind: Deployment
metadata:
name: mon-app
spec:
replicas: 3 # Je veux 3 réplicas
selector:
matchLabels:
app: mon-app
template:
metadata:
labels:
app: mon-app
spec:
containers:
- name: app
image: mon-app:v2.1 # Je veux cette version
ports:
- containerPort: 8080

Kubernetes utilise une boucle de réconciliation permanente :

  1. Observer l’état actuel du cluster (combien de pods tournent ?)

  2. Comparer avec l’état souhaité (le manifeste dit 3 réplicas)

  3. Agir si nécessaire (créer ou supprimer des pods pour atteindre 3)

  4. Recommencer en boucle (toutes les quelques secondes)

Si un pod crashe, Kubernetes en relance un automatiquement — sans intervention humaine. C’est le fondement de la self-healing (auto-réparation).

Observabilité : comprendre son système en temps réel

Section intitulée « Observabilité : comprendre son système en temps réel »

L’observabilité (observability) est la capacité à comprendre l’état interne d’un système en examinant ses sorties. Dans un environnement distribué avec des dizaines de services, on ne peut plus se contenter de « regarder les logs d’un seul serveur ».

PilierCe que c’estOutil CNCF de référence
MétriquesValeurs numériques mesurées dans le temps (CPU, latence, taux d’erreur)Prometheus (Graduated)
LogsÉvénements textuels horodatés émis par les applicationsFluentd / Fluent Bit (Graduated)
Traces distribuéesSuivi d’une requête à travers plusieurs servicesOpenTelemetry (Graduated), Jaeger (Graduated)

OpenTelemetry (OTel) est le projet CNCF qui unifie la collecte de ces trois signaux dans un framework unique. Il remplace les anciens projets OpenTracing et OpenCensus.

L’observabilité n’est pas « installer Prometheus ». C’est une propriété du système qui se construit dès la conception :

  • Les applications écrivent leurs logs sur stdout (Factor 11)
  • Les services exposent des métriques sur un endpoint dédié (/metrics)
  • Les requêtes sont instrumentées avec des traces (headers de corrélation)

Sans observabilité, le débogage en production distribué relève du hasard.

Le cloud native n’est pas seulement une architecture technique. C’est aussi un écosystème ouvert, standardisé et interopérable, porté par des fondations et des projets open source. La CNCF et la certification KCNA insistent sur la compréhension de cet écosystème au-delà des seuls outils.

Kubernetes est conçu pour être extensible grâce à des interfaces standardisées. Chaque interface permet de remplacer un composant sans modifier le reste :

InterfaceRôleExemples d’implémentations
OCI (Open Container Initiative)Format d’images conteneur, runtime, distributionDocker, containerd, Podman
CRI (Container Runtime Interface)Communication kubelet ↔ runtime conteneurcontainerd, CRI-O
CNI (Container Network Interface)Réseau des pods (communication, politiques réseau)Flannel, Calico, Cilium
CSI (Container Storage Interface)Stockage persistant pour les podsLonghorn, Ceph, AWS EBS

Ces standards garantissent que :

  • Vous n’êtes pas verrouillé (vendor lock-in) avec un fournisseur unique
  • Vous pouvez remplacer containerd par CRI-O, Flannel par Cilium, sans refaire votre cluster
  • L’innovation progresse en parallèle sur chaque couche sans tout casser
  • Les certifications (CKA, CKAD, CKS) testent la compréhension de ces interfaces, pas d’un outil spécifique

C’est le loose coupling appliqué à l’infrastructure elle-même.

Le loose coupling (couplage faible) est le principe transversal qui relie tous les autres. Dans un système faiblement couplé, chaque composant :

  • Expose une interface claire (API REST, gRPC, événements) sans révéler ses détails internes
  • Peut être remplacé par une alternative compatible (changer de base de données, de runtime)
  • Évolue à son rythme : on déploie le service A sans toucher au service B
  • Tombe en panne isolément : une erreur dans le service de stockage n’affecte pas le service de paiement

Ce principe se retrouve à tous les niveaux :

  • Code : des services faiblement couplés communiquent via des API
  • Infrastructure : les standards OCI, CRI, CNI, CSI permettent de remplacer n’importe quel composant
  • Organisation : les équipes autonomes travaillent indépendamment grâce à des contrats d’interface clairs
  • Le cloud native repose sur des grands principes (conteneurisation, automatisation, déclaratif, faible couplage, immutabilité, observabilité) — pas sur une liste figée de technologies
  • Les microservices, le service mesh et le serverless sont des patterns à adopter quand le contexte le justifie, pas des prérequis
  • Le monolithe modulaire est souvent le meilleur point de départ pour un nouveau projet
  • L’infrastructure immuable élimine le configuration drift : on remplace au lieu de modifier
  • Les 12-factor apps sont une excellente base pour la portabilité, mais ne couvrent pas à elles seules l’orchestration, la sécurité ou l’observabilité
  • Les API déclaratives et la boucle de réconciliation Kubernetes permettent la self-healing et l’automatisation
  • Les standards ouverts (OCI, CRI, CNI, CSI) garantissent l’interopérabilité et évitent le vendor lock-in
  • Ce guide couvre les principes ; le guide Écosystème CNCF détaille les projets majeurs

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn