Files
mdm-ordinis/docs-internal/ops/kafka-restart.md
T
Zimin A.N. bcfb07f547 docs: split integrator guide (Diplodoc) vs internal docs + add build-docs CI
Чёткое разделение audiences:
- docs/ — consumer-facing only, Diplodoc-built. Public contract для
  интеграторов (Альтум, BI, third-party).
- docs-internal/ — operator runbooks, status snapshots, legacy tech pages.
  НЕ в Diplodoc build, НЕ публикуются.

Изменения:
- Move docs/{ops,status,tech} → docs-internal/{ops,status,tech}
- docs/toc.yaml: убраны секции Operations, Архитектура (legacy), Status
- docs/index.md: убран tab "оператор / on-call", focus на integrators
- docs/README.md: rewritten — scope только integrator guide, editorial
  guidelines (no leak internal architecture, stable API contract)
- .yfm: убран явный ignore status/* (теперь не нужно — папка переехала)
- docs-internal/README.md: index для внутренней документации с rationale
  разделения

Scrubbing implementation details из Diplodoc страниц:
- events.md: убраны Strimzi/cluster.142 references, OutboxPoller детали,
  internal alert names (OrdinisOutboxLagHigh, OrdinisOutboxDLQNonEmpty),
  metric names (nsi_outbox_*). Заменены на consumer-observable contract.
- webhooks.md: убраны metric names (nsi_webhook_ssrf_rejected_total),
  alert table (OrdinisWebhookHighFailureRate и т.д.). Retry policy
  переписана на user-side perspective.
- errors.md: убран alert name OrdinisReadApiErrorBudgetBurnFast, Tempo
  endpoint URL, internal connection details.
- x-references.md: OrphanReferenceScanner → general "Ordinis периодически
  детектирует". Убраны metric/alert names. Cascade roadmap без link на
  internal design doc.
- auth.md: убран file path ScopeContext.java.
- bundle-cuod.md: убран Maven module path.
- caching.md: cascade design link заменён на text reference.

CI:
- .gitlab-ci.yml: новый job build-docs (stage: build) — Node 20 alpine,
  pnpm install --frozen-lockfile + pnpm build, artifact docs/_dist на
  неделю. Triggers: auto на docs/**, либо manual web. Готов к follow-up
  pages-deploy job когда host решён.
- Новый pattern .docs-changes для rules.

Build verified clean: 13 HTML pages, 6.9M, no broken links/refs.
2026-05-07 23:27:03 +03:00

123 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Runbook: Kafka StrimziPodSet рестарт / поднятие
**Когда использовать:**
- Kafka pod (`ordinis-kafka-dual-0`) не Running после reboot ноды.
- Strimzi cluster operator не пересоздаёт pod — например после manual delete с paused reconciliation.
- StrimziPodSet есть, но `READY PODS = 0`.
- Кафка-операции отвечают timeout / connection refused.
## 1. Диагностика
```bash
export KUBECONFIG=/tmp/kubeconfig-161
kubectl get kafka,kafkanodepool,strimzipodset -n ordinis-staging
kubectl get pods -n ordinis-staging | grep kafka
```
**Что искать:**
| Симптом | Причина |
|---|---|
| `kafka.kafka.strimzi.io/ordinis-kafka` имеет `WARNINGS` колонку с текстом | reconciliation paused или config invalid — см. `kubectl describe kafka` |
| `strimzipodset/ordinis-kafka-dual` отсутствует | удалён — нужно unpause reconciliation чтобы Strimzi его создал заново |
| `kafkanodepool/dual` имеет `DESIRED REPLICAS=0` | scale=0 был задан — Strimzi не позволяет 0 реплик в Kafka cluster |
| Pod `ordinis-kafka-dual-0` в `Pending` | scheduler не нашёл ноду — `kubectl describe pod` |
| Pod `Running` но `0/1` ready | startup probe failed — `kubectl logs` |
## 2. Восстановление
### Вариант A: pause/unpause reconciliation
Если Kafka CR имеет `strimzi.io/pause-reconciliation=true` annotation:
```bash
kubectl annotate kafka.kafka.strimzi.io/ordinis-kafka -n ordinis-staging \
strimzi.io/pause-reconciliation- --overwrite
kubectl annotate kafkanodepool.kafka.strimzi.io/dual -n ordinis-staging \
strimzi.io/pause-reconciliation- --overwrite
```
Strimzi в течение ~30 sec пересоздаст StrimziPodSet и поднимет pod.
### Вариант B: scale до 0 → нужно вернуть к 1+
```bash
kubectl patch kafkanodepool/dual -n ordinis-staging --type=merge \
-p '{"spec":{"replicas":1}}'
```
⚠️ **Strimzi требует минимум 1 replica** — при `replicas:0` валидация падает с
`InvalidResourceException: KafkaNodePools have 0 replicas`.
### Вариант C: StrimziPodSet удалён (например `kubectl delete strimzipodset`)
Если pause снят и replicas≥1, Strimzi пересоздаст автоматически. Дать
60 sec на reconciliation. Если не происходит:
```bash
# Принудительно перепинговать operator
kubectl annotate kafka.kafka.strimzi.io/ordinis-kafka -n ordinis-staging \
strimzi.io/manual-rolling-update-
kubectl annotate kafka.kafka.strimzi.io/ordinis-kafka -n ordinis-staging \
strimzi.io/manual-rolling-update=true --overwrite
```
### Вариант D: Pod залип в Pending / CrashLoopBackOff
Force-delete + дать operator пересоздать:
```bash
kubectl delete pod -n ordinis-staging ordinis-kafka-dual-0 \
--grace-period=0 --force
```
PVC `data-0-ordinis-kafka-dual-0` сохраняется, данные kraft-метаданных целы.
## 3. Подтверждение
```bash
kubectl get pods -n ordinis-staging | grep kafka
# → ordinis-kafka-dual-0 1/1 Running
kubectl exec -n ordinis-staging ordinis-kafka-dual-0 -- \
bin/kafka-broker-api-versions.sh \
--bootstrap-server ordinis-kafka-kafka-bootstrap:9092 2>&1 | head -3
```
## 4. После kafka up — рестарт consumer'ов
Spring Boot pods (`ordinis-app`, `ordinis-projection-writer`) могли застрять
в reconnect-loop. Force-delete для быстрого resume:
```bash
kubectl delete pod -n ordinis-staging \
-l 'app.kubernetes.io/name in (ordinis-app,ordinis-projection-writer)' \
--grace-period=0 --force
```
OutboxPoller начнёт публиковать накопленные события сразу.
## 5. Проверка outbox lag
После рестарта Kafka outbox мог накопить unpublished events. Проверь:
```bash
curl -sk -H "Authorization: Bearer $TOKEN" \
--resolve ordinis.k8s.265.nstart.cloud:443:192.168.100.161 \
"https://ordinis.k8s.265.nstart.cloud/api/v1/admin/outbox/stats"
# → {"pending":0,"dlq":0} ← желаемое
```
Если pending растёт — см. [outbox-dlq.md](outbox-dlq.md).
## 6. Эскалация
| Проблема | Действие |
|---|---|
| Strimzi operator pod (kafka-test ns) не Running | `kubectl get pods -n kafka-test` → перезапустить |
| Consul недоступен (Strimzi его не использует, но Vault — да) | см. [vault-unseal.md](vault-unseal.md) |
| Kraft metadata corruption (редко) | DR: восстановить PVC из snapshot, переинициализировать topic |
| ACL нарушение / SASL auth fail | Проверить secret `ordinis-app-kafka` в Vault, перезапустить consumer |
>20 минут downtime → tech lead.