03 · Платформа: DevOps, k8s, сеть, хранилище3.5 · Longhorn и хранилища3.5.3средний

Object storage: MinIO и артефакты ML

Зачем это нужно

Блочное хранилище (Longhorn, PVC) — для low-latency доступа с одного Pod. Object storage — для больших файлов, версионирования и доступа многих сервисов по HTTP API в стиле Amazon S3. На MDP MinIO часто играет роль «внутреннего S3»: модели, датасеты, логи пайплайнов, backup Longhorn.

Если вы работали только с open() и путями в Python — S3 это другая модель: не «файл на диске», а bucket + key + HTTP PUT/GET. Библиотеки (boto3, minio-py) скрывают детали, но ментальная модель нужна для отладки CI и inference.

Основные идеи

Ключевые понятия S3-совместимого API.

  • Bucket — именованный контейнер (ml-models, ml-datasets). Имя глобально уникально в пределах инстанса.

  • Object (key) — путь внутри bucket: scorer/v42/model.onnx, train/run-128/metrics.json.

  • Endpoint — URL API: https://minio.mdp.internal или in-cluster minio.minio-system.svc:9000.

  • Credentials — access key + secret key (как логин/пароль для API, не для Linux-user).

MinIO vs PVC.

Критерий MinIO (object) Longhorn (block/PVC)
Размер типичного объекта GB–TB GB (том фиксирован)
Много Pod читают одновременно Да RWO — один writer
Latency миллисекунды–секунды (сеть) низкая, локальный block
Версионирование объектов встроено (policy) snapshots тома

Типичный ML-поток.

  1. Jenkins/Argo Workflow обучает модель → PUT s3://ml-models/scorer/v43/.

  2. MLflow или custom registry хранит URI в metadata.

  3. Inference Deployment при старте: aws s3 cp или init container → опционально кэш на PVC.

  4. Feature pipeline пишет parquet в s3://features/churn/dt=2026-07-31/.

Секреты в Kubernetes. Ключи MinIO — в Secret; Pod получает через env или mounted file:

` env:

  • name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: minio-credentials key: accesskey
  • name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: minio-credentials key: secretkey
  • name: AWS_ENDPOINT_URL value: "http://minio.minio-system.svc:9000" `

Python (boto3) — тот же код, что для AWS S3, с другим endpoint:

` import boto3

s3 = boto3.client( "s3", endpoint_url="http://minio.minio-system.svc:9000", aws_access_key_id="...", aws_secret_access_key="...", ) s3.download_file("ml-models", "scorer/v42/model.onnx", "/models/model.onnx") `

Immutability и версии. Ключ scorer/v42/ не перезаписывают — публикуют v43. Rollback inference = смена tag в Helm values, не копирование файлов по SSH.

Как это выглядит на практике

CI публикует артефакт после тестов:

mc alias set mdp http://minio.minio-system.svc:9000 "$ACCESS" "$SECRET" mc cp model.onnx mdp/ml-models/scorer/v43/model.onnx

Inference chart (values.yaml):

model: bucket: ml-models key: scorer/v43/model.onnx cachePvc: "" # пусто — качать при каждом старте; или включить PVC-кэш

Отладка доступа из Pod:

kubectl run -it --rm debug --image=amazon/aws-cli --restart=Never -- \ aws --endpoint-url=http://minio.minio-system.svc:9000 s3 ls s3://ml-models/

Ошибки 403 Forbidden — неверные credentials или bucket policy. NoSuchBucket — опечатка в имени.

Связь с остальной платформой. Longhorn backup target может быть MinIO bucket. Argo Workflows сохраняет логи и артефакты шагов в S3. Feature Store читает training data из parquet в bucket.

Что сделать после занятия

  • Загрузите тестовый файл в bucket через mc или boto3 из локальной машины / Pod.

  • Напишите 5 строк Python: скачать объект по key в /tmp и проверить размер файла.

  • Сравните: когда для inference достаточно MinIO без PVC, а когда нужен Longhorn-кэш.

Официальные материалы