L2 | ✅ corrige | bootstrap K8s — banc Lima (#127) | initialisation : Permission denied: /home/lima (création du .kube). → Rôles k8s-initialization/k8s-rollback : home résolu via ansible_env.HOME (le vrai home, indépendant de l’utilisateur). |
L2bis | ✅ corrige | bootstrap K8s — banc Lima (#127) | join-workers : Unable to change directory (/home/debian). → chdir résolu via ansible_env.HOME. |
L3 | ✅ corrige | bootstrap K8s — banc Lima (#127) | initialisation : taint "…control-plane" not found. → Tâche rendue tolérante : failed_when ignore « not found ». |
L4 | ✅ corrige | bootstrap K8s — banc Lima (#127) | cni.sh : cluster unreachable: localhost:8080. → Lancer cni.sh en tant qu’utilisateur (sudo interne seulement où nécessaire). |
L8 | ✅ corrige | validation DataOps Dagster — banc Lima (#144) | cert-manager controller en CrashLoop : « Gateway API CRDs not present ». → Phase platform-prereqs : pose les CRDs Gateway API v1.4.1. |
L9 | ✅ corrige | validation DataOps Dagster — banc Lima (#144) | ImagePullBackOff : « HTTP response to HTTPS client » (registry:80). → Phase platform-prereqs : /etc/hosts + certs.d/registry:80/hosts.toml en HTTP. |
L11 | ✅ corrige | validation DataOps Dagster — banc Lima (#144) | kubectl apply -f dagster.yaml crée les ressources dans default. → README : kubectl apply -n dagster … (corrigé). |
L13 | ✅ corrige | chaîne DataOps shell — banc Lima (#148) | Pull registry:80 HTTP échoue : « HTTP response to HTTPS client ». → use_local_image_pull = true dans la config containerd (les 3 nœuds) — fix racine. |
L14 | ✅ corrige | chaîne DataOps shell — banc Lima (#148) | CNPG bloqué : « unknown plugin being required ». → Contournement banc initial (retrait du bloc plugins:) puis éliminé à la racine en #173 (Barman vers RGW Ceph via platform-s3-bucket). |
L16 | ✅ corrige | chaîne DataOps shell — banc Lima (#148) | Dagster « too many retries for DB connection » (vrai bug du livrable). → Fix dépôt : passwordSecret par rôle + role-secrets.example.yaml. |
L17 | ✅ corrige | chaîne DataOps shell — banc Lima (#148) | Le Secret dérivé applicatif ne correspond pas au mot de passe réel du rôle. → Résolu par L16 : .example de rôle et dérivés alignés sur les mêmes valeurs de test. |
L19 | ✅ corrige | chaîne DataOps shell — banc Lima (#148) | Run émetteur en timeout sur le POST OpenLineage (vrai bug du livrable). → Fix dépôt : platform/network-policies/dagster/allow-marquez-egress.yaml. |
L20 | ✅ corrige | chaîne DataOps shell — banc Lima (#148) | webserver/daemon Dagster en CrashLoop : « no [tool.dagster] block ». → Fix dépôt : ConfigMap dagster-workspace (load_from: []) monté + -w dans dagster.yaml. |
L25 | ✅ corrige | portage DataOps Ansible — banc Lima (#173) | Secret dérivé : « namespaces postgres not found ». → Namespace postgres créé en premier dans platform-cnpg. |
L26 | ✅ corrige | portage DataOps Ansible — banc Lima (#173) | build : « dict has no attribute ‘clone_subdir’ ». → default('') sur les attributs optionnels. |
L30 | ✅ corrige | portage DataOps Ansible — banc Lima (#173) | Pods Dagster en ImagePullBackOff sur registry:80 (HTTP/HTTPS). → Restart containerd sur les nœuds (handler à fiabiliser). |
L34 | ✅ corrige | storageClass + S3 — banc Lima (#158/#186) | CRDs monitoring rejetées par le module k8s. → Appliquer ces CRDs via kubectl apply --server-side, pas le module. |
L35 | ✅ corrige | storageClass + S3 — banc Lima (#158/#186) | « no matches for cert-manager.io/v1.Certificate ». → platform-cert-manager appliqué AVANT monitoring (dans monitoring.yaml). |
L36 | ✅ corrige | storageClass + S3 — banc Lima (#158/#186) | PrometheusRule rejetés en masse (HTTP 500 du webhook prometheusrulemutate). → Deux passes : stack sauf PrometheusRule → attente operator Ready → PrometheusRule. |
L37 | ✅ corrige | storageClass + S3 — banc Lima (#158/#186) | cert-manager en CrashLoop au démarrage (cause racine de L36). → Le rôle platform-cert-manager pose lui-même les CRDs Gateway API (v1.4.1). |
L38 | ✅ corrige | storageClass + S3 — banc Lima (#158/#186) | Loki en CrashLoop NoSuchBucket (compactor), profil RGW uniquement. → En RGW : résoudre le bucket de l’OBC et l’employer pour chunks ET ruler ; init-buckets skippé. |
L40 | ✅ corrige | storageClass + S3 — banc Lima (#158/#186) | platform-prereqs meurt (EXIT 1) sur banc léger (monitoring sans dataops, donc sans namespace registry). → … || true sur l’assignation (skip propre). |
L41 | ✅ corrige | topologies — DataOps sans Ceph (#158/#186 suite) | Le déploiement registry (puis CNPG) reste Pending : PVC non lié, pod registry 0/1 « Deployment does not have minimum availability ». → phase_dataops (run-phases.sh) choisit storageClass + backing S3 selon le profil (registry_storage_class / cnpg_storage_class / cnpg_s3_backing / cnpg_s3_endpoint), comme phase_monitoring. Le rôle CNPG est par ailleurs découplé du RGW via platform-s3-bucket (backing rgw|seaweedfs, ADR 0036). |
L45 | ✅ corrige | migration ansible_facts (échéance ansible-core 2.24) | Au run, set_fact all_hostnames échoue : « object of type ‘HostVarsVars’ has no attribute ‘ansible_facts.hostname’ » (bootstrap k8s-pre-install). → Passer une LISTE de clés pour la descente : map('extract', hostvars, ['ansible_facts', 'hostname']). Validé e2e (bootstrap vert). |
L56 | 🔄 en-cours (#251) | portail UI — exposition tout-Cilium (#232, scénario 28) | Aucune UI joignable via le Gateway. Le Gateway argocd reste PROGRAMMED=Unknown « Waiting for controller », la GatewayClass cilium reste Accepted=Unknown, et AUCUN Service type=LoadBalancer n’obtient d’IP. Le scénario 28 ne trouve qu’une HTTPRoute et ne peut sonder aucune UI. → (1) cni.sh applique les CRs inline (heredoc), plage LB-IPAM + interface L2 paramétrées par env (LB_IPAM_RANGE_START/STOP, L2_INTERFACE) dérivées du réseau réel par run-phases.sh (ADR 0023) ; (2) poser les CRDs Gateway API AVANT cni.sh (dépendance réelle Gateway-API → Cilium-gateway). Validé À CHAUD (HTTP 200 via Gateway, scénario 28 PASS). Re-preuve from-scratch différée → issue #251 (ADR 0034/0046). |
L57 | ✅ corrige | installation DataOps sur la prod dirqual1-4 (2026-06-22) | Après l’installation DataOps en prod, les pods Dagster (daemon, webserver) restent en ImagePullBackOff : « failed to pull registry:80/dagster-celery-k8s: 1.13.7 : http: server gave HTTP response to HTTPS client ». L’image existe pourtant dans le registry (build/push OK) et un curl HTTP vers http://registry:80/v2/ depuis le nœud répond 200 — containerd parle HTTPS à un registry HTTP. → Deux parades (ADR 0046/0051, pattern etcd-backup) dans dataops.yaml ET mlflow.yaml : (1) meta: flush_handlers juste après le rôle registry-node → containerd relit sa config AVANT le build/push d’images (qui pousse en HTTP) ; (2) force_handlers: true au play → le restart joue même si une tâche aval échoue (le filet qui manquait le 16/06). Diagnostic à chaud : systemctl restart containerd sur dirqual1 → pull OK, Dagster Running (les autres nœuds recyclés par le reboot de l’os-upgrade). Preuve from-scratch prod différée (la prod n’est pas détruite, ADR 0034). |
L58 | ✅ corrige | installation DataOps sur la prod dirqual1-4 (2026-06-22) | Un client DANS un pod n’atteint pas un service par son FQDN complet <svc>.<ns>.svc.cluster.local alors que le service est sain et joignable par nom court ou par IP. Deux cas vécus : (1) gitea-init curl vers gitea-http.gitea.svc.cluster.local → « Could not resolve host (timeout DNS) » ; (2) Dagster workspace pointant toy-codeloc.dagster.svc.cluster.local → « DagsterUserCodeUnreachableError: gRPC UNAVAILABLE » (pod gRPC pourtant ready/0 restart, TCP 4000 ouvert). DagsterGrpcClient.ping OK par nom court/IP. → Viser le NOM COURT intra-pod : <svc> (même ns) ou <svc>.<ns> (cross-ns), qui résout via le 1er search domain. Fixes : gitea-init GITEA_API=localhost:3000 (le curl tourne dans le pod gitea) ; workspace Dagster host: toy-codeloc (univ-lehavre/cluster#458) ; atlas/citation-dagster idem (workspace-patch + code-location + definitions._RUN_ENV, univ-lehavre/atlas#428). Documenté dans contract/endpoints.example.yaml (en-tête) et docs/guide-dev-data.md. Pas de nouvel ADR (résolution intra-pod, non couverte par 0019/0020/0021 exposition bordure). |
L59 | ✅ corrige | refonte nestor — moteur Python (#511), runs —engine=python au banc Lima from-scratch (2026-06-26/29) | La phase monitoring cassait l’idempotence — 1 tâche changed au rejeu (« Apply monitoring CRDs (server-side, via kubectl) »). → changed_when dérivé de la sortie réelle de kubectl apply (changed = au moins une ligne sans suffixe « unchanged »). Bug isolé : les autres changed_when: true du bootstrap (build d’image force_rebuild, creates:, postconf) sont légitimes. Commit 7bf2498. |
L60 | ✅ corrige | refonte nestor — moteur Python (#511), runs —engine=python au banc Lima from-scratch (2026-06-26/29) | Le seed gitops (gitea-init porté en Python) échouait sur tous ses gestes — admin/token KO, « Incorrect Usage: flag provided but not defined: -request-timeout ». → Le flag global précède la sous-commande : ['kubectl','--request-timeout=5s',*args]. Prouvé au banc (admin idempotent, token généré). Commit b288a62. |
L61 | ✅ corrige | refonte nestor — moteur Python (#511), runs —engine=python au banc Lima from-scratch (2026-06-26/29) | Le seed reportait SUCCÈS (faux-vert) sur des étapes en échec réel — admin avalait tout échec de création, org-repo/webhook retournaient True sans lire le code HTTP. Masquait la cause d’un échec 2 étapes plus loin. → admin distingue créé / « already exists » (idempotent) / vrai échec ; _seed_api_ok valide le code (2xx/409/422 ok, 401/5xx/vide = échec). Trouvé par audit adversarial. Commits 91c212f, 0486a3c. |
L62 | ✅ corrige | refonte nestor — moteur Python (#511), runs —engine=python au banc Lima from-scratch (2026-06-26/29) | Le seed tentait de créer l’admin Gitea alors que le pod gitea démarrait encore → création KO → token KO ensuite. → Gate rollout status deploy/gitea + deploy/argocd-server AVANT le moindre geste mutant du seed (ADR 0046). Commit 83c520c. |
L63 | ✅ corrige | refonte nestor — moteur Python (#511), runs —engine=python au banc Lima from-scratch (2026-06-26/29) | En montage from-scratch, la phase storage-simple (play localhost, module k8s) échouait : « Connection to 10.67.2.11:6443 timed out » — l’IP INTERNE de la VM Lima (user-v2, non routable depuis l’hôte). → Repli sur ctx.kubeconfig_local (kubeconfig banc rapatrié par bootstrap, server 127.0.0.1:6443) quand l’env est vide. Bug visible UNIQUEMENT en from-scratch (masqué quand le banc préexiste). Commit 4db9d70. |
L64 | ✅ corrige | refonte nestor — moteur Python (#511), runs —engine=python au banc Lima from-scratch (2026-06-26/29) | Après run-phases.sh down, nestor up --engine=python était REFUSÉ par la garde d’isolation (« kubeconfig du banc absent »). → La garde reçoit la topo ; si elle déclare target_kind: lima (= EXPECTED_TARGET_KIND=lima du bash), c’est le signal sûr pour up from-scratch. Une topo prod reste sous garde stricte. Commit f390a59. |
L65 | ✅ corrige | refonte nestor — moteur Python (#511), runs —engine=python au banc Lima from-scratch (2026-06-26/29) | La phase portal (et potentiellement mlflow) échouait sur « idempotence cassée : 2 tâches changed au rejeu » via le moteur Python, alors que le bash montait portal sans erreur. → Le moteur lance 1 passage + gate (parité bash). L’idempotence se prouve par le rejeu du CHEMIN entier (nestor up 2× → « rien à appliquer », ADR 0052), pas par phase. Commits 4ea58dd, 7b5fb43. |
L67 | ✅ corrige | installation portail (ADR 0092) — banc Lima (2026-06-23) | Après un rebuild de l’image portail (tag mutable :dev), un rollout ne tirait jamais la nouvelle image : login/scheme absents après rebuild (constaté dirqual) — l’ancienne image restait servie depuis le cache nœud. → imagePullPolicy: Always dans platform/portal/portal.yaml → re-tire l’image à chaque rollout. Commit cb50fd1. |
L68 | ✅ corrige | portail — banc Lima (2026-06-22) | Preuve banc : TOUS les services déployés ressortaient en DRIFT (present mais not ready) alors qu’ils tournent — verdict du portail faux partout. → Lecture via le client TYPÉ DiscoveryV1Api.list_namespaced_endpoint_slice (label_selector kubernetes.io/service-name) ; _apis renvoie 3 clients (Core, Discovery, Custom). Re-déployé au banc : 16 MATCH, 2 MISSING (s3-ceph local-path + dashboard non déployé), 1 DRIFT — verdicts conformes à l’état réel. Commit eda9ae8. |
L69 | ✅ corrige | portail — banc Lima (2026-06-23) | Le portail rendait DRIFT pour les UI vendored et n’affichait aucun lien vers elles. → Observer aussi <svc>-nodeport (le Service d’exposition séparé) ; login_for() affiche l’IDENTIFIANT à côté de la commande mot de passe ; scheme https pour les UI qui terminent le TLS (dashboard Ceph). Commit ab7f47f. |
L70 | ✅ corrige | audit prod dirqual — etcd backup (2026-06-24) | Le rendu du template etcd-snapshot échouait : « Syntax error in template: unexpected char » — révélant que l’etcd backup n’avait JAMAIS été actif sur dirqual (rôle etcd-backup encore jamais joué, cf. bench/RESULTS.md:54). → Reformuler le commentaire sans accolades Jinja. Le rendu réussit (snapshot etcd 63 Mo produit sur control-plane). Commit 23f6aed. |
L71 | ✅ corrige | audit prod dirqual — CoreDNS SPOF (#487, 2026-06-25) | Le durcissement de l’anti-affinité CoreDNS échouait : le module kubernetes.core.k8s ne s’exécutait pas sur le control-plane (le rôle k8s-initialization y tourne en become/sudo car kubeadm init l’exige). → S’aligner sur les autres opérations k8s du rôle (taint, label) : kubectl patch --type=strategic avec le kubeconfig local du nœud, idempotent (no-op « no change » si déjà en place). Commit fa17a5c. |