MLOps Path

3.5.3 · блок 3

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

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.

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.

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

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

Открыть интерактивную версию