RU
EN

SRE AI Copilot

Слой достоверного знания о проде, на котором можно безопасно строить AI-SRE. Сначала — модель инфраструктуры с evidence и провенансом, и только потом рассуждения поверх неё.
LLM — опционален. Knowledge Graph — нет.

О проекте

Гибрид: детерминированный Knowledge Graph + LLM-пайплайн за policy-gate. Обогащение алертов, RCA и controlled remediation в Kubernetes. Спроектирован честным к своим слепым зонам — система помечает, чего она не знает, вместо того чтобы выдавать догадки за факты.

Безопасность прежде всего

Главный страх «AI сам трогает прод» снят архитектурно: можно ли запускать kubectl-write считается детерминированно (8 risk-axes → policy-engine), а не берётся из ответа модели. Dry-run по умолчанию, approvals, anti-replay, savepoint-изоляция.

Граф, который знает, чего он не знает

Операционный граф из нескольких источников (топология, деплои, события, метрики, логи) с провенансом, отслеживанием свежести, проверками целостности и явными слепыми зонами. Поверх него — инциденты (один открытый на сервис), timeline по шести таблицам и blast radius с эпистемикой на каждом пути. Сейчас в проде: 17 938 узлов, 20 945 живых рёбер, 231 namespace.

Честность по умолчанию

У каждого факта три исхода, а не два: found — нашли, absent — искали в живом источнике и не нашли, unknown — проверить было нечем. Упавший источник понижает «не нашли» до «не знаем», и критик никогда не опровергает гипотезу по unknown. Система не выдаёт «зелёное», когда у неё просто нет данных — редкий, но решающий для доверия признак.

Как это работает

Конвейер инцидента — 6 ступеней. Честно: что уже live, а что включается с LLM-флагом.

1 · Ingestlive

AlertManager webhook → HMAC + anti-replay + dedup.

2 · Enrich (KG)live

Граф добавляет контекст: деплои (точные и ns-broadcast — как разные свидетельства), blast radius, pod-события, логи, ingress 5xx/p95. Алерт присоединяется к инциденту сервиса.

3 · Reason (LLM)за флагом

Гипотез-агенты строят версии из контекста; critic ранжирует и режет слабые.

4 · Respondlive +LLM

Один Discord-эмбед: факты + подсказка root-cause; с LLM — связный narrative.

5 · Remediateopt-in

Предложить/применить kubectl-фикс за детерминированным policy-gate + approval. Перед записью — сверка uid цели с графом, после — проверка исхода через 5 и 15 минут.

6 · Self-watchlive

11 self-health-чеков /30 мин, включая integrity-watchdog графа; результат — в VictoriaMetrics, алерты на протухшие и упавшие проверки. Источник, который ничего не увидел, heartbeat не пишет.

Как выглядит вывод

Синтетический пример critical-эмбеда в Discord (данные вымышленные).

🔴 Critical · checkout-service · prod
🎯 Likely cause
deploy #482 4 min before — p95 +180%, 5xx 0.6 rps at api.example.com/checkout
🌐 Endpoint health (ingress-derived)
5xx 0.6 rps · p95 920 ms
🗂 Incident
#128 · 3 alerts · opened 4 min ago · timeline: deploy → OOMKilled → alert
💥 Blast radius
3 svc → ◇ orders-service, ◇ cart-service, ≈ payments-gateway · 1 URL
❔ callers known from manifests/env only — list may be incomplete
🩺 Pod events
CrashLoopBackOff ×7 (OOMKilled)
🔧 Suggested action
kubectl rollout undo deploy/checkout-service   [⚙️ Apply — dry-run ✓, risk: medium, target uid ✓]

Почему это безопасно для прода

Главный страх «AI сам трогает прод» снят архитектурно — решение принимает не модель:

Проверено продом, а не демо-кластером

Реальные дефекты, найденные на живых данных. Каждый стал регрессионным тестом.

2 092 невалидных ребра за тик

k8s Service и его Deployment делили одну строку с ключом (namespace, name). Ребро между ними не могло существовать — вырождалось в петлю и отбрасывалось. В графе жило 3 ребра serves_traffic.

→ Явная онтология узлов + регрессионные тесты. Сейчас 4 234 ребра.
230 задач в очереди

Окно жизни было выставлено ровно у одной периодической задачи из 27. Дешёвые пробы копились — 94 минутных тика за полтора часа — и полностью вытеснили синк топологии: он планировался по расписанию и не выполнялся ни разу.

→ Протухание задач по интервалу.
4 200 upsert-ов в одной транзакции

Синк коммитил раз в тик, удерживая блокировку 13 минут. Миграция встала за ним в очередь — а очередь на лок в PostgreSQL блокирует всех, кто пришёл после неё. Зависли семь читателей, приложение стояло 6 минут.

→ Коммит батчами.
Метрика, которая солгала

Новый тип узла уронил orphan с 72,5% до 42% за ночь — без единой новой интеграции. Каждый «вылеченный» сервис получил ровно одно ребро: на самого себя.

→ Откатили метрику, а не схему. У каждой метрики качества теперь тест на то, чего она считать НЕ должна.
10 064 ложных деплоя за 40 минут

Первый watcher выкатов считал деплоем рост metadata.generation. Его крутит каждый тик HPA и каждый kubectl scale: 776 сервисов получили «недавний деплой», не меняя ни одного образа.

→ Критерий — смена образа или hash spec.template. Hotfix через 40 минут, записи вычищены.
25 000 поколений одного Deployment

rollout status висел на «spec update to be observed». Мёртвая ingress-заглушка без класса матчилась пятью контроллерами, её статус скакал между VIP, а Rancher каждый раз переписывал аннотацию на Deployment.

→ Заглушка снята; generation замер за минуту.
327 из 390 алертов — один шум

Первые 13 инцидентов в проде: 7 — KubeDeploymentGenerationMismatch, который Discord давно считал шумом. Без пометки таблица инцидентов стала бы таблицей одного алерта.

→ Инцидент наследует решение о шуме; настоящий алерт снимает флаг.
66 алертов на экспортер метрик

У KubeJobFailed лейбл service — kube-state-metrics, цель — в job_name. Месяц все они лежали на экспортере, хотя граф знал владельцев job'ов.

→ Владелец из графа, иначе имя CronJob; экспортер — никогда.

Почему всё держится на графе

Обычный AI-SRESRE AI Copilot
Источник истинымодель и её контекстоперационный граф в Postgres
Evidenceподразумеваетсяявное, с провенансом источника
Неизвестноеобычно скрытополноправное состояние: «данных нет» ≠ «всё хорошо»
Историяограничена окномхранится: деплои, события, аномалии
Инцидент= один алертодин открытый на сервис; флаппинг переоткрывает, а не плодит; timeline по шести таблицам
Результат действияexit code kubectlта же ли цель (uid), сработало ли, стало ли лучше — через 5 и 15 минут
Право на действиерешает модель или тулдетерминированный policy-gate, 8 risk-axes
Обратная связьопциональнанепрерывная: результат возвращается в граф
3300+ tests 17 938 graph nodes 231 namespaces 3 outcomes per fact 8-axis policy gate verified remediation
GitHub →