MinIO tournait sans une seule sonde — trois jours de panne invisible
Le 29 août à 17 h 54, ext4 a abandonné son journal sous MinIO (`comm minio: Detected aborted journal`), après que les répliques Longhorn se soient perdues de vue sur le réseau. Toute écriture rendait `EIO`. Longhorn s'est rétabli TOUT SEUL le 30 août à 11 h 50. Mais un journal ext4 abandonné ne se répare jamais seul : il le reste jusqu'au démontage. MinIO est donc resté assis sur un montage mort DEUX JOURS APRÈS la réparation du stockage, pendant que Longhorn (`healthy`), les répliques (`RW`), les nœuds, ArgoCD (`Synced, Healthy`) et le pod (`1/1 Running`, `0 restart`) affichaient tous vert. Le remède a été un `scale --replicas=0` : « insufficient » dans les journaux, 6126 → 0. Le pod ne redémarre pas quand son système de fichiers meurt : le processus vit, et c'est tout ce que Kubernetes regardait — faute de sonde. ⚠⚠ Et ce n'était pas un oubli de configuration : LE CHART OFFICIEL `minio/minio` N'OFFRE AUCUNE SONDE, dans aucune de ses versions (5.4.0 est la dernière). Pas une clé `livenessProbe` dans ses valeurs, pas un rendu de sonde dans ses templates. Il n'existe aucun moyen de greffer une sonde sur le Deployment d'un sous-chart depuis un chart parent : on rend donc les manifestes nous-mêmes. SABOTAGE RELEVÉ (MinIO jetable, quatre disques, LES DEUX MOITIÉS DANS LE MÊME POD, même image) : | état du magasin | /health/live | /health/cluster | |-------------------------|--------------|-----------------| | 4 disques sains | 200 | **200** | | quorum d'écriture perdu | **200** | **503** | `format.json` de deux disques sur quatre écrasé ; bascule de `cluster` entre t+20 s et t+40 s ; `live` n'a JAMAIS bougé. C'est exactement pourquoi la panne était invisible — et pourquoi la sonde vise `cluster`, pas `live`. Ce que le lot change d'autre, délibérément : - `RollingUpdate (maxSurge 100%)` → `Recreate` : le volume est ReadWriteOnce, un roulement laissait le second pod en `Multi-Attach error` jusqu'au timeout - `MINIO_PROMETHEUS_AUTH_TYPE` était déclaré DEUX FOIS (kubectl le signalait à chaque application) - le `post-job` et son ConfigMap de 25 Ko disparaissent : `buckets` était vide et le ConfigMap n'était monté par AUCUN conteneur (vérifié sur le Deployment vivant avant de le retirer) - plus aucune dépendance Helm : un point de panne distant en moins sur le chemin de synchronisation du stockage objet ⚠ Le PVC est l'objet dangereux de ce lot : ne pas le rendre ici l'aurait fait ÉLAGUER par ArgoCD, avec les vidéos dedans. Il est rendu à l'identique (son `spec` ne bouge pas d'un champ, vérifié par `kubectl diff`), sans `volumeName` — que le contrôleur pose lui-même — et porte `Prune=false` en ceinture. Vérifications, codes relevés : - `helm template` : code 0, 10 objets (les 11 d'ArgoCD moins le ConfigMap) - `kubectl apply --dry-run=server` : code 0, les 10 en `configured`, aucun en `created`, aucune violation de champ immuable - `kubectl diff` : le `spec` du PVC intact, les `selector` et ports des deux Services identiques Refs: arcodange-org/tools#31
This commit is contained in:
+35
-57
@@ -1,33 +1,41 @@
|
||||
minio: &minio_config
|
||||
# -----------------------------------------------------------------------------
|
||||
# ⚠ Depuis le 2026-09-02, ces valeurs alimentent NOS PROPRES manifestes
|
||||
# (templates/deployment.yaml & co.), plus un sous-chart. Beaucoup de réglages
|
||||
# qui vivaient ici sont devenus du manifeste explicite — on dit ci-dessous où
|
||||
# chacun est parti, pour qu'on ne les cherche pas en vain :
|
||||
#
|
||||
# mode / replicas → templates/deployment.yaml (`replicas: 1`)
|
||||
# serviceAccount.* → templates/serviceaccount.yaml
|
||||
# ingress / consoleIngress→ templates/ingress.yaml (le public : ingress-public.yaml)
|
||||
# buckets: [] → n'existe plus : chaque app déclare les siens
|
||||
# depuis son dépôt, via iac/modules/minio_app
|
||||
# metrics.serviceMonitor → n'existe plus : pas d'opérateur Prometheus ici,
|
||||
# le scrape se fait par annotation
|
||||
#
|
||||
# ⚠ Et le `post-job` du chart officiel (création de buckets et d'utilisateurs)
|
||||
# n'existe plus non plus. Il ne faisait rien : `buckets` était vide, et son
|
||||
# ConfigMap de 25 Ko n'était monté par AUCUN conteneur — vérifié sur le
|
||||
# Deployment vivant avant de le retirer.
|
||||
# -----------------------------------------------------------------------------
|
||||
minio:
|
||||
# Image officielle MinIO — multi-arch, arm64 inclus (les nœuds sont des Pi 5).
|
||||
#
|
||||
# ⚠ LE TAG EST MAINTENANT À NOTRE CHARGE. Il était auparavant choisi par la
|
||||
# version du sous-chart ; plus personne ne le fait avancer tout seul. C'est le
|
||||
# prix assumé de l'autonomie du chart — à relever quand on met à jour.
|
||||
image:
|
||||
repository: quay.io/minio/minio
|
||||
tag: RELEASE.2024-12-18T13-15-44Z
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
# STANDALONE : un seul serveur, un seul volume. La donnée servie ici est
|
||||
# DÉRIVÉE (le master reste chez l'utilisateur) et Longhorn réplique déjà le
|
||||
# volume ; l'erasure coding distribué coûterait de la RAM que les Pi n'ont pas
|
||||
# à dépenser pour ça. `replicas` est ignoré en standalone.
|
||||
mode: standalone
|
||||
replicas: 1
|
||||
|
||||
# Le rôle Vault du module `app_roles` borne l'authentification au SERVICE
|
||||
# ACCOUNT nommé comme l'app (`bound_service_account_names = [minio]`) : on
|
||||
# aligne donc le SA du pod sur ce nom, plutôt que le « minio-sa » par défaut
|
||||
# du chart amont — un SA pour le pod, le même pour Vault, rien à réconcilier.
|
||||
serviceAccount:
|
||||
create: true
|
||||
name: minio
|
||||
|
||||
# Identifiants JAMAIS dans le dépôt : le secret est matérialisé par le
|
||||
# Vault Secrets Operator depuis kvv2/minio/config (voir resources/ et iac/).
|
||||
# Le chart lit `.data.rootUser` et `.data.rootPassword` de ce secret.
|
||||
# Vault Secrets Operator depuis kvv2/minio/config (voir templates/ et iac/).
|
||||
# Les clés `rootUser` / `rootPassword` gardent les noms qu'attendait le chart
|
||||
# officiel — les renommer obligerait à toucher Vault pour rien.
|
||||
existingSecret: minio-config
|
||||
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: longhorn
|
||||
accessMode: ReadWriteOnce
|
||||
# 50 Gi ≈ 250 heures de cours au palier « travail » de Kadans (360p,
|
||||
# 3,4 Mo/min — ADR-018 du front). Longhorn réplique ce volume sur les
|
||||
# nœuds : compter ×3 sur la capacité du cluster avant d'augmenter.
|
||||
@@ -42,45 +50,15 @@ minio: &minio_config
|
||||
limits:
|
||||
memory: 2Gi
|
||||
|
||||
# API S3 (les applications parlent ici).
|
||||
ingress:
|
||||
enabled: true
|
||||
ingressClassName: traefik
|
||||
path: /
|
||||
hosts:
|
||||
- s3.arcodange.lab
|
||||
|
||||
# Console d'administration (humains).
|
||||
consoleIngress:
|
||||
enabled: true
|
||||
ingressClassName: traefik
|
||||
path: /
|
||||
hosts:
|
||||
- minio.arcodange.lab
|
||||
|
||||
# Buckets créés au déploiement. `versioning: false` assumé : ces objets sont
|
||||
# DÉRIVÉS et re-générables depuis le master local — versionner doublerait le
|
||||
# stockage pour un filet dont on n'a pas besoin.
|
||||
# AUCUN bucket ici : chaque app déclare les siens depuis son dépôt, via le
|
||||
# module `iac/modules/minio_app`.
|
||||
# ADR : factory/doc/adr/20260726-stockage-objet-minio.md
|
||||
buckets: []
|
||||
|
||||
# Métriques : Prometheus (namespace `tools`) scrape déjà la façade et le
|
||||
# laptop (ADR-0014 du dossier) — MinIO rejoint la même vue.
|
||||
metrics:
|
||||
serviceMonitor:
|
||||
enabled: false # pas d'opérateur Prometheus ici : scrape par annotation
|
||||
environment:
|
||||
# Métriques : Prometheus (namespace `tools`) scrape déjà la façade et le
|
||||
# laptop (ADR-0014 du dossier) — MinIO rejoint la même vue.
|
||||
#
|
||||
# ⚠ Cette variable était déclarée DEUX FOIS sur le Deployment rendu par le
|
||||
# sous-chart (une fois par le chart, une fois par nos `environment`) —
|
||||
# `kubectl` le signalait à chaque application : « hides previous definition
|
||||
# of MINIO_PROMETHEUS_AUTH_TYPE ». Rendre le manifeste nous-mêmes règle ça.
|
||||
MINIO_PROMETHEUS_AUTH_TYPE: "public"
|
||||
# CORS : le navigateur téléverse directement (URL présignées) — origines
|
||||
# EXACTES, jamais « * » : une URL qui fuite serait sinon rejouable partout.
|
||||
MINIO_API_CORS_ALLOW_ORIGIN: "https://kadans.arcodange.fr,https://kadans.arcodange.lab"
|
||||
|
||||
tool:
|
||||
# kind: 'SubChart' or 'HelmChart', if subchart then uncomment Chart.yaml dependency, else comment and use tool library with helm chart template
|
||||
kind: 'SubChart'
|
||||
repo: https://charts.min.io/
|
||||
chart: minio
|
||||
version: 5.4.0
|
||||
values: *minio_config
|
||||
|
||||
Reference in New Issue
Block a user