diff --git a/docs/status/2026-05-07-state.md b/docs/status/2026-05-07-state.md index 46de250..ba14acf 100644 --- a/docs/status/2026-05-07-state.md +++ b/docs/status/2026-05-07-state.md @@ -1,7 +1,7 @@ # Состояние разработки НСИ (Ordinis ЦУОД ОДХ) -**Версия:** v1.0 (anchor v1 — production LIVE на cluster.142, Альтум переехал) -**Дата:** 2026-05-07 +**Версия:** v1.0.1 (post-cutover hardening: SPOF closed, monitoring stack ready, image arch incident resolved) +**Дата:** 2026-05-07 (evening update) **Owner:** zimin.an@nstart.space **Окружения:** - **prod** (192.168.100.142 / cluster.142, ✅ LIVE с Альтум traffic, blue/green cutover завершён) @@ -47,6 +47,38 @@ - staging-as-prod decommissioned для production traffic - staging cluster.265 теперь чисто dev environment +### 0.1. Post-cutover hardening (evening 2026-05-07) + +**Артефакты добавлены:** +- `k8s/benchmark/k6-job-prod.yaml` — load test для prod (Service port :80 fix) +- `k8s/benchmark/synthetic-smoke-prod.yaml` — one-shot smoke (auth + 3 endpoints, exit code = pass/fail) +- `k8s/benchmark/synthetic-smoke-cronjob-prod.yaml` — continuous monitoring (*/30 min) +- `k8s/kafka/topic-orphan-fix.sh` — janitorial script для KafkaTopic READY=False +- prometheus-rules group `ordinis.synthetic` (2 alerts: SmokeFailed/Stale, conditional на `prometheusRule.synthetic.enabled`) +- `.gitlab-ci.yml` job `build-postgis-barman` (kaniko + REGISTRY_USER/REGISTRY auth, currently 401 — known issue, manual push fallback) + +**Инцидент: postgis-barman image swap** (08:30-22:00 MSK): +1. Custom image `:18.3-3.6.2-1` запушен в `repo.nstart.cloud` с mac M-series **без `--platform linux/amd64`** → arm64 layers попали в registry +2. Catalog patched на repo.nstart.cloud → CNPG re-roll → `exec format error` → CrashLoopBackOff +3. Rollback catalog на staging URL → recovered +4. Re-push amd64 → но **kubelet cache на srvaltum01** удерживал arm64 layer под тем же тегом → retry catalog swap снова exec format error +5. Bump rev `:1` → `:2` → kubelet вынужден pull → cache miss → новый amd64 layer → success +6. Pod stuck Terminating ~14 мин (CNPG `terminationGracePeriodSeconds: 1800`) → `kubectl delete pod --force --grace-period=0` для recovery acceleration + +**Lessons learned (закреплены в `docker/postgis-barman/README.md`):** +- `docker buildx --platform linux/amd64 --push` обязательно когда build с M-series mac +- Bump rev tag при cache invalidation needs (тот же тег + новые слои = kubelet skip) +- `terminationGracePeriodSeconds=1800` означает что graceful pod delete может висеть до 30 минут +- Verify image arch через registry API (`config.architecture`) ДО catalog swap + +**Production verify (post-incident):** +- Cluster phase: "Cluster in healthy state" +- status.image: `repo.nstart.cloud/terravault/postgis-barman:18.3-3.6.2-2` +- imageID digest: `sha256:1b4b074d...` (verified amd64 manifest) +- All 11 pods Running, postgres restartCount=0, lastSuccessfulBackup preserved + +**SPOF на staging registry — closed.** Если `registry.k8s.265.nstart.local` упадёт, prod не пострадает. + ### Что закоммичено **ordinis-infra (4 commits сегодня):** @@ -88,10 +120,11 @@ ### 1.2. В процессе / nice-to-have -- KafkaTopics CR показывают `READY=False` (orphaned до Kafka cluster recreate, pending strimzi.io/managed sync) +- KafkaTopics CR показывают `READY=False`. Reason: "Decreasing partitions not supported" — `cluster-prod.yaml` указал partitions=3, broker имеет больше (orphan от старого setup). Fix: `k8s/kafka/topic-orphan-fix.sh` annotate'ит `strimzi.io/managed=false` (broker continues, alerts замолкают). Apply вручную. - Vault SASL passwords могут быть stale если Strimzi user-operator regenerated после Kafka cluster recreate — re-run `scripts/vault/populate.sh` -- `postgis-barman:18.3-3.6.2-1` image сейчас pull от staging registry (`registry.k8s.265.nstart.local`) — для resilience mirror в prod registry `repo.nstart.cloud/terravault/postgis-barman` -- k6 benchmark на prod не прогнан (smoke 50 RPS / ramp 1k / sustain 5m готов в `k8s/benchmark/k6-job.yaml`) +- ~~`postgis-barman` image SPOF на staging registry~~ ✅ **CLOSED 2026-05-07 evening:** image mirrored в `repo.nstart.cloud/terravault/postgis-barman:18.3-3.6.2-2`, prod cluster.142 pull'ит оттуда. См. секцию 0.1 ниже про инцидент. +- k6 benchmark на prod не прогнан (smoke 50 RPS / ramp 1k / sustain 5m готов в `k8s/benchmark/k6-job-prod.yaml`) +- Synthetic smoke + alerts ready (`k8s/benchmark/synthetic-smoke-cronjob-prod.yaml` + prometheus-rules group `ordinis.synthetic`) — apply manually + helm upgrade с values-prod - Real ЦУОД data integration (отдельный epic после prod soak) ### 1.3. Roadmap (отложено)