7.2.2 · блок 7
Deploy MLServer в Kubernetes
Deploy MLServer в Kubernetes
Зачем это нужно
Локальный 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.
1. Bake into image — simple; rebuild image per model version.
2. InitContainer + MinIO — aws s3 cp s3://ml-models/churn/v44/ /models/; main image stable.
3. 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:
1. ClearML registers churn/v44 → export joblib to MinIO.
2. Jenkins: build image OR reuse base + only update init script version.
3. MR churn-serving Helm: modelVersion: v44.
4. Argo CD sync → rolling update.
5. Smoke test Job in cluster: curl infer golden sample.
6. 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.