5.2.1 · блок 5
Логи в Kubernetes
Логи в Kubernetes
Зачем это нужно
Метрики сказали «error rate вырос». Логи говорят *почему*: stack trace, invalid feature payload, timeout к Feature API. В Kubernetes логи ephemeral: pod перезапустился — stdout исчез без централизованного сбора.
Для ML-сервисов логи особенно ценны: validation errors на входе, model version at startup, sample prediction debug (без PII leak).
Основные идеи
Container logs model.
- App пишет в stdout/stderr (12-factor).
- Container runtime (containerd) пишет в файлы на node.
kubectl logs pod/name— только для debug; prod — centralized logging.
Структурированные логи (JSON).
{"level":"error","msg":"predict failed","model_version":"1.3.0","error":"feature tenure missing","request_id":"abc"}
Поля для ML: model_version, clearml_task_id, inference_ms, batch_size. Не логировать raw PII и полные feature vectors в prod без policy.
Log levels.
- ERROR — failed request, model load fail.
- WARN — fallback path, deprecated API.
- INFO — startup, model loaded, config snapshot.
- DEBUG — только dev/staging (verbose).
Kubernetes metadata enrichment. Collector добавляет: namespace, pod, container, node, labels (app, version). Correlation с metrics via request_id.
Multi-container pods.
- App + Istio sidecar — два log streams; sidecar access log отдельно.
- Init container logs — model download failures.
Rotation and size. Without limit, disk fill on node. Cluster logging agent ships and optionally truncates local.
What to log in incidents.
1. Stack traces (once per error type, not spam).
2. Upstream dependency errors (Feature API 503).
3. Model artifact path/hash at startup.
4. Request validation summary (count rejected, not each row in prod).
Anti-patterns.
- Logging every prediction score — volume + compliance risk.
- Unstructured multiline stack traces — hard to query in Loki.
- Different format per microservice — painful cross-service search.
Как это выглядит на практике
FastAPI inference (pattern):
import logging, json
logger = logging.getLogger("churn")
# JSON formatter in production
@app.post("/predict")
async def predict(req: Request):
req_id = req.headers.get("x-request-id", "unknown")
try:
...
except ValidationError as e:
logger.warning(json.dumps({"event": "validation_error", "request_id": req_id, "detail": str(e)}))
raise
During incident:
kubectl logs -l app=churn-serving -n ml-prod --since=15m | jq 'select(.level=="error")'
Without Loki this breaks at scale — next lesson Grafana Alloy → Loki.
Runbook: «CrashLoopBackOff» → kubectl logs --previous for model import error; compare sklearn version in log vs MMS record.
Istio access log (JSON) complements app logs for RED errors at gateway.
Что сделать после занятия
- [ ] Переведите учебный сервис на structured JSON logs (минимум 3 поля).
- [ ] Определите policy: что запрещено логировать (PII, weights).
- [ ] Выпишите 5 событий, которые обязаны быть INFO при старте pod.