본문으로 건너뛰기

MinIO

MinIO는 제품 업로드, 생성 아티팩트, Vault 백엔드 스토리지, 여러 백업 흐름을 위한 Lumie의 공유 오브젝트 스토어입니다. 이후 GitOps 애플리케이션이 먼저 존재해야 하므로 bootstrap이 이를 소유합니다.

소스 경로

  • lumie-infra/bootstrap/minio/argocd.yaml
  • lumie-infra/bootstrap/minio/helm-values.yaml
  • lumie-infra/bootstrap/minio/common-values.yaml
  • lumie-infra/bootstrap/minio/manifests/r2-barman-vss.yaml
  • lumie-infra/bootstrap/minio/manifests/r2-snapshot-cronjob.yaml
  • lumie-infra/bootstrap/minio/manifests/upload-proxy-ingress.yaml
  • lumie-infra/provision/ansible/roles/storage-setup/tasks/main.yml
  • lumie-infra/security/teleport/agent/helm-values.yaml

런타임 형태

배포되는 것

  • replicas: 4drivesPerNode: 1인 분산 MinIO
  • 모두 minio-local StorageClass를 사용하는 노드당 로컬 PV 1개
  • charts/common에서 렌더링되는 별도 minio-ui 콘솔 deployment
  • root credential secret에 대한 VaultStaticSecret refresh
  • 선택된 버킷을 R2로 미러링하는 하루 두 번 snapshot CronJob
  • presigned 업로드 경로에 대해 PUTOPTIONS만 허용하는 Traefik IngressRoute

핵심 계약

  • 로컬 디스크 경로는 lumie-infra/bootstrap/minio/common-values.yamlcommon.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으로 다시 쓰는 minio Teleport 앱을 통해 노출됩니다.
  • API와 콘솔 모두 표준 Kubernetes ingress는 비활성화되어 있으며, 저장소에 정의된 유일한 퍼블릭 HTTP 경로는 upload proxy입니다.

백업 및 복제 흐름

  • CNPG 관련 및 기타 오브젝트 소비자는 MinIO 버킷에 기록합니다.
  • minio-r2-snapshotAsia/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 알림이 포함되어 있습니다.

관련 페이지