Зачем это нужно
Локальный mlserver start доказывает, что модель работает. Production — Deployment в Kubernetes: probes, resources, secrets, GitOps, autoscaling. Этот урок связывает MLServer с платформой из модуля 3: Helm, Argo CD, MinIO для artifacts, Prometheus для метрик.
После урока вы должны понимать минимальный путь «образ в registry → Pod serving traffic».
Основные идеи
Два способа deploy MLServer.
| Подход | Когда |
|---|---|
| Plain Deployment + Service | Учебный минимум, понимание basics |
| KServe InferenceService | Prod platform standard (урок 7.5) |
| SeldonDeployment | Seldon graph, canary (урок 7.3) |
Начинаем с concepts через plain K8s; в capstone — KServe.
Deployment essentials:
apiVersion: apps/v1 kind: Deployment metadata: name: churn-mlserver namespace: ml-prod spec: replicas: 2 selector: matchLabels: app: churn-mlserver template: metadata: labels: app: churn-mlserver spec: containers: - name: mlserver image: registry.mdp.ru/ml/churn-mlserver:44 ports: - containerPort: 8080 resources: requests: cpu: "500m" memory: "512Mi" limits: cpu: "2" memory: "1Gi" readinessProbe: httpGet: path: /v2/health/ready port: 8080 initialDelaySeconds: 10 periodSeconds: 5 livenessProbe: httpGet: path: /v2/health/live port: 8080 initialDelaySeconds: 30
Model artifacts delivery.
Bake into image — simple; rebuild image per model version.
InitContainer + MinIO —
aws s3 cp s3://ml-models/churn/v44/ /models/; main image stable.PVC — platform syncs models to shared volume.
Для частых retrain чаще initContainer or storageUri (KServe).
Service + Ingress/Gateway.
apiVersion: v1 kind: Service metadata: name: churn-mlserver spec: selector: app: churn-mlserver ports: - port: 80 targetPort: 8080
HTTPRoute / Ingress (модуль 3.6) → predict.example.com/v2/models/churn/infer.
Helm chart. Values: image.tag, model.version, replicas, resources. Jenkins MR обновляет tag → Argo sync.
HPA (Horizontal Pod Autoscaler).
` metrics:
- type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70
`
Для ML иногда custom metric RPS (Prometheus adapter) лучше CPU.
Secrets. MinIO credentials через External Secrets / K8s Secret; не в Dockerfile.
NetworkPolicy. Ingress only from Istio gateway namespace; egress to Redis (Feast), MinIO.
Rolling update. maxUnavailable: 0, maxSurge: 1 — zero-downtime if readiness correct. Large model: увеличить initialDelaySeconds.
Как это выглядит на практике
Release pipeline:
ClearML registers
churn/v44→ export joblib to MinIO.Jenkins: build image OR reuse base + only update init script version.
MR
churn-servingHelm:modelVersion: v44.Argo CD sync → rolling update.
Smoke test Job in cluster: curl infer golden sample.
Grafana: RED metrics; compare error rate pre/post.
Rollback. Revert Git commit modelVersion: v43 → Argo selfHeal. Faster than manual kubectl.
Common failures.
| Issue | Fix |
|---|---|
| CrashLoopBackOff | Wrong model path, missing dep in image |
| Ready forever | Model load > probe timeout |
| 503 from gateway | Service selector mismatch |
| OOMKilled | Increase memory limit or smaller model |
Dev vs prod namespace. ml-dev: 1 replica, no HPA; ml-prod: 2+, PDB, stricter NetworkPolicy.
Что сделать после занятия
Напишите readiness/liveness paths для MLServer Pod.
Сравните bake-into-image vs initContainer для capstone (3 аргумента).
Перечислите 4 поля Helm values для ML serving chart.