07 · Serving-платформа7.1–7.7 · Runtime и оркестраторы7.2.2сложный

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 + MinIOaws 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.

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