<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Blog | WeScale</title>
    <link>https://blog.wescale.fr</link>
    <description>Retrouvez l'ensemble des articles &amp; média des experts de la communauté WeScale.</description>
    <language>fr</language>
    <pubDate>Thu, 17 Sep 2026 07:37:47 GMT</pubDate>
    <dc:date>2026-09-17T07:37:47Z</dc:date>
    <dc:language>fr</dc:language>
    <item>
      <title>PCA multi-région avec pgEdge : un POC actif-actif sur Kubernetes</title>
      <link>https://blog.wescale.fr/pca-multi-region-avec-pgedge-un-poc-actif-actif-sur-kubernetes</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/pca-multi-region-avec-pgedge-un-poc-actif-actif-sur-kubernetes" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/image-Sep-15-2026-03-05-40-4509-PM.png" alt="PCA multi-région avec pgEdge : un POC actif-actif sur Kubernetes" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;div class="post-body"&gt; 
 &lt;p&gt;&lt;strong&gt;Résumé&lt;/strong&gt; : Construire un Plan de Continuité d'Activité (PCA) multi-région avec pgEdge Distributed Postgres et son chart Helm officiel : un POC complet sur deux clusters kind, avec application de test, observabilité de la réplication Spock et un regard critique sur les forces et les faiblesses de l'approche active-active.&lt;/p&gt; 
 &lt;p&gt;L'intégralité des fichiers (configs kind, values Helm, manifestes, application de test, scripts) est disponible dans le repo &lt;a href="https://github.com/wescale/pgedge-pca-poc" style="text-decoration: underline; font-weight: bold;"&gt;&lt;span style="text-decoration: underline; font-weight: bold;"&gt;wescale/pgedge-pca-poc&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt; 
 &lt;h2&gt;pgEdge, la rolls du PCA pgSQL ?&lt;/h2&gt; 
 &lt;p&gt;Avoir un cluster PostgreSQL hautement disponible repose sur un schéma tout à fait classique primaire/standby : une instance active, d'autres instances passives alimentées par réplication physique (streaming ou restauration de WAL (Write-Ahead Logging) depuis un object store). Ce modèle fonctionne bien et est bien outillé. Sur Kubernetes, &lt;a href="https://cloudnative-pg.io/"&gt;CloudNativePG&lt;/a&gt; le gère nativement avec ses replicaset clusters.&lt;/p&gt; 
 &lt;p&gt;Mais lorsque l'on souhaite adresser un PCA multi région, les choses deviennent plus complexes. Le setup précédent actif/passif possède un inconvénient majeur. Comment gérer la bascule vers la seconde région ? Comment éviter le split brain ?&lt;/p&gt; 
 &lt;p&gt;Une approche élégante est le passage en actif-actif : chaque région possède un node Postgres accessible en lecture et en écriture, et les écritures sont répliquées logiquement vers les autres nodes. En cas de perte d'une région, il n'y a aucune instance à promouvoir : l'autre région fonctionne déjà. Le Recovery Time Objective (RTO) se réduit au temps de re-routage du trafic (DNS, anycast, etc), et le Recovery Point Objective (RPO) correspond au lag de réplication logique au moment de l'incident. Ce lag est lié à la réplication qui reste asynchrone.&lt;/p&gt; 
 &lt;p&gt;C'est exactement ce que propose &lt;a href="https://www.pgedge.com"&gt;pgEdge&lt;/a&gt; depuis fin 2025. Son chart Helm s'appuie sur CloudNativePG (CNPG). L'opérateur est devenu standard pour Postgres sur Kubernetes.&lt;/p&gt; 
 &lt;h2&gt;pgEdge en deux mots&lt;/h2&gt; 
 &lt;p&gt;pgEdge Distributed Postgres est un PostgreSQL standard (16, 17 ou 18) enrichi d'extensions. Il est désormais entièrement open source sous licence PostgreSQL :&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Spock v5&lt;/strong&gt; : Réplication logique multi-master (active-active), gestion de conflits, replication sets, failover slots&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Snowflake&lt;/strong&gt; : Génération de séquences uniques distribuées pour prévenir les collisions SERIAL en multi-master (à intégrer dès la conception d'un cluster actif/actif).&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Chart Helm pgedge&lt;/strong&gt; : Orchestre N nodes pgEdge, chacun étant un cluster CloudNativePG (primaire + standbys), et initialise la topologie Spock&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;Le point d'architecture clé : chaque node pgEdge est un cluster CNPG complet. La haute disponibilité intra-région est assurée par la réplication physique de CNPG (failover automatique en secondes), configurée ici en mode synchrone. La réplication gérée par CNPG est asynchrone par défaut, c'est un choix explicite. La réplication inter-régions, elle, est logique et asynchrone via Spock.&lt;/p&gt; 
 &lt;p&gt;Spock v5 apporte les failover slots et le delayed feedback : si le primaire d'un node CNPG bascule sur un standby, les slots de réplication logique survivent et la topologie active-active se rétablit sans intervention.&lt;/p&gt; 
 &lt;h2&gt;Architecture du POC&lt;/h2&gt; 
 &lt;p&gt;On simule deux régions avec deux clusters kind. Les deux clusters partagent le réseau Docker kind, ce qui permet de simuler la connectivité inter-régions avec &lt;a href="https://metallb.io/"&gt;MetalLB&lt;/a&gt; (IPs stables) et un patch CoreDNS (résolution croisée). En production, ces deux rôles seraient tenus par un réseau inter-régions (VPC peering, Cilium ClusterMesh, Submariner) et un vrai DNS.&lt;/p&gt;  
 &lt;p&gt;Ci-dessous le cheminement d'une écriture qui illustre la combinaison des deux niveaux de réplication :&lt;/p&gt;  
 &lt;p&gt;Et le scénario PCA proprement dit :&lt;/p&gt;  
 &lt;h2&gt;Mise en place&lt;/h2&gt; 
 &lt;h3&gt;Prérequis&lt;/h3&gt; 
 &lt;p&gt;Le chart pgEdge nécessite deux opérateurs préinstallés dans chaque cluster : CloudNativePG (qui gère les clusters Postgres) et cert-manager (qui émet l'autorité de certification et les certificats clients des utilisateurs managés). Pour le contexte kind, deux briques complémentaires sont nécessaires : MetalLB, avec un pool d'IPs différents par cluster pour exposer les primaires, et un patch CoreDNS qui résout les hostnames inter-clusters (&lt;code&gt;n1.pgedge.local&lt;/code&gt;, &lt;code&gt;n2.pgedge.local&lt;/code&gt;) vers les IPs MetalLB dans les deux clusters.&lt;/p&gt; 
 &lt;h3&gt;Déploiement en deux temps&lt;/h3&gt; 
 &lt;p&gt;Le chart s'installe depuis le repo officiel :&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;helm repo add pgedge https://pgedge.github.io/charts&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Le déploiement doit suivre un ordre précis en deux phases. D'abord la région A, sans initialiser Spock (&lt;code&gt;initSpock: false&lt;/code&gt;) puisque n2 n'existe pas encore. Puis la région B, avec &lt;code&gt;initSpock: true&lt;/code&gt; : c'est à ce moment que le job &lt;code&gt;init-spock&lt;/code&gt; crée la topologie de réplication croisée sur les deux nodes.&lt;/p&gt; 
 &lt;p&gt;Quatre options du chart portent l'ensemble de la logique multi-cluster :&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;code&gt;initSpock&lt;/code&gt; : Active le job d'initialisation Spock (région B uniquement)&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;provisionCerts&lt;/code&gt; : Émet la CA cliente via cert-manager (région A uniquement)&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;externalNodes&lt;/code&gt; : Déclare les nodes distants et leurs endpoints de réplication&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;internalHostname&lt;/code&gt; : Service cluster-local utilisé pour les health-checks internes&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;L'extrait de values suivant illustre la configuration de la région A :&lt;/p&gt; 
 &lt;pre&gt;&lt;span style="background-color: #ffffff;"&gt;&lt;code&gt;&lt;span style="font-size: 16px;"&gt;pgEdge: appName: pgedge initSpock: false # n2 n'existe pas encore provisionCerts: true # la CA cliente est émise ici, une seule fois nodes: - name: n1 hostname: n1.pgedge.local # endpoint vu par n2 pour la réplication internalHostname: pgedge-n1-rw # service local pour les health-checks clusterSpec: instances: 3 postgresql: synchronous: { method: any, number: 1, dataDurability: required } externalNodes: - name: n2 hostname: n2.pgedge.local extraResources: - apiVersion: v1 kind: Service metadata: name: pgedge-n1-external annotations: metallb.universe.tf/loadBalancerIPs: 172.18.255.200 spec: type: LoadBalancer selector: { cnpg.io/cluster: pgedge-n1, cnpg.io/instanceRole: primary } ports: [{ name: postgres, port: 5432, targetPort: 5432 }] clusterSpec: certificates: serverAltDNSNames: [n1.pgedge.local] monitoring: enablePodMonitor: true&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/pre&gt; 
 &lt;p&gt;À noter que le Service LoadBalancer sera déclaré dans les &lt;code&gt;extraResources&lt;/code&gt; à la place d'être appliqué séparément après l'installation.&lt;/p&gt; 
 &lt;h3&gt;Partage des certificats entre clusters&lt;/h3&gt; 
 &lt;p&gt;Les utilisateurs managés (&lt;code&gt;app&lt;/code&gt;, &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;pgedge&lt;/code&gt; pour la réplication, &lt;code&gt;streaming_replica&lt;/code&gt; pour la réplication physique intra-CNPG) s'authentifient par certificat client. Les deux régions doivent donc partager la même CA cliente et les mêmes certificats, émis une seule fois par la région A.&lt;/p&gt; 
 &lt;p&gt;Cinq secrets sont à copier de la région A vers la région B : &lt;code&gt;client-ca-key-pair&lt;/code&gt;, &lt;code&gt;pgedge-client-cert&lt;/code&gt;, &lt;code&gt;admin-client-cert&lt;/code&gt;, &lt;code&gt;app-client-cert&lt;/code&gt; et &lt;code&gt;streaming-replica-client-cert&lt;/code&gt;. Une fois la copie effectuée, on vérifie par différence que seuls les secrets légitimes divergent entre les deux namespaces (les secrets serveur par node, propres à chaque cluster CNPG).&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;À noter pour un setup en production :&lt;/strong&gt; Un simple &lt;code&gt;kubectl get secret | kubectl apply&lt;/code&gt; convient pour un POC. En production, cette commande fait transiter des clés privées entre clusters : idéalement on pensera à utiliser un outil dédié (External Secrets Operator + Vault par exemple).&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;h3&gt;Initialisation du schéma applicatif&lt;/h3&gt; 
 &lt;h4&gt;La gestion globale du DDL et du DCL par pgEdge&lt;/h4&gt; 
 &lt;p&gt;Avec les versions récentes de pgEdge, la réplication automatique de la structure et de la sécurité (Auto-DDL / DDX) est nativement active. Contrairement aux limitations historiques de la réplication logique "standard", pgEdge ne se contente pas de propager la structure des tables : il capture et réplique l'intégralité du cycle de vie des objets, incluant la gestion des rôles (&lt;code&gt;CREATE ROLE&lt;/code&gt;), des propriétaires (&lt;code&gt;ALTER OWNER&lt;/code&gt;) et des permissions (&lt;code&gt;GRANT&lt;/code&gt;/&lt;code&gt;REVOKE&lt;/code&gt;).&lt;/p&gt; 
 &lt;p&gt;Cela signifie qu'un script d'initialisation exécuté sur un nœud unique (le nœud principal de la région A) est automatiquement et entièrement rejoué sur les autres nœuds du cluster. Les tables créées sont également ajoutées au replication set sans intervention manuelle.&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;&lt;span style="font-size: 16px;"&gt;-- À EXÉCUTER UNIQUEMENT SUR LE NŒUD 1 (La propagation est automatique) -- 1. Le rôle applicatif est créé et répliqué partout CREATE ROLE app WITH LOGIN; -- 2. La table se propage automatiquement via l'Auto-DDL CREATE TABLE public.messages ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), region text NOT NULL, content text NOT NULL, created_at timestamptz NOT NULL DEFAULT now() ); -- 3. Le changement de propriétaire est également répliqué ALTER TABLE public.messages OWNER TO app;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;L'attribution du propriétaire (&lt;code&gt;ALTER TABLE ... OWNER TO app&lt;/code&gt;) est indispensable pour que l'application puisse interagir avec la base. Grâce au moteur de réplication de pgEdge, cette commande (ainsi que les éventuels &lt;code&gt;GRANT&lt;/code&gt;) est interceptée comme une modification et est appliquée sur le nœud 2.&lt;/p&gt; 
 &lt;h4&gt;Et la gestion des clés primaires ?&lt;/h4&gt; 
 &lt;p&gt;Ça ne vous aura pas échappé mais multi master rime souvent avec casse-tête de l'auto-incrément pour les clés primaires. Celle de la table est un &lt;code&gt;uuid DEFAULT gen_random_uuid()&lt;/code&gt;.&lt;/p&gt; 
 &lt;p&gt;Pourquoi ce choix ? En actif-actif, les écritures peuvent se faire sur les deux régions, donc un &lt;code&gt;BIGSERIAL&lt;/code&gt; classique produirait des collisions entre régions.&lt;/p&gt; 
 &lt;p&gt;Une autre alternative pgEdge est l'extension Snowflake (IDs 64 bits uniques par nœud). C'est préférable si vous tenez aux clés triables (ce qui peut être le cas pour certains CMS par exemple).&lt;/p&gt; 
 &lt;h3&gt;L'application de test&lt;/h3&gt; 
 &lt;p&gt;Grâce à mon ami &lt;a href="https://claude.ai"&gt;Claude&lt;/a&gt;, j'ai généré une petite app Flask qui est déployée dans chaque région, connectée à son node local en mTLS (certificat client de l'utilisateur &lt;code&gt;app&lt;/code&gt;). Elle expose une page HTML avec un formulaire d'injection et la liste des derniers messages, plus une API JSON (&lt;code&gt;GET&lt;/code&gt;/&lt;code&gt;POST /api/messages&lt;/code&gt;, &lt;code&gt;GET /healthz&lt;/code&gt;).&lt;/p&gt; 
 &lt;p&gt;Chaque ligne porte sa région d'origine, et le bandeau indique le node Spock auquel l'app est connectée. On peut donc voir la réplication se faire en instantané.&lt;/p&gt;  
 &lt;h2&gt;Scénario 1 : Perte de la région A&lt;/h2&gt; 
 &lt;p&gt;On éteint toute la "région" A en stoppant ses conteneurs. La région B continue de fonctionner sans interruption ni reconfiguration : Le RTO applicatif est de 0 pour les utilisateurs. Pendant la panne, le slot de réplication vers n1 retient le WAL sur n2. C'est la métrique &lt;code&gt;retained_wal_bytes&lt;/code&gt; qu'il faut surveiller.&lt;/p&gt; 
 &lt;p&gt;Au retour à la vie de la région A, CNPG reconstruit son quorum, Spock rejoue le backlog, et les messages écrits pendant la panne apparaissent en région A. RPO sur ce scénario : zéro ligne perdue, car la région défaillante était la destination du backlog.&lt;/p&gt; 
 &lt;p&gt;Le cas défavorable est l'inverse : des transactions commitées sur A mais pas encore appliquées sur B au moment de la perte définitive de A sont perdues. Le RPO réel est le lag de réplication, d'où l'importance de le mesurer en continu.&lt;/p&gt; 
 &lt;h2&gt;Scénario 2 : La gestion d'un conflit&lt;/h2&gt; 
 &lt;p&gt;En mettant à jour la même ligne simultanément dans les deux régions, les deux &lt;code&gt;UPDATE&lt;/code&gt; sont appliqués localement. Spock détecte le conflit et le résout par défaut en last-update-wins (timestamp de commit) : la version au commit le plus récent l'emporte sur les deux nodes. A condition d'avoir activé &lt;code&gt;spock.save_resolutions&lt;/code&gt; (désactivé par défaut), chaque résolution est tracée dans &lt;code&gt;spock.resolutions&lt;/code&gt;. Aucune erreur n'est remontée à l'application. Cela reste cohérent et déterministe, MAIS c'est une sémantique que les équipes de dev doivent connaître et accepter. A noter : &lt;code&gt;track_commit_timestamp&lt;/code&gt; doit être à &lt;code&gt;on&lt;/code&gt; pour que la résolution par timestamp fonctionne.&lt;/p&gt; 
 &lt;p&gt;Au passage, cela répond à la question du split-brain de l'introduction, en la déplaçant plutôt qu'en la supprimant. L'actif-passif fait porter la partition réseau sur la disponibilité alors que l'actif-actif la fait porter sur la cohérence. Les divergences étant réconciliées après coup par le last-update-wins. Un problème de disponibilité qui se transforme en un problème de cohérence de données.&lt;/p&gt; 
 &lt;h2&gt;Observabilité de la stack&lt;/h2&gt; 
 &lt;p&gt;Un PCA, il faut le superviser au risque de décevoir le jour J… CNPG fournit déjà une base solide qu'il faut simplement compléter par des métriques spécifiques à Spock :&lt;/p&gt; 
 &lt;h3&gt;Les métriques CNPG natives&lt;/h3&gt; 
 &lt;p&gt;Chaque instance Postgres expose un exporter sur le port 9187. &lt;code&gt;clusterSpec.monitoring.enablePodMonitor: true&lt;/code&gt; dans les values crée les PodMonitors. On y trouve l'état des clusters, le lag de streaming intra-région, les WAL, les checkpoints. Le dashboard Grafana officiel &lt;a href="https://grafana.com/grafana/dashboards/20417-cloudnativepg/"&gt;CNPG (ID 20417)&lt;/a&gt; les couvre.&lt;/p&gt; 
 &lt;h3&gt;Les métriques Spock&lt;/h3&gt; 
 &lt;p&gt;Via les custom queries de l'exporter. C'est le cœur de la supervision du PCA. Une ConfigMap référencée par &lt;code&gt;customQueriesConfigMap&lt;/code&gt; dans les values ajoute quatre nouvelles métriques :&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Métrique&lt;/th&gt; 
    &lt;th&gt;Utilité&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;cnpg_spock_subscriptions_enabled&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;La réplication active-active est-elle en marche ?&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;cnpg_spock_replication_slots_active&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;La région distante consomme-t-elle son slot ?&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;cnpg_spock_replication_slots_retained_wal_bytes&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Combien de WAL s'accumule si la région distante est sourde ?&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;cnpg_spock_apply_lag_last_commit_age_seconds&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Quel est mon RPO effectif, en secondes ?&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;h3&gt;Les alertes&lt;/h3&gt; 
 &lt;p&gt;Une PrometheusRule décline ces métriques en alertes orientées PCA : souscription désactivée (critique - le RPO se dégrade en continu), slot inactif (région distante injoignable), WAL retenu au-delà d'1 Gio (risque de saturation du volume), et lag d'application supérieur à 60 s.&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;Point important :&lt;/strong&gt; Le lag de réplication EST votre RPO. Dans une architecture active-active asynchrone, l'engagement de RPO que vous pouvez contractualiser est le lag Spock observé en P99 (percentiles 99). C'est la métrique à mettre en SLO, à grapher, et à tester sous une charge réaliste.&lt;/p&gt; 
 &lt;/blockquote&gt;  
 &lt;h2&gt;Forces et faiblesses&lt;/h2&gt; 
 &lt;p&gt;Six forces et faiblesses qui méritent d'être développées, parce qu'elles conditionnent l'utilisation de pgEdge :&lt;/p&gt; 
 &lt;h3&gt;1. Plan de Continuité d'Activité (PCA)&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : RTO quasi nul : Il n'y a rien à promouvoir manuellement en cas de panne, éliminant ainsi le besoin d'une procédure complexe de bascule (failover) de la base de données.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : RPO non nul : Par design, le RPO reste dépendant du décalage (lag) de la réplication asynchrone entre les clusters. Il faudra donc prendre soin de monitorer et alerter sur cette métrique (&lt;code&gt;replicationLag&lt;/code&gt;)&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;2. Cohérence des Données&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : La résolution des conflits est déterministe et entièrement journalisée.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : Fonctionnement en Last-update-wins (la dernière écriture l'emporte) de manière silencieuse : Absence de transactions distribuées et de cohérence forte globale.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;3. Opérations &amp;amp; Maintenance&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : Excellente robustesse opérationnelle grâce aux fondations de CNPG (failover intra-région éprouvé, gestion native des sauvegardes et des mises à niveau) : Intégration des failover slots avec Spock v5.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : La résolution des conflits d'écriture reste un point noir. Si deux utilisateurs modifient la même ligne en même temps dans deux régions différentes, c'est la règle du "dernier qui parle a raison" (par timestamp) qui s'applique par défaut. Les données écrasées dans la région "perdante" sont envoyées dans une table d'antécédents (&lt;code&gt;spock.resolutions&lt;/code&gt;), ce qui oblige les équipes de production à surveiller et gérer manuellement ces écarts pour éviter les potentielles incohérences de données.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;4. Écosystème &amp;amp; Maturité&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : Solution 100 % open source sous licence PostgreSQL. S'appuie sur du Postgres "vanilla" (versions 16, 17 ou 18).&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : Le Chart Helm est encore très jeune (v0.2), ce qui implique que l'API des values est susceptible de changer et que les retours d'expérience en production sont encore rares.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;5. Gestion Multi-cluster&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : La mécanique globale (&lt;code&gt;initSpock&lt;/code&gt;, &lt;code&gt;provisionCerts&lt;/code&gt;, &lt;code&gt;externalNodes&lt;/code&gt;) est simple, claire et explicite.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : La gestion de la communication (routage réseau cross-cluster et distribution sécurisée des certificats) reste entièrement à votre charge.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;6. Impact Applicatif&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : Excellentes performances d'accès avec une latence locale en lecture comme en écriture dans chaque région.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : Quelques contraintes de design pour le développement : obligation d'utiliser des Clés Primaires de type UUID ou Snowflake, exclusion du type &lt;code&gt;SERIAL&lt;/code&gt;, et nécessité d'auditer les séquences ainsi que les triggers.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h2&gt;Conclusion&lt;/h2&gt; 
 &lt;p&gt;Ce POC démontre avec le chart Helm pgEdge et CloudNativePG qu'il est facile de mettre en place une topologie Postgres active-active multi-région. Le scénario PCA fonctionne. On éteint une région, l'autre continue, le backlog se rejoue au retour et l'observabilité nécessaire se construit proprement avec les briques CNPG existantes.&lt;/p&gt; 
 &lt;p&gt;La vraie décision n'est pas technique mais plutôt architecturale : accepter un RPO égal au lag de réplication et une sémantique de résolution de conflits last-update-wins, en échange d'un RTO quasi nul et de deux régions réellement actives. Pour beaucoup de workloads, c'est un excellent choix. Pour les autres, ce POC aura je pense le mérite d'enrichir les discussions.&lt;/p&gt; 
 &lt;h3&gt;Mon conseil&lt;/h3&gt; 
 &lt;p&gt;Si votre workload le permet, dirigez toutes les écritures vers une seule région et réservez la seconde à la lecture et au rôle de secours. Vous supprimez à la source le point qui fait le "défaut" de l'actif-actif, les conflits et leur résolution silencieuse en last-update-wins. On bénéficie de l'essentiel : une cible avec des données chaudes et synchronisées qui peut permettre de prendre le relais sans délai sur incident.&lt;/p&gt; 
 &lt;p&gt;L'intégralité des fichiers (configs kind, values Helm, manifestes, application de test, scripts) est disponible dans le repo &lt;a href="https://github.com/wescale/pgedge-pca-poc" style="font-weight: bold; text-decoration: underline;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-weight: bold;"&gt;wescale/pgedge-pca-poc&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/pca-multi-region-avec-pgedge-un-poc-actif-actif-sur-kubernetes" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/image-Sep-15-2026-03-05-40-4509-PM.png" alt="PCA multi-région avec pgEdge : un POC actif-actif sur Kubernetes" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;div class="post-body"&gt; 
 &lt;p&gt;&lt;strong&gt;Résumé&lt;/strong&gt; : Construire un Plan de Continuité d'Activité (PCA) multi-région avec pgEdge Distributed Postgres et son chart Helm officiel : un POC complet sur deux clusters kind, avec application de test, observabilité de la réplication Spock et un regard critique sur les forces et les faiblesses de l'approche active-active.&lt;/p&gt; 
 &lt;p&gt;L'intégralité des fichiers (configs kind, values Helm, manifestes, application de test, scripts) est disponible dans le repo &lt;a href="https://github.com/wescale/pgedge-pca-poc" style="text-decoration: underline; font-weight: bold;"&gt;&lt;span style="text-decoration: underline; font-weight: bold;"&gt;wescale/pgedge-pca-poc&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt; 
 &lt;h2&gt;pgEdge, la rolls du PCA pgSQL ?&lt;/h2&gt; 
 &lt;p&gt;Avoir un cluster PostgreSQL hautement disponible repose sur un schéma tout à fait classique primaire/standby : une instance active, d'autres instances passives alimentées par réplication physique (streaming ou restauration de WAL (Write-Ahead Logging) depuis un object store). Ce modèle fonctionne bien et est bien outillé. Sur Kubernetes, &lt;a href="https://cloudnative-pg.io/"&gt;CloudNativePG&lt;/a&gt; le gère nativement avec ses replicaset clusters.&lt;/p&gt; 
 &lt;p&gt;Mais lorsque l'on souhaite adresser un PCA multi région, les choses deviennent plus complexes. Le setup précédent actif/passif possède un inconvénient majeur. Comment gérer la bascule vers la seconde région ? Comment éviter le split brain ?&lt;/p&gt; 
 &lt;p&gt;Une approche élégante est le passage en actif-actif : chaque région possède un node Postgres accessible en lecture et en écriture, et les écritures sont répliquées logiquement vers les autres nodes. En cas de perte d'une région, il n'y a aucune instance à promouvoir : l'autre région fonctionne déjà. Le Recovery Time Objective (RTO) se réduit au temps de re-routage du trafic (DNS, anycast, etc), et le Recovery Point Objective (RPO) correspond au lag de réplication logique au moment de l'incident. Ce lag est lié à la réplication qui reste asynchrone.&lt;/p&gt; 
 &lt;p&gt;C'est exactement ce que propose &lt;a href="https://www.pgedge.com"&gt;pgEdge&lt;/a&gt; depuis fin 2025. Son chart Helm s'appuie sur CloudNativePG (CNPG). L'opérateur est devenu standard pour Postgres sur Kubernetes.&lt;/p&gt; 
 &lt;h2&gt;pgEdge en deux mots&lt;/h2&gt; 
 &lt;p&gt;pgEdge Distributed Postgres est un PostgreSQL standard (16, 17 ou 18) enrichi d'extensions. Il est désormais entièrement open source sous licence PostgreSQL :&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Spock v5&lt;/strong&gt; : Réplication logique multi-master (active-active), gestion de conflits, replication sets, failover slots&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Snowflake&lt;/strong&gt; : Génération de séquences uniques distribuées pour prévenir les collisions SERIAL en multi-master (à intégrer dès la conception d'un cluster actif/actif).&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Chart Helm pgedge&lt;/strong&gt; : Orchestre N nodes pgEdge, chacun étant un cluster CloudNativePG (primaire + standbys), et initialise la topologie Spock&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;Le point d'architecture clé : chaque node pgEdge est un cluster CNPG complet. La haute disponibilité intra-région est assurée par la réplication physique de CNPG (failover automatique en secondes), configurée ici en mode synchrone. La réplication gérée par CNPG est asynchrone par défaut, c'est un choix explicite. La réplication inter-régions, elle, est logique et asynchrone via Spock.&lt;/p&gt; 
 &lt;p&gt;Spock v5 apporte les failover slots et le delayed feedback : si le primaire d'un node CNPG bascule sur un standby, les slots de réplication logique survivent et la topologie active-active se rétablit sans intervention.&lt;/p&gt; 
 &lt;h2&gt;Architecture du POC&lt;/h2&gt; 
 &lt;p&gt;On simule deux régions avec deux clusters kind. Les deux clusters partagent le réseau Docker kind, ce qui permet de simuler la connectivité inter-régions avec &lt;a href="https://metallb.io/"&gt;MetalLB&lt;/a&gt; (IPs stables) et un patch CoreDNS (résolution croisée). En production, ces deux rôles seraient tenus par un réseau inter-régions (VPC peering, Cilium ClusterMesh, Submariner) et un vrai DNS.&lt;/p&gt;  
 &lt;p&gt;Ci-dessous le cheminement d'une écriture qui illustre la combinaison des deux niveaux de réplication :&lt;/p&gt;  
 &lt;p&gt;Et le scénario PCA proprement dit :&lt;/p&gt;  
 &lt;h2&gt;Mise en place&lt;/h2&gt; 
 &lt;h3&gt;Prérequis&lt;/h3&gt; 
 &lt;p&gt;Le chart pgEdge nécessite deux opérateurs préinstallés dans chaque cluster : CloudNativePG (qui gère les clusters Postgres) et cert-manager (qui émet l'autorité de certification et les certificats clients des utilisateurs managés). Pour le contexte kind, deux briques complémentaires sont nécessaires : MetalLB, avec un pool d'IPs différents par cluster pour exposer les primaires, et un patch CoreDNS qui résout les hostnames inter-clusters (&lt;code&gt;n1.pgedge.local&lt;/code&gt;, &lt;code&gt;n2.pgedge.local&lt;/code&gt;) vers les IPs MetalLB dans les deux clusters.&lt;/p&gt; 
 &lt;h3&gt;Déploiement en deux temps&lt;/h3&gt; 
 &lt;p&gt;Le chart s'installe depuis le repo officiel :&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;helm repo add pgedge https://pgedge.github.io/charts&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Le déploiement doit suivre un ordre précis en deux phases. D'abord la région A, sans initialiser Spock (&lt;code&gt;initSpock: false&lt;/code&gt;) puisque n2 n'existe pas encore. Puis la région B, avec &lt;code&gt;initSpock: true&lt;/code&gt; : c'est à ce moment que le job &lt;code&gt;init-spock&lt;/code&gt; crée la topologie de réplication croisée sur les deux nodes.&lt;/p&gt; 
 &lt;p&gt;Quatre options du chart portent l'ensemble de la logique multi-cluster :&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;code&gt;initSpock&lt;/code&gt; : Active le job d'initialisation Spock (région B uniquement)&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;provisionCerts&lt;/code&gt; : Émet la CA cliente via cert-manager (région A uniquement)&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;externalNodes&lt;/code&gt; : Déclare les nodes distants et leurs endpoints de réplication&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;internalHostname&lt;/code&gt; : Service cluster-local utilisé pour les health-checks internes&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;L'extrait de values suivant illustre la configuration de la région A :&lt;/p&gt; 
 &lt;pre&gt;&lt;span style="background-color: #ffffff;"&gt;&lt;code&gt;&lt;span style="font-size: 16px;"&gt;pgEdge: appName: pgedge initSpock: false # n2 n'existe pas encore provisionCerts: true # la CA cliente est émise ici, une seule fois nodes: - name: n1 hostname: n1.pgedge.local # endpoint vu par n2 pour la réplication internalHostname: pgedge-n1-rw # service local pour les health-checks clusterSpec: instances: 3 postgresql: synchronous: { method: any, number: 1, dataDurability: required } externalNodes: - name: n2 hostname: n2.pgedge.local extraResources: - apiVersion: v1 kind: Service metadata: name: pgedge-n1-external annotations: metallb.universe.tf/loadBalancerIPs: 172.18.255.200 spec: type: LoadBalancer selector: { cnpg.io/cluster: pgedge-n1, cnpg.io/instanceRole: primary } ports: [{ name: postgres, port: 5432, targetPort: 5432 }] clusterSpec: certificates: serverAltDNSNames: [n1.pgedge.local] monitoring: enablePodMonitor: true&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/pre&gt; 
 &lt;p&gt;À noter que le Service LoadBalancer sera déclaré dans les &lt;code&gt;extraResources&lt;/code&gt; à la place d'être appliqué séparément après l'installation.&lt;/p&gt; 
 &lt;h3&gt;Partage des certificats entre clusters&lt;/h3&gt; 
 &lt;p&gt;Les utilisateurs managés (&lt;code&gt;app&lt;/code&gt;, &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;pgedge&lt;/code&gt; pour la réplication, &lt;code&gt;streaming_replica&lt;/code&gt; pour la réplication physique intra-CNPG) s'authentifient par certificat client. Les deux régions doivent donc partager la même CA cliente et les mêmes certificats, émis une seule fois par la région A.&lt;/p&gt; 
 &lt;p&gt;Cinq secrets sont à copier de la région A vers la région B : &lt;code&gt;client-ca-key-pair&lt;/code&gt;, &lt;code&gt;pgedge-client-cert&lt;/code&gt;, &lt;code&gt;admin-client-cert&lt;/code&gt;, &lt;code&gt;app-client-cert&lt;/code&gt; et &lt;code&gt;streaming-replica-client-cert&lt;/code&gt;. Une fois la copie effectuée, on vérifie par différence que seuls les secrets légitimes divergent entre les deux namespaces (les secrets serveur par node, propres à chaque cluster CNPG).&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;À noter pour un setup en production :&lt;/strong&gt; Un simple &lt;code&gt;kubectl get secret | kubectl apply&lt;/code&gt; convient pour un POC. En production, cette commande fait transiter des clés privées entre clusters : idéalement on pensera à utiliser un outil dédié (External Secrets Operator + Vault par exemple).&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;h3&gt;Initialisation du schéma applicatif&lt;/h3&gt; 
 &lt;h4&gt;La gestion globale du DDL et du DCL par pgEdge&lt;/h4&gt; 
 &lt;p&gt;Avec les versions récentes de pgEdge, la réplication automatique de la structure et de la sécurité (Auto-DDL / DDX) est nativement active. Contrairement aux limitations historiques de la réplication logique "standard", pgEdge ne se contente pas de propager la structure des tables : il capture et réplique l'intégralité du cycle de vie des objets, incluant la gestion des rôles (&lt;code&gt;CREATE ROLE&lt;/code&gt;), des propriétaires (&lt;code&gt;ALTER OWNER&lt;/code&gt;) et des permissions (&lt;code&gt;GRANT&lt;/code&gt;/&lt;code&gt;REVOKE&lt;/code&gt;).&lt;/p&gt; 
 &lt;p&gt;Cela signifie qu'un script d'initialisation exécuté sur un nœud unique (le nœud principal de la région A) est automatiquement et entièrement rejoué sur les autres nœuds du cluster. Les tables créées sont également ajoutées au replication set sans intervention manuelle.&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;&lt;span style="font-size: 16px;"&gt;-- À EXÉCUTER UNIQUEMENT SUR LE NŒUD 1 (La propagation est automatique) -- 1. Le rôle applicatif est créé et répliqué partout CREATE ROLE app WITH LOGIN; -- 2. La table se propage automatiquement via l'Auto-DDL CREATE TABLE public.messages ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), region text NOT NULL, content text NOT NULL, created_at timestamptz NOT NULL DEFAULT now() ); -- 3. Le changement de propriétaire est également répliqué ALTER TABLE public.messages OWNER TO app;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;L'attribution du propriétaire (&lt;code&gt;ALTER TABLE ... OWNER TO app&lt;/code&gt;) est indispensable pour que l'application puisse interagir avec la base. Grâce au moteur de réplication de pgEdge, cette commande (ainsi que les éventuels &lt;code&gt;GRANT&lt;/code&gt;) est interceptée comme une modification et est appliquée sur le nœud 2.&lt;/p&gt; 
 &lt;h4&gt;Et la gestion des clés primaires ?&lt;/h4&gt; 
 &lt;p&gt;Ça ne vous aura pas échappé mais multi master rime souvent avec casse-tête de l'auto-incrément pour les clés primaires. Celle de la table est un &lt;code&gt;uuid DEFAULT gen_random_uuid()&lt;/code&gt;.&lt;/p&gt; 
 &lt;p&gt;Pourquoi ce choix ? En actif-actif, les écritures peuvent se faire sur les deux régions, donc un &lt;code&gt;BIGSERIAL&lt;/code&gt; classique produirait des collisions entre régions.&lt;/p&gt; 
 &lt;p&gt;Une autre alternative pgEdge est l'extension Snowflake (IDs 64 bits uniques par nœud). C'est préférable si vous tenez aux clés triables (ce qui peut être le cas pour certains CMS par exemple).&lt;/p&gt; 
 &lt;h3&gt;L'application de test&lt;/h3&gt; 
 &lt;p&gt;Grâce à mon ami &lt;a href="https://claude.ai"&gt;Claude&lt;/a&gt;, j'ai généré une petite app Flask qui est déployée dans chaque région, connectée à son node local en mTLS (certificat client de l'utilisateur &lt;code&gt;app&lt;/code&gt;). Elle expose une page HTML avec un formulaire d'injection et la liste des derniers messages, plus une API JSON (&lt;code&gt;GET&lt;/code&gt;/&lt;code&gt;POST /api/messages&lt;/code&gt;, &lt;code&gt;GET /healthz&lt;/code&gt;).&lt;/p&gt; 
 &lt;p&gt;Chaque ligne porte sa région d'origine, et le bandeau indique le node Spock auquel l'app est connectée. On peut donc voir la réplication se faire en instantané.&lt;/p&gt;  
 &lt;h2&gt;Scénario 1 : Perte de la région A&lt;/h2&gt; 
 &lt;p&gt;On éteint toute la "région" A en stoppant ses conteneurs. La région B continue de fonctionner sans interruption ni reconfiguration : Le RTO applicatif est de 0 pour les utilisateurs. Pendant la panne, le slot de réplication vers n1 retient le WAL sur n2. C'est la métrique &lt;code&gt;retained_wal_bytes&lt;/code&gt; qu'il faut surveiller.&lt;/p&gt; 
 &lt;p&gt;Au retour à la vie de la région A, CNPG reconstruit son quorum, Spock rejoue le backlog, et les messages écrits pendant la panne apparaissent en région A. RPO sur ce scénario : zéro ligne perdue, car la région défaillante était la destination du backlog.&lt;/p&gt; 
 &lt;p&gt;Le cas défavorable est l'inverse : des transactions commitées sur A mais pas encore appliquées sur B au moment de la perte définitive de A sont perdues. Le RPO réel est le lag de réplication, d'où l'importance de le mesurer en continu.&lt;/p&gt; 
 &lt;h2&gt;Scénario 2 : La gestion d'un conflit&lt;/h2&gt; 
 &lt;p&gt;En mettant à jour la même ligne simultanément dans les deux régions, les deux &lt;code&gt;UPDATE&lt;/code&gt; sont appliqués localement. Spock détecte le conflit et le résout par défaut en last-update-wins (timestamp de commit) : la version au commit le plus récent l'emporte sur les deux nodes. A condition d'avoir activé &lt;code&gt;spock.save_resolutions&lt;/code&gt; (désactivé par défaut), chaque résolution est tracée dans &lt;code&gt;spock.resolutions&lt;/code&gt;. Aucune erreur n'est remontée à l'application. Cela reste cohérent et déterministe, MAIS c'est une sémantique que les équipes de dev doivent connaître et accepter. A noter : &lt;code&gt;track_commit_timestamp&lt;/code&gt; doit être à &lt;code&gt;on&lt;/code&gt; pour que la résolution par timestamp fonctionne.&lt;/p&gt; 
 &lt;p&gt;Au passage, cela répond à la question du split-brain de l'introduction, en la déplaçant plutôt qu'en la supprimant. L'actif-passif fait porter la partition réseau sur la disponibilité alors que l'actif-actif la fait porter sur la cohérence. Les divergences étant réconciliées après coup par le last-update-wins. Un problème de disponibilité qui se transforme en un problème de cohérence de données.&lt;/p&gt; 
 &lt;h2&gt;Observabilité de la stack&lt;/h2&gt; 
 &lt;p&gt;Un PCA, il faut le superviser au risque de décevoir le jour J… CNPG fournit déjà une base solide qu'il faut simplement compléter par des métriques spécifiques à Spock :&lt;/p&gt; 
 &lt;h3&gt;Les métriques CNPG natives&lt;/h3&gt; 
 &lt;p&gt;Chaque instance Postgres expose un exporter sur le port 9187. &lt;code&gt;clusterSpec.monitoring.enablePodMonitor: true&lt;/code&gt; dans les values crée les PodMonitors. On y trouve l'état des clusters, le lag de streaming intra-région, les WAL, les checkpoints. Le dashboard Grafana officiel &lt;a href="https://grafana.com/grafana/dashboards/20417-cloudnativepg/"&gt;CNPG (ID 20417)&lt;/a&gt; les couvre.&lt;/p&gt; 
 &lt;h3&gt;Les métriques Spock&lt;/h3&gt; 
 &lt;p&gt;Via les custom queries de l'exporter. C'est le cœur de la supervision du PCA. Une ConfigMap référencée par &lt;code&gt;customQueriesConfigMap&lt;/code&gt; dans les values ajoute quatre nouvelles métriques :&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Métrique&lt;/th&gt; 
    &lt;th&gt;Utilité&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;cnpg_spock_subscriptions_enabled&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;La réplication active-active est-elle en marche ?&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;cnpg_spock_replication_slots_active&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;La région distante consomme-t-elle son slot ?&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;cnpg_spock_replication_slots_retained_wal_bytes&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Combien de WAL s'accumule si la région distante est sourde ?&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;cnpg_spock_apply_lag_last_commit_age_seconds&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Quel est mon RPO effectif, en secondes ?&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;h3&gt;Les alertes&lt;/h3&gt; 
 &lt;p&gt;Une PrometheusRule décline ces métriques en alertes orientées PCA : souscription désactivée (critique - le RPO se dégrade en continu), slot inactif (région distante injoignable), WAL retenu au-delà d'1 Gio (risque de saturation du volume), et lag d'application supérieur à 60 s.&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;Point important :&lt;/strong&gt; Le lag de réplication EST votre RPO. Dans une architecture active-active asynchrone, l'engagement de RPO que vous pouvez contractualiser est le lag Spock observé en P99 (percentiles 99). C'est la métrique à mettre en SLO, à grapher, et à tester sous une charge réaliste.&lt;/p&gt; 
 &lt;/blockquote&gt;  
 &lt;h2&gt;Forces et faiblesses&lt;/h2&gt; 
 &lt;p&gt;Six forces et faiblesses qui méritent d'être développées, parce qu'elles conditionnent l'utilisation de pgEdge :&lt;/p&gt; 
 &lt;h3&gt;1. Plan de Continuité d'Activité (PCA)&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : RTO quasi nul : Il n'y a rien à promouvoir manuellement en cas de panne, éliminant ainsi le besoin d'une procédure complexe de bascule (failover) de la base de données.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : RPO non nul : Par design, le RPO reste dépendant du décalage (lag) de la réplication asynchrone entre les clusters. Il faudra donc prendre soin de monitorer et alerter sur cette métrique (&lt;code&gt;replicationLag&lt;/code&gt;)&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;2. Cohérence des Données&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : La résolution des conflits est déterministe et entièrement journalisée.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : Fonctionnement en Last-update-wins (la dernière écriture l'emporte) de manière silencieuse : Absence de transactions distribuées et de cohérence forte globale.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;3. Opérations &amp;amp; Maintenance&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : Excellente robustesse opérationnelle grâce aux fondations de CNPG (failover intra-région éprouvé, gestion native des sauvegardes et des mises à niveau) : Intégration des failover slots avec Spock v5.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : La résolution des conflits d'écriture reste un point noir. Si deux utilisateurs modifient la même ligne en même temps dans deux régions différentes, c'est la règle du "dernier qui parle a raison" (par timestamp) qui s'applique par défaut. Les données écrasées dans la région "perdante" sont envoyées dans une table d'antécédents (&lt;code&gt;spock.resolutions&lt;/code&gt;), ce qui oblige les équipes de production à surveiller et gérer manuellement ces écarts pour éviter les potentielles incohérences de données.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;4. Écosystème &amp;amp; Maturité&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : Solution 100 % open source sous licence PostgreSQL. S'appuie sur du Postgres "vanilla" (versions 16, 17 ou 18).&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : Le Chart Helm est encore très jeune (v0.2), ce qui implique que l'API des values est susceptible de changer et que les retours d'expérience en production sont encore rares.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;5. Gestion Multi-cluster&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : La mécanique globale (&lt;code&gt;initSpock&lt;/code&gt;, &lt;code&gt;provisionCerts&lt;/code&gt;, &lt;code&gt;externalNodes&lt;/code&gt;) est simple, claire et explicite.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : La gestion de la communication (routage réseau cross-cluster et distribution sécurisée des certificats) reste entièrement à votre charge.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;6. Impact Applicatif&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Forces&lt;/strong&gt; : Excellentes performances d'accès avec une latence locale en lecture comme en écriture dans chaque région.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Faiblesses&lt;/strong&gt; : Quelques contraintes de design pour le développement : obligation d'utiliser des Clés Primaires de type UUID ou Snowflake, exclusion du type &lt;code&gt;SERIAL&lt;/code&gt;, et nécessité d'auditer les séquences ainsi que les triggers.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h2&gt;Conclusion&lt;/h2&gt; 
 &lt;p&gt;Ce POC démontre avec le chart Helm pgEdge et CloudNativePG qu'il est facile de mettre en place une topologie Postgres active-active multi-région. Le scénario PCA fonctionne. On éteint une région, l'autre continue, le backlog se rejoue au retour et l'observabilité nécessaire se construit proprement avec les briques CNPG existantes.&lt;/p&gt; 
 &lt;p&gt;La vraie décision n'est pas technique mais plutôt architecturale : accepter un RPO égal au lag de réplication et une sémantique de résolution de conflits last-update-wins, en échange d'un RTO quasi nul et de deux régions réellement actives. Pour beaucoup de workloads, c'est un excellent choix. Pour les autres, ce POC aura je pense le mérite d'enrichir les discussions.&lt;/p&gt; 
 &lt;h3&gt;Mon conseil&lt;/h3&gt; 
 &lt;p&gt;Si votre workload le permet, dirigez toutes les écritures vers une seule région et réservez la seconde à la lecture et au rôle de secours. Vous supprimez à la source le point qui fait le "défaut" de l'actif-actif, les conflits et leur résolution silencieuse en last-update-wins. On bénéficie de l'essentiel : une cible avec des données chaudes et synchronisées qui peut permettre de prendre le relais sans délai sur incident.&lt;/p&gt; 
 &lt;p&gt;L'intégralité des fichiers (configs kind, values Helm, manifestes, application de test, scripts) est disponible dans le repo &lt;a href="https://github.com/wescale/pgedge-pca-poc" style="font-weight: bold; text-decoration: underline;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-weight: bold;"&gt;wescale/pgedge-pca-poc&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt; 
&lt;/div&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=2583450&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.wescale.fr%2Fpca-multi-region-avec-pgedge-un-poc-actif-actif-sur-kubernetes&amp;amp;bu=https%253A%252F%252Fblog.wescale.fr&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Kubernetes</category>
      <category>Platform Engineering</category>
      <pubDate>Wed, 16 Sep 2026 13:17:10 GMT</pubDate>
      <guid>https://blog.wescale.fr/pca-multi-region-avec-pgedge-un-poc-actif-actif-sur-kubernetes</guid>
      <dc:date>2026-09-16T13:17:10Z</dc:date>
      <dc:creator>Benjamin Rabiller</dc:creator>
    </item>
    <item>
      <title>Les 4 pièges de l'IA que l'on feint d'ignorer</title>
      <link>https://blog.wescale.fr/les-4-pieges-de-lia-que-lon-feint-dignorer</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/les-4-pieges-de-lia-que-lon-feint-dignorer" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/undefined-Jun-19-2026-12-08-23-7883-PM.png" alt="Les 4 pièges de l'IA que l'on feint d'ignorer" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;L’IA générative est une pratique addictive. Elle livre des résultats instantanés, consensuels et donne une illusion d’autonomie totale. Mais à force de l'utiliser, on en oublie la valeur de la collaboration, du challenge par les pairs et de l’intelligence collective.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/les-4-pieges-de-lia-que-lon-feint-dignorer" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/undefined-Jun-19-2026-12-08-23-7883-PM.png" alt="Les 4 pièges de l'IA que l'on feint d'ignorer" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;L’IA générative est une pratique addictive. Elle livre des résultats instantanés, consensuels et donne une illusion d’autonomie totale. Mais à force de l'utiliser, on en oublie la valeur de la collaboration, du challenge par les pairs et de l’intelligence collective.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=2583450&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.wescale.fr%2Fles-4-pieges-de-lia-que-lon-feint-dignorer&amp;amp;bu=https%253A%252F%252Fblog.wescale.fr&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>IA</category>
      <pubDate>Mon, 22 Jun 2026 14:14:47 GMT</pubDate>
      <guid>https://blog.wescale.fr/les-4-pieges-de-lia-que-lon-feint-dignorer</guid>
      <dc:date>2026-06-22T14:14:47Z</dc:date>
      <dc:creator>Samia Kherrati</dc:creator>
    </item>
    <item>
      <title>Un MCP, des repos, et zéro excuse pour ne plus retrouver nos docs</title>
      <link>https://blog.wescale.fr/un-mcp-des-repos-et-zero-excuse-pour-ne-plus-retrouver-nos-docs</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/un-mcp-des-repos-et-zero-excuse-pour-ne-plus-retrouver-nos-docs" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Gemini_Generated_Image_wf6pfiwf6pfiwf6p.png" alt="Un MCP, des repos, et zéro excuse pour ne plus retrouver nos docs" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Tout a commencé par une question sur Slack d’un collègue. « Tu sais comment on augmente la taille de nos runners CI ? Je ne trouve pas la doc. »&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/un-mcp-des-repos-et-zero-excuse-pour-ne-plus-retrouver-nos-docs" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Gemini_Generated_Image_wf6pfiwf6pfiwf6p.png" alt="Un MCP, des repos, et zéro excuse pour ne plus retrouver nos docs" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Tout a commencé par une question sur Slack d’un collègue. « Tu sais comment on augmente la taille de nos runners CI ? Je ne trouve pas la doc. »&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=2583450&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.wescale.fr%2Fun-mcp-des-repos-et-zero-excuse-pour-ne-plus-retrouver-nos-docs&amp;amp;bu=https%253A%252F%252Fblog.wescale.fr&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>IA</category>
      <pubDate>Tue, 09 Jun 2026 09:13:49 GMT</pubDate>
      <guid>https://blog.wescale.fr/un-mcp-des-repos-et-zero-excuse-pour-ne-plus-retrouver-nos-docs</guid>
      <dc:date>2026-06-09T09:13:49Z</dc:date>
      <dc:creator>Morgan Blanloeil</dc:creator>
    </item>
    <item>
      <title>Vers l'IA Agentique chez AWS</title>
      <link>https://blog.wescale.fr/vers-lia-agentique-chez-aws</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/vers-lia-agentique-chez-aws" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Gemini_Generated_Image_w0xbpiw0xbpiw0xb.png" alt="Vers l'IA Agentique chez AWS" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Le re:Invent 2025 a marqué un tournant côté AWS passant de l’IA générative vers une IA agentique, avec des agents autonomes capables de collaborer avec les membres de l’équipe. Bedrock agentcore en est l’exemple.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/vers-lia-agentique-chez-aws" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Gemini_Generated_Image_w0xbpiw0xbpiw0xb.png" alt="Vers l'IA Agentique chez AWS" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Le re:Invent 2025 a marqué un tournant côté AWS passant de l’IA générative vers une IA agentique, avec des agents autonomes capables de collaborer avec les membres de l’équipe. Bedrock agentcore en est l’exemple.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=2583450&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.wescale.fr%2Fvers-lia-agentique-chez-aws&amp;amp;bu=https%253A%252F%252Fblog.wescale.fr&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>IA</category>
      <pubDate>Tue, 02 Jun 2026 11:49:53 GMT</pubDate>
      <guid>https://blog.wescale.fr/vers-lia-agentique-chez-aws</guid>
      <dc:date>2026-06-02T11:49:53Z</dc:date>
      <dc:creator>Lilian Deloche</dc:creator>
    </item>
    <item>
      <title>Tools In Action: Aqua Security Trivy Operator</title>
      <link>https://blog.wescale.fr/tools-in-action-aqua-security-trivy-operator</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/tools-in-action-aqua-security-trivy-operator" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Design%20sans%20titre%20(2)-2.png" alt="Tools In Action: Aqua Security Trivy Operator" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Vous connaissez sûrement déjà Aqua Security Trivy, un outil tout en un pour scanner vos images de conteneurs et votre infrastructure. L'intégrer à votre CI/CD pour remonter rapidement les failles de sécurité ou les erreurs de configuration est un bon début, mais que se passe-t-il une fois vos conteneurs déployés ? Une nouvelle CVE n'attendra pas votre prochain déploiement pour apparaître.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/tools-in-action-aqua-security-trivy-operator" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Design%20sans%20titre%20(2)-2.png" alt="Tools In Action: Aqua Security Trivy Operator" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Vous connaissez sûrement déjà Aqua Security Trivy, un outil tout en un pour scanner vos images de conteneurs et votre infrastructure. L'intégrer à votre CI/CD pour remonter rapidement les failles de sécurité ou les erreurs de configuration est un bon début, mais que se passe-t-il une fois vos conteneurs déployés ? Une nouvelle CVE n'attendra pas votre prochain déploiement pour apparaître.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=2583450&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.wescale.fr%2Ftools-in-action-aqua-security-trivy-operator&amp;amp;bu=https%253A%252F%252Fblog.wescale.fr&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Sécurité</category>
      <pubDate>Mon, 18 May 2026 12:58:29 GMT</pubDate>
      <guid>https://blog.wescale.fr/tools-in-action-aqua-security-trivy-operator</guid>
      <dc:date>2026-05-18T12:58:29Z</dc:date>
      <dc:creator>Vincent Arrocena</dc:creator>
    </item>
    <item>
      <title>Pourquoi votre VM de Pentest locale est obsolète (et comment l’ARM64 change la donne)</title>
      <link>https://blog.wescale.fr/pourquoi-votre-vm-de-pentest-locale-est-obsolete-et-comment-larm64-change-la-donne</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/pourquoi-votre-vm-de-pentest-locale-est-obsolete-et-comment-larm64-change-la-donne" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Design%20sans%20titre%20(2)-1.png" alt="Pourquoi votre VM de Pentest locale est obsolète (et comment l’ARM64 change la donne)" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Le paysage de la cybersécurité offensive traverse une mutation silencieuse. Pendant des décennies, le modèle de référence a consisté à s'équiper d'un ordinateur portable massif pour y configurer une "Machine Virtuelle" (VM) Kali Linux. C’était l'environnement de sécurité par excellence : un système sous contrôle, mais souvent lourd, isolé et limité par les capacités du matériel physique.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/pourquoi-votre-vm-de-pentest-locale-est-obsolete-et-comment-larm64-change-la-donne" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Design%20sans%20titre%20(2)-1.png" alt="Pourquoi votre VM de Pentest locale est obsolète (et comment l’ARM64 change la donne)" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Le paysage de la cybersécurité offensive traverse une mutation silencieuse. Pendant des décennies, le modèle de référence a consisté à s'équiper d'un ordinateur portable massif pour y configurer une "Machine Virtuelle" (VM) Kali Linux. C’était l'environnement de sécurité par excellence : un système sous contrôle, mais souvent lourd, isolé et limité par les capacités du matériel physique.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=2583450&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.wescale.fr%2Fpourquoi-votre-vm-de-pentest-locale-est-obsolete-et-comment-larm64-change-la-donne&amp;amp;bu=https%253A%252F%252Fblog.wescale.fr&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Sécurité</category>
      <pubDate>Mon, 11 May 2026 12:01:03 GMT</pubDate>
      <guid>https://blog.wescale.fr/pourquoi-votre-vm-de-pentest-locale-est-obsolete-et-comment-larm64-change-la-donne</guid>
      <dc:date>2026-05-11T12:01:03Z</dc:date>
      <dc:creator>Alexandre Guillemot</dc:creator>
    </item>
    <item>
      <title>De l'IaC à l'Infrastructure as Product : sécuriser la Supply Chain Terraform de bout en bout</title>
      <link>https://blog.wescale.fr/de-liac-a-linfrastructure-as-product-securiser-la-supply-chain-terraform-de-bout-en-bout</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/de-liac-a-linfrastructure-as-product-securiser-la-supply-chain-terraform-de-bout-en-bout" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Design%20sans%20titre%20(5).png" alt="De l'IaC à l'Infrastructure as Product : sécuriser la Supply Chain Terraform de bout en bout" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;h2&gt;La fin du “Works on my machine”&lt;/h2&gt; 
&lt;p&gt;L'adoption de l'Infrastructure as Code (IaC) avec Terraform a été une révolution pour nos opérations. Pourtant, dans de nombreuses équipes, l'exécution de ce code reste étrangement artisanale. Le code est versionné, certes, mais le déploiement se fait encore trop souvent depuis le terminal d'un ingénieur, avec un simple &lt;code&gt;terraform apply&lt;/code&gt; lancé en local.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/de-liac-a-linfrastructure-as-product-securiser-la-supply-chain-terraform-de-bout-en-bout" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Design%20sans%20titre%20(5).png" alt="De l'IaC à l'Infrastructure as Product : sécuriser la Supply Chain Terraform de bout en bout" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;h2&gt;La fin du “Works on my machine”&lt;/h2&gt; 
&lt;p&gt;L'adoption de l'Infrastructure as Code (IaC) avec Terraform a été une révolution pour nos opérations. Pourtant, dans de nombreuses équipes, l'exécution de ce code reste étrangement artisanale. Le code est versionné, certes, mais le déploiement se fait encore trop souvent depuis le terminal d'un ingénieur, avec un simple &lt;code&gt;terraform apply&lt;/code&gt; lancé en local.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=2583450&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.wescale.fr%2Fde-liac-a-linfrastructure-as-product-securiser-la-supply-chain-terraform-de-bout-en-bout&amp;amp;bu=https%253A%252F%252Fblog.wescale.fr&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Sécurité</category>
      <pubDate>Wed, 06 May 2026 13:43:12 GMT</pubDate>
      <guid>https://blog.wescale.fr/de-liac-a-linfrastructure-as-product-securiser-la-supply-chain-terraform-de-bout-en-bout</guid>
      <dc:date>2026-05-06T13:43:12Z</dc:date>
      <dc:creator>Baptiste Chauvelier</dc:creator>
    </item>
    <item>
      <title>Kiro, l’IDE spec-driven d’AWS</title>
      <link>https://blog.wescale.fr/kiro-lide-spec-driven-daws</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/kiro-lide-spec-driven-daws" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Design%20sans%20titre%20(4).png" alt="Kiro, l’IDE spec-driven d’AWS" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Les assistants de développement basés sur l’IA se sont imposés très vite dans les pratiques quotidiennes. On a rapidement vu émerger les pratiques de vibe coding. En quelques mois, ils sont passés du statut de gadget prometteur à celui d’outil presque incontournable pour accélérer la production de code. Mais derrière cette promesse, une difficulté demeure : comment garder du contrôle, de la cohérence et un vrai cadre technique quand l’IA intervient partout ?&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/kiro-lide-spec-driven-daws" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Design%20sans%20titre%20(4).png" alt="Kiro, l’IDE spec-driven d’AWS" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Les assistants de développement basés sur l’IA se sont imposés très vite dans les pratiques quotidiennes. On a rapidement vu émerger les pratiques de vibe coding. En quelques mois, ils sont passés du statut de gadget prometteur à celui d’outil presque incontournable pour accélérer la production de code. Mais derrière cette promesse, une difficulté demeure : comment garder du contrôle, de la cohérence et un vrai cadre technique quand l’IA intervient partout ?&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=2583450&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.wescale.fr%2Fkiro-lide-spec-driven-daws&amp;amp;bu=https%253A%252F%252Fblog.wescale.fr&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>IA</category>
      <pubDate>Wed, 29 Apr 2026 14:04:37 GMT</pubDate>
      <guid>https://blog.wescale.fr/kiro-lide-spec-driven-daws</guid>
      <dc:date>2026-04-29T14:04:37Z</dc:date>
      <dc:creator>Lilian Deloche</dc:creator>
    </item>
    <item>
      <title>Augmented Dev &amp; Ops : l'évolution naturelle</title>
      <link>https://blog.wescale.fr/augmented-dev-ops-levolution-naturelle</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/augmented-dev-ops-levolution-naturelle" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Design%20sans%20titre.png" alt="Augmented Dev &amp;amp; Ops : l'évolution naturelle" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Depuis plusieurs mois, nos missions ont profondément évolué : la façon dont nos ingénieurs travaillent, le temps qu'ils consacrent à chaque étape, les questions qu'ils se posent. C'est ce constat qui nous a conduits à un nouveau positionnement : Augmented Dev &amp;amp; Ops.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.wescale.fr/augmented-dev-ops-levolution-naturelle" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.wescale.fr/hubfs/Design%20sans%20titre.png" alt="Augmented Dev &amp;amp; Ops : l'évolution naturelle" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Depuis plusieurs mois, nos missions ont profondément évolué : la façon dont nos ingénieurs travaillent, le temps qu'ils consacrent à chaque étape, les questions qu'ils se posent. C'est ce constat qui nous a conduits à un nouveau positionnement : Augmented Dev &amp;amp; Ops.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=2583450&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.wescale.fr%2Faugmented-dev-ops-levolution-naturelle&amp;amp;bu=https%253A%252F%252Fblog.wescale.fr&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>IA</category>
      <pubDate>Thu, 23 Apr 2026 14:22:59 GMT</pubDate>
      <guid>https://blog.wescale.fr/augmented-dev-ops-levolution-naturelle</guid>
      <dc:date>2026-04-23T14:22:59Z</dc:date>
      <dc:creator>WeScale</dc:creator>
    </item>
  </channel>
</rss>
