MinIO
MinIO는 제품 업로드, 생성 아티팩트, Vault 백엔드 스토리지, 여러 백업 흐름을 위한 Lumie의 공유 오브젝트 스토어입니다. 이후 GitOps 애플리케이션이 먼저 존재해야 하므로 bootstrap이 이를 소유합니다.
소스 경로
lumie-infra/bootstrap/minio/argocd.yamllumie-infra/bootstrap/minio/helm-values.yamllumie-infra/bootstrap/minio/common-values.yamllumie-infra/bootstrap/minio/manifests/r2-barman-vss.yamllumie-infra/bootstrap/minio/manifests/r2-snapshot-cronjob.yamllumie-infra/bootstrap/minio/manifests/upload-proxy-ingress.yamllumie-infra/provision/ansible/roles/storage-setup/tasks/main.ymllumie-infra/security/teleport/agent/helm-values.yaml
런타임 형태
배포되는 것
replicas: 4와drivesPerNode: 1인 분산 MinIO- 모두
minio-localStorageClass를 사용하는 노드당 로컬 PV 1개 charts/common에서 렌더링되는 별도minio-ui콘솔 deployment- root credential secret에 대한 VaultStaticSecret refresh
- 선택된 버킷을 R2로 미러링하는 하루 두 번 snapshot CronJob
- presigned 업로드 경로에 대해
PUT와OPTIONS만 허용하는 TraefikIngressRoute
핵심 계약
- 로컬 디스크 경로는
lumie-infra/bootstrap/minio/common-values.yaml의common.persistentVolumes에서 옵니다. - 버킷 수명주기는 다음 post-install 명령으로 강제됩니다.
customCommands:
- command: ilm rule add myminio/lumie --prefix "tmp/" --expire-days 1
소스 경로: lumie-infra/bootstrap/minio/helm-values.yaml
- 직접 브라우저 업로드는 임시 prefix로 제한됩니다.
- match: Host(`lumie-edu.com`) && PathPrefix(`/lumie/tmp/`) && (Method(`PUT`) || Method(`OPTIONS`))
- match: Host(`dev.lumie-infra.com`) && PathPrefix(`/lumie-dev/tmp/`) && (Method(`PUT`) || Method(`OPTIONS`))
소스 경로: lumie-infra/bootstrap/minio/manifests/upload-proxy-ingress.yaml
접근 경계
- 애플리케이션 트래픽은 내부 S3 호환 엔드포인트
http://minio.minio.svc:9000을 사용합니다. - 콘솔은
http://minio-ui.minio.svc.cluster.local:9090을 프록시하고 host를minio.lumie-infra.com으로 다시 쓰는minioTeleport 앱을 통해 노출됩니다. - API와 콘솔 모두 표준 Kubernetes ingress는 비활성화되어 있으며, 저장소에 정의된 유일한 퍼블릭 HTTP 경로는 upload proxy입니다.
백업 및 복제 흐름
- CNPG 관련 및 기타 오브젝트 소비자는 MinIO 버킷에 기록합니다.
minio-r2-snapshot은Asia/Seoul시간대 기준0 4,16 * * *에 실행됩니다.- snapshot job은
lumie,lumie-dev,vault버킷을r2/lumie-dr/snapshots/<bucket>/<timestamp>/로 미러링합니다.
장애 지점
- 로컬 PV 손실이나 노드 누락은 분산 erasure-coded 용량을 깨뜨리고, 긴 healing이나 내구성 저하를 유발할 수 있습니다.
minio-root-password시크릿이 갱신되지 않으면 MinIO StatefulSet과 snapshot CronJob이 기대한 자격 증명과 어긋납니다.- upload proxy는
tmp/prefix와PUT또는OPTIONS만 허용합니다. 영구 오브젝트 키나 다른 HTTP method를 사용하면 설계상 실패합니다. tmp/ILM 규칙은 임시 오브젝트를 하루 뒤 자동 삭제하므로, 해당 오브젝트가 영구적일 것이라 기대하는 워크플로는 나중에 실패합니다.
검증
kubectl get applications.argoproj.io -n argocd minio
kubectl get pods -n minio
kubectl get pvc,pv -n minio
kubectl get cronjobs -n minio
kubectl get jobs -n minio | rg minio-r2-snapshot
kubectl get ingressroutes.traefik.io -n minio
성공은 minio Application이 Synced/Healthy이며, StatefulSet pod가 Ready이고, PVC가 Bound 상태이며, snapshot CronJob이 존재하고, 최근 snapshot Job이 보이며, Traefik이 저장소가 관리하는 upload proxy 경로를 노출함을 의미합니다.
관측성
- MinIO Helm values는
release: prometheus라벨이 있는 ServiceMonitor를 활성화합니다. - Grafana는
lumie-infra/observability/grafana/dashboards/minio.json에 MinIO 대시보드 JSON을 보관합니다. - Prometheus rule 파일에도
lumie-infra/observability/prometheus/helm-values.yaml안에 MinIO replication 알림이 포함되어 있습니다.