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.
- 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-clusterminio.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-кэш.