Aller au contenu

0006 — Matrice de versions et politique de bump

Le cluster est un assemblage de composants liés par des contraintes de compatibilité croisées : Cilium ↔ K8s, Rook ↔ K8s, Ceph ↔ Rook, containerd ↔ K8s, chart Helm dashboard ↔ K8s. Bump l’un sans vérifier les autres → drift silencieux jusqu’à un échec de provisionnement.

Ces compatibilités croisées ont été vérifiées en mai 2026 (plafond commun imposé par Cilium 1.19 et Rook 1.19, tous deux testés jusqu’à K8s 1.34).

ComposantVersion cibleFichier piloté
Kubernetes1.34.9 (patch figé)bootstrap/group_vars/all.yaml (k8s_minor/k8s_patch → dépôt apt + kubernetesVersion à l’init, #295)
Cilium1.19.x (dernier patch)bootstrap/cni.sh (CLI épinglée)
kube-vip1.2.0bootstrap/roles/kube-vip/defaults/main.yaml (kube_vip_digest, index multi-arch — VIP HA ha-3cp, ADR 0047/0055)
Rook1.19.xstorage/ceph/operator.yaml + crds.yaml/common.yaml
Ceph20.2.1 Tentaclestorage/ceph/cluster.yaml (image quay.io/ceph/ceph:v20.2.1)
containerd.io2.2.4dépôt Docker (cf. ADR 0005)
Dashboard chart7.10.0platform/k8s-dashboard/manage.sh (CHART_VERSION)
Registry image3.1.1platform/container-registry/deployment.yaml
Gateway API CRD1.4.1feature Cilium (bootstrap/cni.sh) ; UI en L4 hors Gateway (cf. ADR 0092)
cert-manager1.20.2platform/cert-manager/cert-manager.yaml (images par digest)
Argo CD3.4.3platform/argocd/argocd.yaml (+ dex 2.45.0, redis 8.2.3 ; images par digest)

Plafond commun K8s = 1.34 (limite de Cilium 1.19 et Rook 1.19 testés). Ceph Squid v19 sort d’EOL en septembre 2026 → Tentacle pour une install neuve.

Outils de la chaîne locale/CI, pas des composants déployés — pinnés au même titre pour la reproductibilité. Langages cf. ADR 0017.

OutilVersion cibleFichier piloté
Python>= 3.12pyproject.toml (requires-python)
ruff0.15.16 (pin ==)pyproject.toml + uv.lock
OpenTofu1.12.xprovisioning cloud (ADR 0032) — .terraform.lock.hcl (à introduire)
kubernetes.core6.4.0bootstrap/requirements.yml (ADR 0033)

uv.lock committé fige l’arbre exact des dépendances Python (ici ruff seul) — reproductibilité locale/CI, dans l’esprit du pinning par digest des images. De même, .terraform.lock.hcl figera OpenTofu + providers à l’introduction du code de provisioning (ADR 0032).

Composants ajoutés avec l’observabilité (ADR 0016 palier 2) et le socle DataOps (CloudNativePG). Toutes les images sont épinglées par digest d’index multi-arch (politique ci-dessous) ; on note ici le tag de version porteur.

ComposantVersion cibleFichier piloté
kube-prometheus-stackchart 86.1.0 (operator v0.91.0)platform/kube-prometheus-stack/ (helm template figé)
Lokichart 7.0.0 (app 3.6.7)platform/loki/loki.yaml
Promtailchart 6.17.1 (app 3.5.1, déprécié → Alloy)platform/loki/promtail.yaml
Mailpitv1.30.1platform/mailpit/mailpit.yaml
CloudNativePGoperator 1.29.1platform/cloudnative-pg/operator.yaml
Barman Cloud Pluginv0.12.0platform/cloudnative-pg/plugin-barman-cloud.yaml
PostgreSQL (operand)18 (18-minimal-trixie)platform/cloudnative-pg/cluster.yaml
pgvector0.8.2 (0.8.2-18-trixie)platform/cloudnative-pg/cluster.yaml (image volume extension)
SeaweedFS4.31banc léger uniquement (objectstore S3 de test)
aws-cli2.31.21Jobs d’init de buckets S3 (init-buckets.yaml)
Dagsterchart 1.13.7 (app 1.13.7)platform/dagster/values.bench.yaml (helm template figé)
Marquezchart 0.51.1 (API + web)platform/marquez/values.bench.yaml (helm template figé)
Gitea1.26.2 (-rootless)platform/gitea/deployment.yaml (git intra-banc air-gapped, ADR 0044)

Dagster amd64-only. Les images officielles Dagster sont publiées amd64 uniquement (dagster-io/dagster#11841). Dagster étant du pur Python, on construit l’image arm64 en interne (platform/dagster/image/Dockerfile, 1er build maison du dépôt) pour le banc arm64 ; la topologie bare-metal x86 utilise l’image officielle. À reconstruire à chaque bump (cf. ADR 0026).

Marquez amd64-only. Les images officielles Marquez API et web sont publiées amd64 uniquement (Docker Hub, 0.51.1). Bases multi-arch (eclipse-temurin:17, node:18-alpine) → on construit les deux images arm64 en interne (platform/marquez/image/, image-web/, copies fidèles des Dockerfiles upstream) pour le banc arm64 ; bare-metal x86 utilise les images officielles. À reconstruire à chaque bump (cf. ADR 0028).

CloudNativePG 1.29 + Image Volume Extensions (la voie pgvector sans image custom) reposent sur la feature Kubernetes ImageVolume : alpha en K8s 1.31 (désactivée), beta/activée par défaut dès 1.33 → fonctionne nativement en 1.34. Cohérence de version impérative : un banc qui dérive sous 1.33 ne peut pas valider pgvector.

Les bancs doivent cibler la même version Kubernetes (1.34) que le bootstrap — sinon dérive silencieuse (cf. encadré ImageVolume ci-dessus).

BancInstalleur K8sVersion
bench/lima (Lima)kubeadm via bootstrap/ (VMs Lima)1.34

kind est abandonné : son image de node figeait K8s en 1.31 (divergent de la matrice), ce qui a bloqué pgvector. Le banc léger est rebâti sur des VMs Lima (bench/lima/) exécutant le vrai bootstrap kubeadm v1.34 — même chemin que la prod. (Une voie « conteneurs Docker privilégiés / DinD » a été écartée : overlayfs imbriqué non fonctionnel ; la vraie VM Lima le résout.)

  1. Pas de bump silencieux. Toute montée de version se fait dans une branche dédiée + PR.
  2. Vérifier la compat croisée avant :
    • Cilium release notes → quel K8s testé ?
    • Rook release notes → quel K8s + quel Ceph supportés ?
    • Ceph release notes → quelle version Rook minimale ?
  3. Pinner partout : tags d’image avec version explicite (jamais :latest ni :N flottant ; idéalement avec digest pour les composants critiques). Le digest DOIT pointer l’index multi-arch (image.index / manifest.list), JAMAIS un manifeste single-arch — sinon exec format error sur arm64 (#140). Vérification : scripts/audit-image-digests.sh (audite tous les digests épinglés du dépôt).
    • GitHub Actions (uses:) : épinglées par SHA de commit (jamais @vX ni @branch — un tag est mutable, une branche encore plus), avec en commentaire le tag de référence depuis lequel le SHA a été résolu : uses: owner/repo@<sha40> # vX (le tag majeur que l’action publie, ex. # v4 ; le patch exact si l’action ne publie qu’un tag patch, ex. # v0.36.0). Même esprit que le digest d’image : une référence immuable, le commentaire ne servant qu’à la lisibilité humaine. Le bump suit la même discipline (mettre à jour SHA + commentaire dans la même PR). Source de version K8s du bootstrap = k8s_minor/k8s_patch (bootstrap/group_vars/all.yaml, #295) : un bump K8s y change le patch, le dépôt apt ET kubernetesVersion à l’init en un seul point.
  4. Valider sur le banc multi-nœuds (bench/lima/) avant tout déploiement sur une topologie cible : déployer la nouvelle version, vérifier state.sh toutes couches vertes, jouer un cycle bootstrap → rollback → re-bootstrap.
  5. Mettre à jour cette ADR (avec la nouvelle matrice + date).

Accepted (2026-05-28). Matrice étendue le 2026-06-03 : observabilité, DataOps et outillage des bancs (abandon de kind).

Bénéfices.

  • Reproductibilité du provisionnement : la matrice est lisible d’un coup d’œil.
  • Pas de surprise d’incompatibilité au déploiement.

Coûts assumés.

  • Travail de veille : il faut vérifier les release notes croisées avant chaque bump. Compensation : les bumps sont rares (annuels pour K8s, semi-annuels pour Cilium/Rook).
  • Pas d’auto-update : un nouveau patch (1.34.91.34.10) ne s’applique que via re-exécution du rôle après bump explicite.

Sources à surveiller.