L'illusion de la vérité unique en infrastructure
Le rituel est toujours le même : un vendredi après-midi à dix-sept heures, un développeur pressé modifie à la main la taille d'une instance de base de données directement sur la console Cloud pour résoudre un problème de performance immédiat. Le lundi matin, votre pipeline de déploiement automatique se déclenche, détecte cette modification non enregistrée, et écrase sauvagement la configuration pour rétablir l'état initial, provoquant instantanément une nouvelle panne de production. Cette situation absurde met en lumière la limite fondamentale de l'approche traditionnelle de l'Infrastructure as Code (IaC) : le décalage temporel et structurel entre la réalité de vos ressources cloud et l'état théorique décrit dans vos fichiers de configuration.
Pendant des années, nous avons accepté cette dérive comme une fatalité opérationnelle inhérente à la gestion d'infrastructure, colmatant les brèches à coup de tâches planifiées exécutant des analyses de détection de dérive en boucle. Cependant, l'émergence d'architectures basées sur un Control Plane natif transforme radicalement la manière dont nous concevons le cycle de vie de nos ressources virtuelles. La confrontation entre la vision statique, basée sur l'exécution ponctuelle de scripts, et la vision dynamique, portée par une réconciliation continue en arrière-plan, redéfinit en profondeur le rôle de l'ingénieur DevOps moderne.
Le paradigme statique de Terraform face à la réconciliation de Crossplane
Terraform et le mirage du state figé
Terraform repose sur un modèle d'exécution séquentiel déclenché par l'utilisateur ou par un outil d'intégration continue. Lorsque vous lancez une commande, l'outil compare votre code local avec un fichier de statut persisté, interroge les API des fournisseurs de services pour détecter les différences, puis applique les changements nécessaires. Ce processus fonctionne parfaitement pour créer une infrastructure initiale, mais s'avère incapable de garantir l'intégrité de vos ressources en temps réel dès lors que l'exécution de la commande est terminée.
Considérons un fichier de configuration Terraform classique définissant une base de données avec des paramètres de sécurité critiques. Une fois le code appliqué, Terraform s'endort et perd toute visibilité sur ce qui se passe réellement en production jusqu'à sa prochaine exécution manuelle ou automatisée.
resource "aws_db_instance" "production_db" {
allocated_storage = 100
engine = "postgres"
engine_version = "15.4"
instance_class = "db.r6g.xlarge"
username = "db_admin"
password = var.database_password
skip_final_snapshot = false
publicly_accessible = false
}
Si un intervenant extérieur ou un processus tiers modifie le paramètre d'accessibilité publique pour le passer à vrai, votre base de données se retrouve exposée à internet sans que votre système de déploiement n'en soit alerté. La dérive peut ainsi persister pendant des jours, voire des semaines, créant une faille de sécurité majeure au sein de votre réseau.
Crossplane et la puissance de la boucle de contrôle infinie
Crossplane aborde le problème sous un angle totalement différent en s'appuyant sur l'architecture robuste de Kubernetes. Au lieu de traiter l'infrastructure comme un ensemble de ressources à provisionner ponctuellement, Crossplane transforme votre cluster Kubernetes en un véritable Control Plane universel capable de gérer n'importe quelle ressource externe comme s'il s'agissait d'un simple conteneur applicatif.
Grâce aux définitions de ressources personnalisées (CRD), Crossplane déclare des objets représentant vos composants d'infrastructure. Le contrôleur interne de Crossplane exécute en permanence une Reconciliation Loop qui compare toutes les quelques secondes l'état désiré défini dans le cluster avec l'état réel de l'infrastructure cloud chez votre fournisseur.
apiVersion: database.aws.upbound.io/v1beta1
kind: RDSInstance
metadata:
name: production-db
spec:
forProvider:
region: eu-west-3
allocatedStorage: 100
engine: postgres
engineVersion: "15.4"
instanceClass: db.r6g.xlarge
masterUsername: db_admin
masterPasswordSecretRef:
name: db-credentials
key: password
namespace: default
publiclyAccessible: false
writeConnectionSecretToRef:
name: db-conn-details
namespace: default
Avec cette approche déclarative continue, toute tentative de modification manuelle de l'accessibilité publique sur la console AWS est immédiatement détectée par le contrôleur Crossplane. En l'espace de quelques minutes, le contrôleur émet une requête corrective auprès de l'API AWS pour restaurer la valeur définie dans le cluster, neutralisant ainsi automatiquement toute dérive de configuration sans aucune intervention humaine.
Attention à la surcharge de requêtes API
La réconciliation continue implique des requêtes régulières vers les API de vos fournisseurs Cloud. Sur des parcs de milliers de ressources, un intervalle de réconciliation trop agressif peut saturer vos quotas d'API et provoquer des limitations de débit (rate limiting) bloquantes pour vos autres outils.
Analyse comparative : cas d'usage réels et douleurs de production
La gestion de la dérive en conditions réelles
Pour mesurer concrètement l'écart entre ces deux approches, imaginons la détection d'une dérive sur un compartiment de stockage dont le chiffrement a été désactivé par erreur par une application de maintenance défaillante. Voici comment réagit un pipeline de déploiement traditionnel basé sur Terraform face à cet incident.
# Événement de dérive détecté lors du run nocturne de Terraform
step: Run Terraform Plan
command: terraform plan -detailed-exitcode
Résultat:
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
~ update in-place
~ aws_s3_bucket_server_side_encryption_configuration.encryption
~ rule {
~ apply_server_side_encryption_by_default {
~ sse_algorithm = "AES256" -> "None"
}
}
Error: Process completed with exit code 2. Drift detected! Action required.
Dans ce scénario Terraform, l'alerte n'est levée qu'au moment de l'exécution du pipeline planifié. Pendant tout l'intervalle séparant l'erreur de manipulation et le déclenchement du pipeline, les données sensibles sont restées stockées sans chiffrement actif. À l'inverse, Crossplane intercepte cette anomalie de manière asynchrone et autonome, limitant la fenêtre d'exposition à la durée d'un cycle de réconciliation standard.
Le coût d'administration des deux solutions
L'adoption de Crossplane introduit cependant une complexité opérationnelle non négligeable. Alors que Terraform est un outil en ligne de commande léger qui s'exécute localement ou dans un simple conteneur éphémère de CI/CD, Crossplane nécessite un cluster Kubernetes hautement disponible pour fonctionner. Ce cluster doit être géré, surveillé, sauvegardé et sécurisé, ce qui représente une surcharge de travail importante pour les équipes d'ingénierie.
| Critère de comparaison | Terraform (IaC Classique) | Crossplane (Control Plane) |
|---|---|---|
| Cycle d'exécution | Ponctuel et séquentiel (sur demande) | Continu et asynchrone (boucle infinie) |
| Stockage de l'état | Fichier d'état statique (S3, GCS, Terraform Cloud) | Base de données etcd de Kubernetes en temps réel |
| Détection de la dérive | Active lors de la prochaine exécution du plan | Automatique et correction immédiate en tâche de fond |
| Infrastructure requise | Un simple exécuteur CLI (CI/CD ou local) | Un cluster Kubernetes complet en production |
| Intégration applicative | Nécessite des variables de sortie et des liaisons complexes | Utilisation native des Secrets et ConfigMaps Kubernetes |
L'architecture sous le capot
Flux de déploiement et d'orchestration
Pour bien comprendre comment les données et les ordres transitent dans les deux systèmes, analysons le comportement de chaque outil lorsqu'une ressource cloud doit être provisionnée puis maintenue à jour face aux aléas de la production. La différence fondamentale réside dans l'emplacement du moteur de décision.
Le schéma ci-dessus met en évidence la rupture de chaîne caractéristique de Terraform : une fois la ressource provisionnée, aucun lien actif n'existe entre le code source et le monde réel jusqu'au prochain passage du pipeline de déploiement. À l'opposé, le modèle Crossplane s'appuie sur une boucle hermétique où le contrôleur interroge en permanence l'état de la ressource cloud pour l'aligner sur la spécification stockée dans la base de données interne de Kubernetes. Cette intégration native permet également d'exploiter la puissance des outils de GitOps comme ArgoCD pour synchroniser vos configurations d'infrastructure de la même manière que vos services applicatifs.
Le verdict du terrain : comment choisir son camp
Quand conserver Terraform dans votre infrastructure
Malgré l'élégance théorique de la réconciliation continue, Terraform reste le choix le plus pragmatique pour une grande majorité d'entreprises, en particulier celles dont l'architecture ne repose pas majoritairement sur Kubernetes. Si votre infrastructure se résume à quelques serveurs virtuels, une base de données managée et un réseau privé virtuel, l'introduction de Crossplane s'apparenterait à utiliser un marteau-pilon pour écraser une mouche.
De plus, l'écosystème de providers de Terraform est d'une maturité incomparable. Qu'il s'agisse de configurer un fournisseur SaaS obscur, de gérer des comptes utilisateurs sur une plateforme tierce ou de manipuler des infrastructures physiques sur site, vous trouverez presque toujours un provider officiel documenté et éprouvé par la communauté, là où Crossplane se concentre principalement sur les grands fournisseurs de cloud public.
L'usage hybride
Il est tout à fait possible d'utiliser Terraform pour poser les fondations de votre réseau et de vos clusters Kubernetes de base, puis de déléguer la gestion des ressources applicatives dynamiques (bases de données de développement, files d'attente, compartiments de stockage) à Crossplane une fois le cluster opérationnel.
Quand basculer sur Crossplane
Le basculement vers Crossplane devient pertinent dès lors que vous visez l'auto-service pour vos équipes de développement. Dans les organisations de grande taille, les développeurs doivent souvent attendre l'approbation d'un ticket par l'équipe d'infrastructure pour obtenir une base de données ou un accès de stockage pour leur nouvelle fonctionnalité. Crossplane permet de créer des abstractions personnalisées appelées compositions, masquant la complexité technique sous-jacente.
En définissant des modèles d'infrastructure réutilisables, vos développeurs peuvent déclarer leurs besoins directement dans leurs manifestes Kubernetes applicatifs sous la forme de requêtes de ressources simples, sans avoir besoin d'apprendre la syntaxe de Terraform ni de comprendre l'architecture réseau globale de l'entreprise.
Vers une convergence des outils d'infrastructure
La confrontation entre Terraform et Crossplane ne doit pas être perçue comme une guerre de religion technologique, mais plutôt comme l'adaptation de nos outils à des architectures applicatives de plus en plus dynamiques. L'approche statique de Terraform répond parfaitement aux besoins de stabilité et de contrôle rigide des fondations de votre système d'information, tandis que l'approche dynamique de Crossplane excelle dans l'agilité et l'automatisation fine des ressources consommées par vos applications conteneurisées.
Pour le professionnel DevOps, l'enjeu des prochaines années réside dans la capacité à orchestrer ces deux paradigmes de concert. Comprendre les forces et les limites de chaque modèle vous évitera de subir les pannes liées aux dérives silencieuses tout en vous prémunissant contre la complexité opérationnelle parfois étouffante des systèmes entièrement gérés par des boucles de contrôle.
Espace commentaire
Écrire un commentaire
Rejoignez la discussion
Vous devez être connecté pour poster un message.
15 commentaires
Franchement, pour 90% des boîtes, Terraform + ArgoCD pour lancer les plans, ça suffit largement.
Pourquoi vouloir réinventer la roue avec Crossplane ? C'est juste pour le buzz ou il y a un vrai gain de productivité ?
C'est vrai, la gestion du cycle de vie des CRDs demande une rigueur équivalente à celle d'un développeur d'app. On ne fait pas de "apply" sans tester la montée de version du provider.
C'est quoi la stratégie de mise à jour des CRDs dans Crossplane ? Si le provider AWS change, tu dois gérer tes versions de CRDs et tes ressources en même temps. C'est un cauchemar de migration.
Le passage sur le
terraform planqui échoue est un peu biaisé. Il existe des outils commedriftctlou des scanners qui font très bien le job de détection sans avoir à maintenir un cluster K8s entier.Ton approche hybride est exactement ce que je préconise en fin d'article. Ne pas tout migrer aveuglément.
L'important est de savoir quel outil est le plus pertinent selon la volatilité de la ressource.
Pour moi, Terraform reste roi pour tout ce qui est réseau (VPC, Subnets). Crossplane c'est bien pour les buckets S3 ou les RDS, mais ne mélangeons pas tout.
Voici ce que je fais en hybride :
Quelqu'un a déjà essayé de faire du
terraform importsur une ressource gérée par Crossplane ? C'est impossible proprement.Une fois que t'es dans Crossplane, t'es marié avec. C'est le vendor lock-in ultime.
Les politiques IAM ne règlent pas le problème du shadow IT ou des besoins légitimes de config. La boucle de réconciliation est là pour garantir que l'état déclaré est l'état réel.
C'est une vision différente de la gouvernance.
Le coup du "développeur qui modifie la taille de la base le vendredi"... c'est du vécu, mais la réponse c'est du
SCP(Service Control Policy) sur AWS, pas une boucle de réconciliation qui va se battre contre l'API.Vous parlez de "dérive", mais la plupart des dérives sont causées par des humains qui font du clic-bouton. Pourquoi ne pas simplement restreindre les droits IAM au lieu de rajouter une couche de complexité comme Crossplane ?
C'est un choix d'architecture. Oui, ça complexifie la gestion des secrets, mais ça permet une intégration native avec les objets
Secretde K8s que tes apps utilisent déjà.On gagne en cohérence ce qu'on perd en simplicité de config.
Exactement. Et la gestion des secrets via
db-credentialsdans Crossplane, c'est bien beau mais ça oblige à synchroniser des secrets entre namespaces. C'est l'enfer à maintenir.Le problème de fond c'est l'
etcd. Si ton cluster Kubernetes tombe, tu perds ta capacité à gérer ton infra. C'est un single point of failure massif.Avec Terraform, au pire tu perds ton
terraform.tfstate, mais ton infra reste debout.C'est un point valide. Le
pollIntervaldans la configuration du provider est justement là pour ça. Si tu le laisses par défaut, forcément, tu vas spammer l'API.Le but n'est pas de tout mettre en réconciliation à 5 secondes, mais de trouver le juste milieu pour éviter la dérive sans tuer le quota.
Encore un article qui survend la "réconciliation continue". Vous avez déjà essayé de débugger un contrôleur Crossplane qui boucle sur une ressource AWS mal formée ?
Le rate limiting mentionné est sous-estimé, on a déjà explosé nos quotas API en moins de 48h avec une config trop agressive.