MLOps Path

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

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

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

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