Зачем это нужно
E2E-контур длинный — больше звеньев, больше способов сломаться. Не все поломки — «pod crashed». Часть — silent: модель отвечает 200 OK, но predictions nonsense из-за skew или wrong artifact. Этот урок — каталог типовых сбоев и где их ловить gates и observability.
Умение быстро локализовать звено (train vs registry vs deploy vs traffic) сокращает MTTR и учит проектировать pipeline устойчивым с самого начала.
Основные идеи
Классы поломок.
| Класс | Пример | Симптом |
|---|---|---|
| Data | Schema change upstream | NaN scores, default branch в model |
| Train | OOM GPU, failed job | Нет нового candidate в ClearML |
| Artifact | Corrupt pickle, wrong sklearn | CrashLoop on start, import error |
| Registry/MMS | Promoted wrong task id | Version mismatch in /health |
| CI/CD | Broken Jenkinsfile, failed push | Старый image в prod |
| Deploy | Helm typo, insufficient memory | Pending pods, OOMKilled |
| Traffic | Istio weight 0 on new subset | Canary «не работает» |
| Skew | Train features ≠ serving | Metrics OK infra, business KPI down |
Поломка: «модель не грузится».
Логи pod:
ModuleNotFoundError: sklearn→ образ собран с другим requirements, чем train.Gate: CI test
load model + predictв том же Dockerfile, что prod.Fix: pin versions; rebuild image from MMS artifact URI.
Поломка: «ClearML task успешен, но в MMS пусто».
Webhook Jenkins не сработал; API key expired.
Detect: alert на «candidate tag without MMS record > 24h».
Fix: replay promote job с task_id.
Поломка: «Argo CD OutOfSync бесконечно».
Manual kubectl edit (drift); invalid Helm template.
Fix: enforce GitOps only;
helm templatein CI; revert drift.
Поломка: «Canary 5%, но ошибок не видно».
Istio metrics смотрят только 5% traffic; sample too small.
Business dashboard still on old version aggregate.
Fix: compare canary subset explicitly; SLO on canary route.
Поломка: «Train pipeline писал в prod bucket».
Wrong env var
S3_BUCKET=prodin Workflow template.Gate: namespace isolation; policy OPA; separate credentials staging/prod.
Поломка: «Rollback не помог».
Откатили image, но feature schema upstream уже новая — старая модель incompatible.
Fix: rollback plan includes data contract version; MMS champion + feature flag.
Поломка: «Два champion в MMS».
Race двух promote jobs.
Gate: MMS transactional promote; optimistic locking on version.
Runbook structure. Для каждого сервиса: symptoms → checks (MMS version, Argo app status, ClearML task) → mitigation → escalation.
Как это выглядит на практике
Инцидент INC-4421: «Churn scores все 0.5 после релиза».
Timeline:
T+0 — Alert: business «conversion model flat» (не infra alert!).
T+15m — On-call: pods healthy, latency OK.
/healthshows model v1.3.0.T+30m — Compare MMS champion ClearML task abc118 vs artifact in pod hash — mismatch.
Root cause: Jenkins promote used wrong
TASK_IDparameter (typo in manual job).Mitigation: MMS revert champion v1.2.2; Argo rollback MR merged; Istio 100% old.
Follow-up: promote job only from MMS UI button that passes task_id; delete manual parameter default.
Table «где могли поймать»:
| Stage | Control |
|---|---|
| Promote | Require task_id from MMS API only |
| Build | Embed task_id in image label; admission check |
| Deploy | Init container verify artifact hash vs MMS |
| Runtime | Log input feature stats; alert on constant output |
Связь с блоком 5: infra metrics green ≠ model quality OK — нужен drift dashboard.
Что сделать после занятия
Выберите 3 поломки из урока и напишите «symptom → first check → fix» для вашего контура.
Добавьте один quality gate в Jenkins promote, который предотвращает конкретный сценарий.
Проведите tabletop exercise: «ClearML OK, prod bad» — ваши шаги расследования.