docs: полная конфигурация кластера — MTU + keep-alive + HTTP/2 + RST fix
Deploy drhider / validate (push) Waiting to run
Deploy drhider / validate (push) Waiting to run
This commit is contained in:
+73
-8
@@ -70,14 +70,79 @@ VIP: 185.247.187.151 → kube-vip анонсирует на все 4 но
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Баг #2: ERR_CONNECTION_RESET в браузере (2026-07-14)
|
||||||
|
|
||||||
|
### Симптом
|
||||||
|
|
||||||
|
После фикса MTU — curl с ВМ работал, но браузер (Chrome/Electron) при загрузке 63KB docx получал `ERR_CONNECTION_RESET`.
|
||||||
|
|
||||||
|
### Причина
|
||||||
|
|
||||||
|
Два механизма одновременно:
|
||||||
|
|
||||||
|
1. **`keep-alive: 10`** — nginx закрывал idle-соединения через 10с. Браузер не замечал FIN (буферизация TCP в ОС), отправлял POST в уже закрытый сокет → RST.
|
||||||
|
|
||||||
|
2. **kube-vip ARP flapping** — при смене ARP-лидера трафик уходил на другую ноду без conntrack-записи → RST.
|
||||||
|
|
||||||
|
### Решение
|
||||||
|
|
||||||
|
| # | Где | Что | Было | Стало |
|
||||||
|
|---|-----|-----|------|-------|
|
||||||
|
| 1 | Ingress ConfigMap | `keep-alive` | `10` | **`75`** |
|
||||||
|
| 2 | `index.html` (JS) | warmup GET при загрузке | — | `fetch('/health')` |
|
||||||
|
|
||||||
|
### Результат тестов (v0.0.26)
|
||||||
|
|
||||||
|
| Тест | Результат |
|
||||||
|
|------|-----------|
|
||||||
|
| 5× свежих страниц + POST 63KB | 4× OK, 1× ABORTED (Playwright) |
|
||||||
|
| UI: 2 файла + SSE + download | ✅ полный цикл, 18.5с |
|
||||||
|
| 3× POST через 10+ мин (kube-vip окно) | 3× OK:200 |
|
||||||
|
| 20× POST (батарея) | 0 ERR_CONNECTION_RESET |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Текущая конфигурация (2026-07-14)
|
## Текущая конфигурация (2026-07-14)
|
||||||
|
|
||||||
| Параметр | По умолчанию | Текущее | Причина изменения |
|
### Ingress ConfigMap
|
||||||
|----------|-------------|---------|-------------------|
|
|
||||||
| Cilium `mtu` | 1500 | **1400** | 1400 + 50 (Geneve) = 1450 = underlay |
|
|
||||||
| `proxy-body-size` (ingress) | 8m | **1024m** | Поддержка загрузки файлов до 1 ГБ |
|
|
||||||
| HTTP/2 | включён | включён | — |
|
|
||||||
| `externalTrafficPolicy` | Cluster | Cluster | — |
|
|
||||||
| Реплик ingress | 2 | 2 | — |
|
|
||||||
|
|
||||||
Код v0.0.22: XHR-таймаут 30 с, cache-busting, обработка SSE `GeneratorExit`.
|
| Параметр | По умолчанию | Текущее | Причина |
|
||||||
|
|----------|-------------|---------|---------|
|
||||||
|
| `keep-alive` | 75 | **75** | Было 10 — рвало idle → RST |
|
||||||
|
| `use-http2` | true | **`"false"`** | HTTP/2 давал PROTOCOL_ERROR |
|
||||||
|
| `proxy-body-size` | 8m | **1024m** | Загрузка docx/pdf до 1 ГБ |
|
||||||
|
| `client-body-timeout` | 60 | **10** ⚠️ | Надо вернуть 60 |
|
||||||
|
| `client-header-timeout` | 60 | **10** ⚠️ | Надо вернуть 30 |
|
||||||
|
| `upstream-keepalive-connections` | 0 | **0** | Был 50, эксперимент |
|
||||||
|
| `error-log-level` | info | **debug** | Временно для диагностики |
|
||||||
|
|
||||||
|
### Cilium
|
||||||
|
|
||||||
|
| Параметр | По умолчанию | Текущее | Причина |
|
||||||
|
|----------|-------------|---------|---------|
|
||||||
|
| `mtu` | 1500 | **1400** | Geneve +50 = 1450 = underlay |
|
||||||
|
|
||||||
|
### Приложение (drhider v0.0.26)
|
||||||
|
|
||||||
|
| Файл | Изменение |
|
||||||
|
|------|-----------|
|
||||||
|
| `site/templates/index.html` | `fetch('/health')` при загрузке — прогрев upstream |
|
||||||
|
| `site/app.py` | `VERSION = "0.0.26"` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Для DevOps — что должно быть в Штурвале
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Ingress ConfigMap
|
||||||
|
keep-alive: "75" # ⚠️ было 10 — СРОЧНО исправить
|
||||||
|
client-body-timeout: "60" # ⚠️ было 10 — СРОЧНО исправить
|
||||||
|
client-header-timeout: "30" # ⚠️ было 10
|
||||||
|
use-http2: "true" # можно вернуть
|
||||||
|
proxy-body-size: "1024m" # под загрузку файлов
|
||||||
|
upstream-keepalive-connections: "0"
|
||||||
|
error-log-level: "info" # вернуть после диагностики
|
||||||
|
|
||||||
|
# Cilium ConfigMap (kube-system)
|
||||||
|
mtu: "1400" # ⚠️ было 1500 — Geneve overhead
|
||||||
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user