Plan d'implémentation — Longhorn, 3ᵉ profil de stockage (ADR 0064)
État : Brouillon (depuis 2026-06-13) · Fonde : ADR 0064 (Proposed) · Issue : #324 · Pas d’implémentation active tant que l’ADR n’est pas
Accepted(ADR 0057 §6).
Met en œuvre ADR 0064
: ajouter Longhorn comme troisième profil de stockage du catalogue, entre
local-path (jetable, zéro résilience) et ceph (unifié, datalake). Ce plan
est le comment ; la décision (le pourquoi) est dans l’ADR. Il reste en
Brouillon — aucune PR de code ne part tant que l’ADR 0064 est Proposed.
Principe d’architecture
Section intitulée « Principe d’architecture »Décliner le patron existant des deux profils (local-path, ceph) pour un
troisième, sans inventer de mécanique nouvelle :
- Manifeste vendored figé dans
storage/longhorn/, à l’image destorage/local-path/local-path-storage.yamletstorage/ceph/*— exclu de prettier/yamllint/jscpd (bundle upstream), images épinglées par digest d’index multi-arch (ADR 0006, le banc est arm64). - Rôle Ansible
platform-longhorncalqué surplatform-local-path: applique le manifeste figé viakubernetes.core.k8s(jamais de.j2), attend le managerReady, pose exactement une StorageClass par défaut (longhorn), défauts génériques (ADR 0023). - Profil de déploiement : une variable
WITH_LONGHORN(ou un profil nommélonghorn) dansbench/lima/run-phases.sh, symétrique deWITH_CEPH, qui bascule la StorageClass par défaut et dimensionne la VM (réplication ×2/×3 exige ≥ 2-3 nœuds — la topologie de référencemulti-node-3convient). - Stockage composé : si le profil Longhorn a besoin d’objet S3 (Loki,
backups CNPG), il réutilise SeaweedFS exactement comme le profil
local-path(ADR 0036) — pas de RGW (qui exige Ceph).
# Symétrie visée avec les profils existants :bench/lima/run-phases.sh storage-simple # local-pathWITH_CEPH=1 bench/lima/run-phases.sh ceph # Rook-CephWITH_LONGHORN=1 bench/lima/run-phases.sh longhorn # Longhorn (cible de ce plan)Périmètre — ce que Longhorn fait / ne fait pas (ADR 0064)
Section intitulée « Périmètre — ce que Longhorn fait / ne fait pas (ADR 0064) »| Aspect | Décision |
|---|---|
| Bloc RWO/RWX | ✅ réplication ×2/×3 synchrone |
| Objet S3 | ❌ — 2ᵉ brique (SeaweedFS/MinIO) si besoin (ADR 0036) |
| Datalake prod | ❌ — reste Ceph (ADR 0018 intouché) |
| Nœuds minimum | 2-3 (réplication réelle) — topologie multi-node-3 |
| StorageClass défaut | longhorn, une seule à la fois (bascule comme local-path↔Ceph) |
Découpage en lots (issues)
Section intitulée « Découpage en lots (issues) »Tous gelés tant que l’ADR 0064 n’est pas
Accepted. Le lot 0 est le seul qui peut avancer sousProposed(il sert à acter l’ADR).
- Acter l’ADR — revue de l’ADR 0064 + ce plan ; passage
Proposed → Accepted; bascule de cet en-têteBrouillon → Actif. (Pré-requis de tous les autres lots, ADR 0057 §6.) - Manifeste vendored —
storage/longhorn/longhorn.yaml(bundle upstream figé, images pinnées par digest multi-arch ADR 0006), exclusions prettier/yamllint/jscpd,.trivyignore.yamlpour le RBAC inhérent avec justification par chemin. +storage/longhorn/RUNBOOK.md(install, diagnostic, désinstallation), dans le style du RUNBOOK Ceph. - Rôle Ansible
platform-longhorn(calqué surplatform-local-path) : applique le manifeste, attendReady, pose la SC par défaut (exactement une), défauts génériques ADR 0023. + playbookbootstrap/longhorn.yaml. - Profil banc —
WITH_LONGHORN/ phaselonghorndansbench/lima/run-phases.sh(symétriqueWITH_CEPH), dimensionnement VM, bascule SC par défaut. Fonctions pures testables bats si logique non triviale (ADR 0017). - Rollback —
rollback longhorndans le dispatch existant (plan-rollback-par-phase.md / ADR 0054) : namespacelonghorn-system, CRDlonghorn.io, PVC, node-side (/var/lib/longhorn). À garder en phase avec ce que le rôle crée. - Preuve de banc (ADR 0034/0052) — run e2e : monte
longhorn→ PVC répliqué → tue un nœud, vérifie la survie I/O → remonte. Consigner un cycle dansbench/lima/RESULTS.md. Sans ce run, le profil reste déclaré mais non prouvé. - Doc — câbler le profil dans la doc :
docs/composants.md(pile briques),docs/architecture/decisions-stockage.md(bilan 3 options — déjà rédigé),docs/outils.md(catalogue de commandes),docs/architecture/matrice-catalogue.md(Longhorn passe de « potentiel » à « profil activable »).
Validation
Section intitulée « Validation »pnpm lint (format, yamllint, shellcheck, kubeconform, ansible-lint, jscpd,
bats), pnpm docs:build (liens morts), markdownlint et trivy (jobs CI
séparés, à reproduire localement). Conventional Commits sujet minuscule, hooks
lefthook jamais bypassés, merge commit (chaque commit propre). Un lot = une PR,
re-prouvée sur banc avant la suivante (ADR 0034).
Suivi (ADR 0057)
Section intitulée « Suivi (ADR 0057) »Issue de pilotage : #324 (les lots ci-dessous y sont des cases à cocher).
| Lot | État |
|---|---|
0. Acter l’ADR 0064 (Accepted) | 🔲 à faire — débloque tout le reste (ADR 0057 §6) |
| 1. Manifeste vendored + RUNBOOK | 🔲 gelé tant que 0064 Proposed |
2. Rôle platform-longhorn + playbook | 🔲 gelé |
3. Profil banc (WITH_LONGHORN) | 🔲 gelé |
4. Rollback longhorn | 🔲 gelé |
5. Preuve de banc (RESULTS.md) | 🔲 gelé — survie à la perte d’un nœud (ADR 0034/0052) |
| 6. Doc (composants, bilan, matrice) | 🟡 partiel — bilan 3 options posé dans decisions-stockage.md |
Achèvement : quand les lots 1-6 sont livrés sur main et le run de preuve
consigné, l’en-tête ## État passe Achevé. Le passage Brouillon → Actif
intervient au lot 0 (acceptation de l’ADR 0064).