MinIO tournait sans une seule sonde — trois jours de panne invisible #32
@@ -0,0 +1,19 @@
|
|||||||
|
# Motifs exclus de l'empaquetage Helm.
|
||||||
|
#
|
||||||
|
# ⚠ `iac/` est la raison d'être de ce fichier : il porte le Terraform des
|
||||||
|
# buckets, et son `.terraform/` local contient un binaire de provider de plus de
|
||||||
|
# 5 Mo — au-dessus de la limite par fichier de Helm. Un `helm template minio/`
|
||||||
|
# lancé depuis un poste où le Terraform a été initialisé ÉCHOUE sans ce fichier :
|
||||||
|
# Error: chart file "terraform-provider-minio_v3.3.0" is larger than the
|
||||||
|
# maximum file size 5242880
|
||||||
|
# ArgoCD ne le voyait pas (`.terraform` est gitignoré), donc le défaut ne se
|
||||||
|
# manifestait qu'en local, à la relecture — c'est-à-dire au pire moment.
|
||||||
|
.terraform/
|
||||||
|
iac/
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
*.tmproj
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
+26
-18
@@ -14,27 +14,35 @@
|
|||||||
# master d'une vidéo reste sur l'appareil de son propriétaire — ADR-018 du front) ;
|
# master d'une vidéo reste sur l'appareil de son propriétaire — ADR-018 du front) ;
|
||||||
# la redondance de Longhorn suffit, l'erasure coding distribué de MinIO coûterait
|
# la redondance de Longhorn suffit, l'erasure coding distribué de MinIO coûterait
|
||||||
# de la RAM et des IOPS que des Pi n'ont pas à dépenser pour ça.
|
# de la RAM et des IOPS que des Pi n'ont pas à dépenser pour ça.
|
||||||
|
#
|
||||||
|
# ⚠⚠ CE CHART EST AUTONOME DEPUIS LE 2026-09-02, ET CE N'EST PAS UN CAPRICE.
|
||||||
|
# Il dépendait du sous-chart officiel `minio/minio` 5.4.0. Ce chart N'OFFRE
|
||||||
|
# AUCUNE SONDE DE SANTÉ — vérifié sur toutes ses versions publiées, la 5.4.0
|
||||||
|
# étant la dernière : pas une clé `livenessProbe` dans ses valeurs, pas un rendu
|
||||||
|
# de sonde dans ses templates. MinIO tournait donc sans le moindre contrôle, et
|
||||||
|
# une panne totale de trois jours est passée inaperçue (arcodange-org/tools#31).
|
||||||
|
#
|
||||||
|
# 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 — huit objets,
|
||||||
|
# tous dans templates/, chacun commenté avec ce qu'il reprend à l'identique et
|
||||||
|
# ce qu'il change délibérément.
|
||||||
|
#
|
||||||
|
# CE QU'ON REPREND À NOTRE CHARGE, ET QU'IL FAUT DONC SUIVRE À LA MAIN : le
|
||||||
|
# `tag` de l'image (values.yaml), qui n'est plus tiré par la version du chart.
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
name: minio
|
name: minio
|
||||||
description: A Helm chart for Kubernetes
|
description: Stockage objet S3 du homelab — manifestes rendus ici, sans sous-chart.
|
||||||
|
|
||||||
dependencies:
|
# ⚠ Plus AUCUNE dépendance, et c'est délibéré :
|
||||||
- name: tool
|
# - `minio/minio` 5.4.0 est parti pour la raison ci-dessus ;
|
||||||
version: 0.1.0
|
# - la bibliothèque `tool` n'était utilisée que par templates/helm-chart*.yaml,
|
||||||
repository: https://gitea.arcodange.lab/api/packages/arcodange-org/helm
|
# deux fichiers inertes (gardés par `tool.kind == "HelmChart"`, jamais vrai
|
||||||
- name: minio
|
# ici) supprimés dans le même passage.
|
||||||
version: 5.4.0
|
# Effet de bord bienvenu : la synchronisation ArgoCD ne dépend plus de deux
|
||||||
repository: https://charts.min.io/
|
# dépôts Helm distants — un point de panne en moins sur le stockage objet.
|
||||||
|
dependencies: []
|
||||||
|
|
||||||
# A chart can be either an 'application' or a 'library' chart.
|
|
||||||
#
|
|
||||||
# Application charts are a collection of templates that can be packaged into versioned archives
|
|
||||||
# to be deployed.
|
|
||||||
#
|
|
||||||
# Library charts provide useful utilities or functions for the chart developer. They're included as
|
|
||||||
# a dependency of application charts to inject those utilities and functions into the rendering
|
|
||||||
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
|
|
||||||
type: application
|
type: application
|
||||||
version: 0.1.0
|
version: 0.2.0
|
||||||
appVersion: "latest"
|
appVersion: "RELEASE.2024-12-18T13-15-44Z"
|
||||||
|
|||||||
@@ -0,0 +1,172 @@
|
|||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# MinIO — Deployment écrit À LA MAIN, et voici pourquoi.
|
||||||
|
#
|
||||||
|
# ⚠⚠ LE CHART OFFICIEL `minio/minio` N'OFFRE AUCUNE SONDE DE SANTÉ.
|
||||||
|
# Vérifié sur la 5.4.0 (la dernière au 2026-09-02) : aucune clé `livenessProbe`
|
||||||
|
# dans ses `values.yaml`, aucun rendu de sonde dans ses `templates/`. Ce n'était
|
||||||
|
# donc pas un oubli de configuration de notre part — il n'y avait rien à
|
||||||
|
# configurer. On reprend le manifeste à notre charge pour pouvoir poser la sonde.
|
||||||
|
#
|
||||||
|
# CE QUE ÇA A COÛTÉ, MESURÉ (arcodange-org/tools#31) :
|
||||||
|
# le 2026-08-29 à 14 h 11, les répliques Longhorn se perdent de vue sur le réseau
|
||||||
|
# (`R/W Timeout. No response received in 8s`) ; le moteur les marque `ERR` une à
|
||||||
|
# une ; à 15 h 32 le périphérique bloc disparaît sous MinIO ; à 17 h 54 **ext4
|
||||||
|
# abandonne son journal** (`comm minio: Detected aborted journal`). À partir de
|
||||||
|
# là, toute écriture rend `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 lui-même (`1/1 Running`, `0 restart`)
|
||||||
|
# affichaient tous vert. Trois jours de panne totale du stockage objet, et pas
|
||||||
|
# un seul indicateur rouge.
|
||||||
|
#
|
||||||
|
# ⚠ LE POD NE REDÉMARRE PAS QUAND SON SYSTÈME DE FICHIERS MEURT. Le processus
|
||||||
|
# vit ; c'est tout ce que Kubernetes regardait, faute de sonde.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: minio
|
||||||
|
namespace: tools
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
# ⚠ IMMUABLE, et repris À L'IDENTIQUE de ce que le sous-chart avait posé :
|
||||||
|
# changer un `selector` sur un Deployment existant fait ÉCHOUER l'application,
|
||||||
|
# et ArgoCD le recréerait — donc détacherait puis rattacherait le volume.
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
|
strategy:
|
||||||
|
# ⚠ `Recreate`, PAS `RollingUpdate` : le volume est ReadWriteOnce. Un
|
||||||
|
# roulement voudrait deux pods à la fois, le second resterait en
|
||||||
|
# `ContainerCreating` sur un `Multi-Attach error` jusqu'au timeout, et le
|
||||||
|
# déploiement paraîtrait « en cours » pendant des minutes. Le chart amont
|
||||||
|
# posait `maxSurge: 100%`, ce qui est le mauvais réglage pour un RWO.
|
||||||
|
type: Recreate
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
|
spec:
|
||||||
|
serviceAccountName: minio
|
||||||
|
securityContext:
|
||||||
|
# Repris tel quel : la donnée déjà écrite sur le volume appartient à
|
||||||
|
# 1000:1000. Changer ces valeurs rendrait le bucket illisible.
|
||||||
|
runAsUser: 1000
|
||||||
|
runAsGroup: 1000
|
||||||
|
fsGroup: 1000
|
||||||
|
fsGroupChangePolicy: OnRootMismatch
|
||||||
|
terminationGracePeriodSeconds: 30
|
||||||
|
containers:
|
||||||
|
- name: minio
|
||||||
|
image: "{{ .Values.minio.image.repository }}:{{ .Values.minio.image.tag }}"
|
||||||
|
imagePullPolicy: {{ .Values.minio.image.pullPolicy }}
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -ce
|
||||||
|
- /usr/bin/docker-entrypoint.sh minio server /export -S /etc/minio/certs/ --address :9000 --console-address :9001
|
||||||
|
env:
|
||||||
|
# Identifiants JAMAIS dans le dépôt : le secret est matérialisé par
|
||||||
|
# le Vault Secrets Operator depuis kvv2/minio/config.
|
||||||
|
- name: MINIO_ROOT_USER
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Values.minio.existingSecret }}
|
||||||
|
key: rootUser
|
||||||
|
- name: MINIO_ROOT_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Values.minio.existingSecret }}
|
||||||
|
key: rootPassword
|
||||||
|
{{- range $cle, $valeur := .Values.minio.environment }}
|
||||||
|
- name: {{ $cle }}
|
||||||
|
value: {{ $valeur | quote }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 9000
|
||||||
|
protocol: TCP
|
||||||
|
- name: http-console
|
||||||
|
containerPort: 9001
|
||||||
|
protocol: TCP
|
||||||
|
# ---------------------------------------------------------------
|
||||||
|
# LES SONDES — la raison d'être de ce fichier.
|
||||||
|
#
|
||||||
|
# ⚠ `/minio/health/live` NE SUFFIT PAS, et c'est mesuré : il répond
|
||||||
|
# 200 sur un magasin QUI NE PEUT PLUS ÉCRIRE. C'est précisément
|
||||||
|
# pourquoi la panne du 29 août est restée invisible trois jours.
|
||||||
|
#
|
||||||
|
# `/minio/health/cluster` vérifie le QUORUM D'ÉCRITURE — la propriété
|
||||||
|
# qu'on veut réellement garder.
|
||||||
|
#
|
||||||
|
# SABOTAGE RELEVÉ (2026-09-02, 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** |
|
||||||
|
#
|
||||||
|
# Sabotage : `format.json` de deux disques sur quatre écrasé. La bascule
|
||||||
|
# de `cluster` est survenue entre t+20 s et t+40 s. `live` n'a jamais
|
||||||
|
# bougé. Les DEUX moitiés comptent : la sonde rougit quand la propriété
|
||||||
|
# est violée, ET reste verte sinon.
|
||||||
|
# ---------------------------------------------------------------
|
||||||
|
startupProbe:
|
||||||
|
# Au démarrage on interroge `live` : tant que MinIO monte, `cluster`
|
||||||
|
# répond 503 pour une raison légitime, et l'interroger ici tuerait
|
||||||
|
# le pod avant qu'il ait fini de démarrer.
|
||||||
|
# 24 × 5 s = 2 min accordées au démarrage.
|
||||||
|
httpGet:
|
||||||
|
path: /minio/health/live
|
||||||
|
port: 9000
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 24
|
||||||
|
readinessProbe:
|
||||||
|
# Retire MinIO du Service quand il ne peut plus écrire : les clients
|
||||||
|
# reçoivent un refus franc au lieu d'un dépôt qui part dans le vide.
|
||||||
|
httpGet:
|
||||||
|
path: /minio/health/cluster
|
||||||
|
port: 9000
|
||||||
|
periodSeconds: 15
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 3
|
||||||
|
livenessProbe:
|
||||||
|
# ⚠ C'EST CELLE-CI QUI AURAIT LEVÉ LA PANNE : le remède au journal
|
||||||
|
# ext4 abandonné est un démontage, donc un redémarrage du pod.
|
||||||
|
#
|
||||||
|
# ⚠ 6 × 30 s = 3 MINUTES de refus SOUTENU avant de redémarrer. Cette
|
||||||
|
# grappe connaît des à-coups Longhorn de quelques secondes (le
|
||||||
|
# déclencheur du 29 août était un `R/W Timeout` de 8 s) : une sonde
|
||||||
|
# nerveuse redémarrerait MinIO sur un hoquet. C'est l'erreur exacte
|
||||||
|
# que redis a payée ici en 2026-07 — 836 échecs de sonde, 135
|
||||||
|
# redémarrages, et un `.fr` en 403 (voir redis/values.yaml).
|
||||||
|
httpGet:
|
||||||
|
path: /minio/health/cluster
|
||||||
|
port: 9000
|
||||||
|
periodSeconds: 30
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 6
|
||||||
|
resources:
|
||||||
|
{{- toYaml .Values.minio.resources | nindent 12 }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: export
|
||||||
|
mountPath: /export
|
||||||
|
- name: minio-user
|
||||||
|
mountPath: /tmp/credentials
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: export
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: minio
|
||||||
|
- name: minio-user
|
||||||
|
secret:
|
||||||
|
secretName: {{ .Values.minio.existingSecret }}
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
{{- if eq .Values.tool.kind "HelmChart" -}}
|
|
||||||
{{- include "tool.helm-chart-config.tpl" . -}}
|
|
||||||
{{- end -}}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
{{- if eq .Values.tool.kind "HelmChart" -}}
|
|
||||||
{{- include "tool.helm-chart.tpl" . -}}
|
|
||||||
{{- end -}}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# Les deux expositions INTERNES (`.lab`). L'exposition publique de l'API S3 vit
|
||||||
|
# dans ingress-public.yaml, avec ses propres avertissements.
|
||||||
|
#
|
||||||
|
# ⚠ La console d'administration n'est PAS exposée publiquement, et ça ne doit
|
||||||
|
# pas changer par inadvertance : elle porte les identifiants racine.
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: minio
|
||||||
|
namespace: tools
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: s3.arcodange.lab
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: minio
|
||||||
|
port:
|
||||||
|
number: 9000
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: minio-console
|
||||||
|
namespace: tools
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: minio.arcodange.lab
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: minio-console
|
||||||
|
port:
|
||||||
|
number: 9001
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Le volume de données. ⚠⚠ C'EST L'OBJET LE PLUS DANGEREUX DE CE LOT.
|
||||||
|
#
|
||||||
|
# Il était rendu par le sous-chart `minio/minio`. En reprenant les manifestes à
|
||||||
|
# notre charge, si on avait OUBLIÉ de le rendre ici, ArgoCD l'aurait ÉLAGUÉ —
|
||||||
|
# c'est-à-dire supprimé, avec les vidéos dedans.
|
||||||
|
#
|
||||||
|
# ⚠ `volumeName` n'est VOLONTAIREMENT pas déclaré : c'est le contrôleur qui
|
||||||
|
# pose ce champ à la liaison. ArgoCD ignore ce qui existe en vie sans être
|
||||||
|
# déclaré, donc la liaison actuelle (pvc-ebb2605f-…) survit ; et le figer ici
|
||||||
|
# empêcherait toute recréation future de se lier à un autre volume.
|
||||||
|
#
|
||||||
|
# ⚠ La plupart des champs d'un PVC sont IMMUABLES. Ce fichier reproduit à
|
||||||
|
# l'identique ce que le sous-chart avait posé — le modifier n'aurait pas l'effet
|
||||||
|
# qu'on croit, il ferait échouer l'application.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: minio
|
||||||
|
namespace: tools
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
|
annotations:
|
||||||
|
# Ceinture ET bretelles : même si ce manifeste disparaissait un jour du
|
||||||
|
# dépôt, ArgoCD ne supprimerait pas le volume de lui-même.
|
||||||
|
argocd.argoproj.io/sync-options: Prune=false
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
storageClassName: {{ .Values.minio.persistence.storageClass }}
|
||||||
|
volumeMode: Filesystem
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
# 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.
|
||||||
|
storage: {{ .Values.minio.persistence.size }}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# API S3 (les applications parlent ici) et console d'administration (humains).
|
||||||
|
# Deux Services distincts parce que deux ingress distincts les exposent, et que
|
||||||
|
# seul le premier est ouvert publiquement (voir ingress-public.yaml).
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: minio
|
||||||
|
namespace: tools
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
selector:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 9000
|
||||||
|
targetPort: 9000
|
||||||
|
protocol: TCP
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: minio-console
|
||||||
|
namespace: tools
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
selector:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 9001
|
||||||
|
targetPort: 9001
|
||||||
|
protocol: TCP
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# 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 — un SA pour le pod, le même pour Vault,
|
||||||
|
# rien à réconcilier.
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: minio
|
||||||
|
namespace: tools
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
release: minio
|
||||||
+34
-56
@@ -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).
|
# 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:
|
image:
|
||||||
repository: quay.io/minio/minio
|
repository: quay.io/minio/minio
|
||||||
|
tag: RELEASE.2024-12-18T13-15-44Z
|
||||||
pullPolicy: IfNotPresent
|
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
|
# 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/).
|
# Vault Secrets Operator depuis kvv2/minio/config (voir templates/ et iac/).
|
||||||
# Le chart lit `.data.rootUser` et `.data.rootPassword` de ce secret.
|
# Les clés `rootUser` / `rootPassword` gardent les noms qu'attendait le chart
|
||||||
|
# officiel — les renommer obligerait à toucher Vault pour rien.
|
||||||
existingSecret: minio-config
|
existingSecret: minio-config
|
||||||
|
|
||||||
persistence:
|
persistence:
|
||||||
enabled: true
|
|
||||||
storageClass: longhorn
|
storageClass: longhorn
|
||||||
accessMode: ReadWriteOnce
|
|
||||||
# 50 Gi ≈ 250 heures de cours au palier « travail » de Kadans (360p,
|
# 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
|
# 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.
|
# nœuds : compter ×3 sur la capacité du cluster avant d'augmenter.
|
||||||
@@ -42,45 +50,15 @@ minio: &minio_config
|
|||||||
limits:
|
limits:
|
||||||
memory: 2Gi
|
memory: 2Gi
|
||||||
|
|
||||||
# API S3 (les applications parlent ici).
|
environment:
|
||||||
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
|
# Métriques : Prometheus (namespace `tools`) scrape déjà la façade et le
|
||||||
# laptop (ADR-0014 du dossier) — MinIO rejoint la même vue.
|
# laptop (ADR-0014 du dossier) — MinIO rejoint la même vue.
|
||||||
metrics:
|
#
|
||||||
serviceMonitor:
|
# ⚠ Cette variable était déclarée DEUX FOIS sur le Deployment rendu par le
|
||||||
enabled: false # pas d'opérateur Prometheus ici : scrape par annotation
|
# sous-chart (une fois par le chart, une fois par nos `environment`) —
|
||||||
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"
|
MINIO_PROMETHEUS_AUTH_TYPE: "public"
|
||||||
# CORS : le navigateur téléverse directement (URL présignées) — origines
|
# CORS : le navigateur téléverse directement (URL présignées) — origines
|
||||||
# EXACTES, jamais « * » : une URL qui fuite serait sinon rejouable partout.
|
# EXACTES, jamais « * » : une URL qui fuite serait sinon rejouable partout.
|
||||||
MINIO_API_CORS_ALLOW_ORIGIN: "https://kadans.arcodange.fr,https://kadans.arcodange.lab"
|
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