Une référence concise des modèles d'architecture évalués par l'examen CNPA. Lisez de haut en bas ou sautez à une section.
Principes fondamentaux de l'ingénierie de plateforme
Établir le principe fondamental pour une équipe de plateforme afin d'assurer l'adoption et de réduire les frictions pour les développeurs.
Traiter la plateforme interne comme un produit. Traiter les développeurs internes comme des clients, mener des études utilisateurs, recueillir des commentaires et itérer sur les fonctionnalités pour réduire leur charge cognitive.
Pourquoi: Cette approche déplace l'attention de la construction d'infrastructures vers la création de valeur, garantissant que la plateforme résout de réels problèmes pour les développeurs et n'est pas contournée ("shadow IT").
Établir une source unique de vérité pour l'état désiré de toutes les infrastructures et applications.
Utiliser les dépôts Git comme source unique de vérité. Déployer un agent au sein du cluster (ArgoCD, Flux) qui exécute une boucle de réconciliation continue pour comparer l'état du cluster avec Git.
Pourquoi: Cela fournit une piste d'audit complète, permet des retours en arrière faciles et prévient la dérive de configuration en annulant automatiquement les modifications hors bande.
Prévenir la dérive de configuration et assurer la cohérence des artefacts déployés dans tous les environnements.
Traiter l'infrastructure comme immuable. Ne jamais modifier les ressources en cours d'exécution. Au lieu de cela, créer de nouveaux artefacts versionnés (images de conteneurs, images de VM) et remplacer les anciens. Appliquer cela avec des systèmes de fichiers de conteneurs en lecture seule (`readOnlyRootFilesystem: true`).
Pourquoi: L'immutabilité élimine la dérive de configuration et rend les déploiements prévisibles et reproductibles. "Remplacer, ne pas réparer."
Choisir un modèle de déploiement GitOps sécurisé, en particulier dans les environnements multi-clusters ou à réseaux restreints.
Mettre en œuvre un modèle basé sur le "pull". Un agent (ArgoCD, Flux) exécuté à l'intérieur du cluster tire les manifestes de Git. Éviter les modèles basés sur le "push" où un système de CI externe pousse vers l'API Kubernetes.
Pourquoi: Les modèles basés sur le "pull" sont plus sécurisés car ils ne nécessitent pas d'exposer le serveur API Kubernetes en externe ni de gérer les identifiants pour plusieurs clusters en CI.
Accélérer le développement et assurer les meilleures pratiques sans trop restreindre les équipes expérimentées.
Définir des "chemins dorés" (golden paths) : des modèles et des flux de travail préconfigurés et bien supportés pour les tâches courantes (par exemple, la création d'un nouveau microservice).
Pourquoi: Les chemins dorés réduisent la charge cognitive et la fatigue décisionnelle pour 80% des cas, mais devraient toujours permettre des "échappatoires" pour les équipes expertes ayant des exigences uniques.
Fournir une multi-tenancy dans une plateforme Kubernetes partagée avec des niveaux d'isolation appropriés.
Pour l'isolation la plus forte, utiliser des clusters séparés. Pour un équilibre entre forte isolation et efficacité, utiliser des clusters virtuels (vClusters). Pour une multi-tenancy de base et souple, utiliser l'isolation au niveau des namespaces avec RBAC, NetworkPolicies et ResourceQuotas.
Pourquoi: Le choix dépend du risque lié à la sécurité et aux "voisins bruyants". Les clusters virtuels offrent une isolation du plan de contrôle sans le coût des clusters physiques complets.
Définir le mode d'interaction principal entre l'équipe de plateforme et les équipes alignées sur les flux (produit).
L'équipe de plateforme devrait principalement fonctionner en mode "X-as-a-Service", en fournissant des outils en libre-service, des APIs et de la documentation.
Pourquoi: À l'échelle, une équipe de plateforme ne peut pas utiliser un modèle de collaboration intensif avec chaque équipe. Le modèle "as-a-service" permet la mise à l'échelle et l'autonomie des développeurs.
Observabilité, sécurité et conformité de la plateforme
Mettre en œuvre une stratégie d'observabilité complète pour un système distribué.
Collecter et corréler les trois piliers : métriques (données numériques de séries temporelles via Prometheus), logs (événements structurés via Fluent Bit) et traces (flux de requêtes via OpenTelemetry).
Pourquoi: Aucun pilier seul n'est suffisant. Les corréler (par exemple, en intégrant des identifiants de trace dans les logs) est essentiel pour diagnostiquer rapidement les problèmes dans les architectures de microservices complexes.
Appliquer automatiquement les politiques de sécurité et organisationnelles sur tous les clusters Kubernetes.
Utiliser un moteur de politiques comme OPA/Gatekeeper ou Kyverno, intégré en tant que contrôleur d'admission validant/mutant. Stocker les politiques dans Git et les synchroniser via GitOps.
Pourquoi: Cela fournit des garde-fous automatisés et préventifs, offrant aux développeurs un retour rapide dans leur pipeline CI/CD plutôt que des points de révision lents et manuels.
Sélectionner un moteur de politiques pour Kubernetes basé sur les compétences de l'équipe et la complexité des politiques.
Utiliser Kyverno pour les politiques pouvant être exprimées en YAML de style Kubernetes familier. Utiliser OPA/Gatekeeper pour les politiques complexes nécessitant un langage plus puissant et spécifiquement conçu (Rego) et une intégration de données externes.
Pourquoi: Kyverno a une courbe d'apprentissage plus faible pour les praticiens de Kubernetes. OPA/Rego est plus puissant mais nécessite l'apprentissage d'un nouveau langage.
Assurer l'intégrité et l'authenticité des images de conteneurs déployées en production.
Mettre en œuvre la signature d'images dans le pipeline CI à l'aide de Sigstore/Cosign. Utiliser un contrôleur de politiques (Kyverno, Gatekeeper) pour créer une politique d'admission qui vérifie les signatures d'images avant d'autoriser la création d'un pod.
Pourquoi: Cela garantit que seules les images construites par des pipelines CI de confiance et qui n'ont pas été altérées peuvent s'exécuter dans le cluster, empêchant l'exécution de code non autorisé.
Sécuriser toutes les communications service-à-service au sein du cluster avec une approche zéro confiance.
Déployer un maillage de services (par exemple, Istio, Linkerd) et activer le TLS mutuel strict (mTLS) pour tout le trafic au sein du maillage.
Pourquoi: mTLS fournit à la fois un chiffrement en transit et une identité forte, vérifiable cryptographiquement, pour le client et le serveur, empêchant l'usurpation d'identité et les attaques de l'homme du milieu à l'intérieur du cluster.
Appliquer les meilleures pratiques de sécurité pour toutes les charges de travail exécutées dans le cluster.
Activer le contrôleur d'admission Pod Security intégré. Configurer les espaces de noms pour appliquer le profil `restricted` aux charges de travail et `baseline` aux composants de la plateforme.
Pourquoi: Le profil `restricted` applique un durcissement de sécurité critique (par exemple, exécution en tant que non-root, suppression de toutes les capacités, interdiction de l'escalade de privilèges) et constitue une mesure de sécurité fondamentale.
Détecter les comportements anormaux ou malveillants à l'intérieur des conteneurs en cours d'exécution au niveau du système d'exploitation.
Déployer un outil de sécurité d'exécution qui utilise eBPF, tel que Falco ou Tetragon. Définir des règles pour détecter les appels système suspects, l'accès aux fichiers et l'exécution de processus.
Pourquoi: Les outils de sécurité traditionnels sont aveugles à l'activité à l'intérieur des conteneurs. eBPF offre une visibilité profonde et à faible surcharge sur les événements au niveau du noyau, permettant la détection de menaces que d'autres outils manquent.
Construire un pipeline de données d'observabilité évolutif et résilient.
Utiliser l'OpenTelemetry (OTel) Collector. Enchaîner les processeurs pour transformer les données (par exemple, le processeur `attributes` pour supprimer les PII, le processeur `batch` pour l'efficacité). Utiliser le processeur `memory_limiter` tôt dans le pipeline pour prévenir les OOM.
Pourquoi: Le Collector découple l'instrumentation des backends et fournit un moyen flexible et indépendant du fournisseur pour traiter, filtrer et acheminer les données de télémétrie avant l'exportation.
Déployer de nouvelles versions d'application en production tout en minimisant les risques et le rayon d'impact.
Mettre en œuvre des déploiements canary automatisés à l'aide d'un outil comme Flagger ou Argo Rollouts. Déplacer progressivement le trafic vers la nouvelle version tout en analysant automatiquement les métriques clés (taux de succès, latence). Revenir automatiquement en arrière en cas de violation de SLO.
Pourquoi: L'analyse canary automatisée valide les nouvelles versions avec du trafic de production réel, offrant un degré de sécurité bien plus élevé que de simples mises à jour progressives.
Déployer une nouvelle version d'une application avec la capacité d'effectuer un retour arrière instantané.
Maintenir deux environnements de production identiques ("bleu" et "vert"). Déployer la nouvelle version dans l'environnement inactif (vert). Après validation, basculer l'équilibreur de charge pour acheminer tout le trafic vers le vert. Garder le bleu inactif pour un retour arrière instantané.
Pourquoi: Ce modèle offre des déploiements sans interruption et le retour arrière le plus rapide possible, mais nécessite généralement le double des ressources d'infrastructure.
Gérer les secrets de manière déclarative dans un flux de travail GitOps sans stocker les identifiants en texte brut dans Git.
Utiliser un opérateur de secrets dédié. Soit chiffrer les secrets avant de les committer (Bitnami Sealed Secrets, Mozilla SOPS), soit référencer les secrets depuis un coffre externe (External Secrets Operator).
Pourquoi: Cela maintient les données sensibles hors de Git tout en permettant de gérer les secrets de manière déclarative en parallèle de la configuration de l'application, conservant ainsi le flux de travail GitOps.
Gérer les configurations d'application à travers plusieurs environnements (dev, staging, prod) sans duplication.
Utiliser un outil comme Kustomize avec une structure de base et de surcouches, ou Helm avec des fichiers de valeurs spécifiques à l'environnement. Promouvoir les changements en mettant à jour les tags d'image ou la configuration dans le fichier de surcouche/valeurs de l'environnement cible, généralement via une pull request.
Pourquoi: Cette approche "Don't Repeat Yourself" (DRY) prévient la dérive de configuration entre les environnements et rend les différences explicites et vérifiables.
Gérer les déploiements de la même application sur un grand parc de clusters dynamique.
Utiliser les ApplicationSets d'ArgoCD avec un générateur de clusters. Le générateur découvre dynamiquement les clusters en fonction des étiquettes et utilise un modèle pour générer une ressource Application pour chaque cluster correspondant.
Pourquoi: Cela automatise le bootstrapping d'applications pour les nouveaux clusters et gère la configuration à l'échelle, évitant la nécessité de créer manuellement des centaines de ressources Application.
Permettre le déploiement continu en production tout en contrôlant la mise à disposition de nouvelles fonctionnalités aux utilisateurs.
Intégrer un système de feature flagging. Déployer le nouveau code en production derrière un feature flag désactivé. Libérer la fonctionnalité en activant le flag pour des segments d'utilisateurs spécifiques, découplant le déploiement de la publication.
Pourquoi: Cela sépare le risque technique (déploiement) du risque commercial (publication), permettant des déploiements à grande vitesse, des tests A/B et des capacités de "kill switch".
Déployer automatiquement de nouvelles images de conteneurs dès qu'elles sont poussées vers un registre.
Utiliser les composants d'automatisation d'images de FluxCD. L'`ImageRepository` scanne le registre, l'`ImagePolicy` sélectionne le nouveau tag (par exemple, basé sur semver), et l'`ImageUpdateAutomation` committe le changement de tag dans le dépôt Git.
Pourquoi: Cela ferme la boucle du CI (push d'image) au CD (déploiement) pour un flux de travail GitOps entièrement automatisé, sans que le système CI n'ait besoin d'accéder au cluster.
APIs de plateforme et provisionnement d'infrastructure
Fournir une API unifiée et déclarative pour que les développeurs puissent provisionner en libre-service des ressources d'infrastructure Kubernetes et cloud (par exemple, bases de données, files d'attente de messages).
Utiliser Crossplane. Installer les plugins de fournisseurs cloud et définir des CompositeResourceDefinitions (XRDs) de haut niveau pour les développeurs (par exemple, `kind: PostgresSQLInstance`). Mapper ceux-ci aux ressources cloud sous-jacentes à l'aide de Compositions.
Pourquoi: Cela étend le plan de contrôle de Kubernetes pour gérer les ressources externes, permettant aux développeurs d'utiliser les workflows familiers `kubectl` et GitOps pour toutes leurs dépendances d'application, régis par des modèles définis par la plateforme.
Automatiser la gestion complexe du cycle de vie des applications à état (par exemple, installation, mises à niveau, sauvegardes, récupération après échec) de manière native à Kubernetes.
Construire un opérateur Kubernetes. Définir une Custom Resource Definition (CRD) pour votre application et implémenter un contrôleur personnalisé qui exécute une boucle de réconciliation pour gérer l'état de l'application.
Pourquoi: Les opérateurs encodent la connaissance opérationnelle humaine dans le logiciel, permettant une automatisation robuste et traitant les applications complexes comme des ressources Kubernetes de première classe.
S'assurer qu'un opérateur peut effectuer le nettoyage des ressources externes (par exemple, un équilibreur de charge cloud) avant que sa Custom Resource associée ne soit supprimée de Kubernetes.
Ajouter un finalizer aux métadonnées de la Custom Resource. Lorsqu'un utilisateur supprime la CR, elle entre dans un état `Terminating`. La logique de réconciliation de l'opérateur détecte cela, effectue le nettoyage, puis supprime le finalizer, permettant au serveur API K8s de terminer la suppression.
Pourquoi: Sans finalizer, la CR pourrait être supprimée avant que l'opérateur n'ait eu le temps de nettoyer les ressources externes, entraînant une infrastructure orpheline et coûteuse.
Gérer le cycle de vie d'une flotte de clusters Kubernetes eux-mêmes en utilisant des outils déclaratifs et compatibles GitOps.
Utiliser Cluster API (CAPI). Un cluster de gestion exécute des contrôleurs CAPI qui réconcilient les ressources `Cluster` et `Machine` pour provisionner et configurer les clusters de charge de travail à travers divers fournisseurs de cloud.
Pourquoi: CAPI transforme la gestion de clusters en un workflow Kubernetes déclaratif, permettant le provisionnement et les mises à niveau cohérents, automatisés et contrôlés par version de clusters entiers.
Faire évoluer les API de plateforme (définies comme des CRD) sans rompre la compatibilité avec les utilisateurs existants ni nécessiter une migration "big bang".
Prendre en charge plusieurs versions dans la définition de la CRD (par exemple, v1beta1, v1). Implémenter un webhook de conversion pour traduire entre les versions, permettant aux nouveaux clients d'utiliser v1 tandis que les anciens clients continuent d'utiliser v1beta1 pour le même objet stocké.
Pourquoi: Les webhooks de conversion sont le mécanisme natif de Kubernetes pour permettre une évolution non disruptive des API, ce qui est essentiel pour un produit de plateforme stable.
Portails développeurs internes (IDP) et expérience développeur
Réduire la charge cognitive des développeurs et améliorer la découvrabilité en centralisant les outils, la documentation et les actifs logiciels.
Implémenter un portail développeur interne (IDP) à l'aide d'un framework comme CNCF Backstage. Remplir son catalogue logiciel, fournir des modèles logiciels pour l'échafaudage de nouveaux services et intégrer TechDocs pour la "documentation en tant que code".
Pourquoi: Un IDP agit comme un "guichet unique" pour les développeurs, offrant des chemins dorés et des capacités en libre-service qui abstraient la complexité de la plateforme et accélèrent l'intégration et le développement.
Fournir un inventaire unique et fiable de tous les logiciels de l'organisation, y compris la propriété, les dépendances et le statut opérationnel.
Implémenter un catalogue logiciel (par exemple, le catalogue logiciel Backstage) peuplé via des fichiers `catalog-info.yaml` dans les dépôts Git. Cela crée un registre central et consultable de services, bibliothèques, APIs, etc.
Pourquoi: Un catalogue résout les problèmes de découvrabilité ("quels services existent ?") et de propriété ("à qui dois-je m'adresser pour ce service ?"), ce qui est essentiel pour la mise à l'échelle des architectures de microservices.
Permettre aux développeurs de créer de nouveaux services prêts pour la production, conformes aux normes de l'organisation, en quelques minutes.
Utiliser un outil d'échafaudage comme les modèles logiciels Backstage. Définir des modèles qui génèrent un nouveau dépôt Git avec une structure de projet standard, une configuration de pipeline CI/CD, des tableaux de bord d'observabilité et `catalog-info.yaml`.
Pourquoi: Les modèles codifient les meilleures pratiques et offrent une "voie pavée" aux développeurs, réduisant considérablement le temps jusqu'au premier commit et garantissant que les nouveaux services sont créés avec la sécurité, l'observabilité et la conformité intégrées.
S'assurer que la documentation technique est à jour, versionnée et co-localisée avec le logiciel qu'elle décrit.
Adopter une approche "docs-as-code". Stocker la documentation dans des fichiers Markdown au sein du dépôt Git du service. Utiliser un outil comme Backstage TechDocs pour construire et rendre automatiquement cette documentation dans l'IDP.
Pourquoi: Ce modèle traite la documentation comme du code - elle peut être révisée dans les pull requests et est versionnée aux côtés de la fonctionnalité qu'elle décrit, évitant ainsi la documentation obsolète ou périmée.
Mesurer votre plateforme
Mesurer l'efficacité de la plateforme et son impact sur la performance de livraison logicielle.
Suivre les quatre métriques DORA : Fréquence de déploiement (vélocité), Temps de passage des changements (vélocité), Taux d'échec des changements (stabilité) et Temps de restauration du service (MTTR, stabilité).
Pourquoi: Les métriques DORA sont des mesures standard de l'industrie, axées sur les résultats, dont il est prouvé qu'elles sont corrélées avec la performance organisationnelle. Elles offrent une vue équilibrée de la vitesse et de la stabilité.
Fournir une visibilité précise et granulaire des coûts aux équipes utilisant une plateforme Kubernetes partagée.
Déployer un outil FinOps comme OpenCost ou Kubecost. Attribuer les coûts aux charges de travail en fonction de leur consommation réelle de ressources au fil du temps. Allouer proportionnellement les coûts partagés du cluster (par exemple, composants système, surcoût de nœud).
Pourquoi: Une facturation/refacturation précise favorise la responsabilisation et encourage les équipes à optimiser l'utilisation des ressources. Sans cela, les coûts de la plateforme partagée sont opaques et difficiles à gérer.
Mesurer si la plateforme apporte réellement de la valeur et est utilisée par les équipes de développement.
Suivre le taux d'adoption des fonctionnalités clés de la plateforme, en particulier les modèles de chemins dorés et les pipelines CI/CD partagés. Compléter avec des enquêtes de satisfaction des développeurs (de type NPS).
Pourquoi: Un taux d'adoption élevé des fonctionnalités optionnelles et orientées de la plateforme est un signe fort que la plateforme résout de réels problèmes. Une faible adoption indique une inadéquation avec les besoins des développeurs.
Évaluer l'état actuel de la plateforme et créer une feuille de route pour l'amélioration.
Utiliser un modèle de maturité de plateforme pour évaluer les capacités selon plusieurs dimensions : par exemple, Libre-service, Observabilité, Sécurité, Fiabilité et Gouvernance. Définir des niveaux allant de l'ad hoc/manuel au entièrement automatisé et optimisé.
Pourquoi: Un modèle de maturité fournit un cadre structuré pour l'auto-évaluation, aide à identifier les points faibles et aligne l'équipe sur une vision stratégique de l'évolution de la plateforme.