docs: bug report for Shturval DevOps — kube-vip TCP stall
Deploy loadtest / validate (push) Waiting to run
Deploy loadtest / validate (push) Waiting to run
This commit is contained in:
@@ -0,0 +1,75 @@
|
|||||||
|
# Bug Report: kube-vip / ingress — TCP stall 51s для WebSocket и HTTP POST >50KB
|
||||||
|
|
||||||
|
## Контакты
|
||||||
|
- Проект: `loadtest` (9039a501-df2c-4b85-b049-9cd4f77e6ac0)
|
||||||
|
- Домен: `loadtest.pythonk8s.dev.nubes.ru`
|
||||||
|
- VIP: `185.247.187.151`
|
||||||
|
|
||||||
|
## Симптом
|
||||||
|
|
||||||
|
Любой трафик извне через VIP с объёмом данных > ~50 KB испытывает **51-секундную паузу** в ~80% соединений. Оставшиеся ~20% проходят мгновенно.
|
||||||
|
|
||||||
|
## Что проверено
|
||||||
|
|
||||||
|
### Исключено (НЕ является причиной)
|
||||||
|
|
||||||
|
| Компонент | Что проверяли | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| **Код приложения** | Минимальный Flask (13 строк) — идентичный результат | Не приложение |
|
||||||
|
| **WebSocket vs HTTP** | Оба протокола — одинаковая пауза | Не протокол |
|
||||||
|
| **nginx ingress** | keepalive=0, scale до 4 реплик, buffering on/off — без изменений | Не nginx |
|
||||||
|
| **Cilium** | hostNetwork на поде (обходит Geneve) — без изменений | Не Cilium |
|
||||||
|
| **Node placement** | nodeSelector, podAntiAffinity — без изменений | Не расположение подов |
|
||||||
|
| **ModSecurity** | 1 MB файл проходит мгновенно (WAF не блокирует) | Не WAF |
|
||||||
|
| **Размер данных** | 2 MB и 4 MB — одинаковая пауза 51с | Не размер |
|
||||||
|
| **Версия Python/Flask** | Минимальный под с чистым Flask — то же самое | Не версии |
|
||||||
|
|
||||||
|
### Изолировано (ГДЕ проблема)
|
||||||
|
|
||||||
|
| Источник | Цель | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| pod внутри кластера | ingress pod IP (та же нода) | **5/5 FAST** ✅ |
|
||||||
|
| pod внутри кластера | ingress pod IP (другая нода) | **5/5 FAST** ✅ |
|
||||||
|
| pod внутри кластера | ClusterIP сервис (без ingress) | **3/3 FAST** ✅ |
|
||||||
|
| SSH-хост (5.172.178.213) | VIP (185.247.187.151) | **2/5 FAST, 3/5 SLOW** ❌ |
|
||||||
|
| Внешняя машина (интернет) | VIP | **~15% FAST, ~85% SLOW** ❌ |
|
||||||
|
|
||||||
|
**Вывод: проблема между внешним клиентом и ingress-подом, при проходе через kube-vip / VIP.**
|
||||||
|
|
||||||
|
## Детали воспроизведения
|
||||||
|
|
||||||
|
### Тест изнутри кластера (ВСЕГДА быстро):
|
||||||
|
```python
|
||||||
|
# Из пода pythonk8s → ingress pod (172.16.1.51:443, SSL)
|
||||||
|
# 5/5 FAST (~0.5s для 2 MB)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тест снаружи (СЛУЧАЙНАЯ пауза 51с):
|
||||||
|
```python
|
||||||
|
# С внешней машины → VIP (185.247.187.151:443, SSL)
|
||||||
|
# 2/10 FAST (~0.5s), 8/10 SLOW (~51s для 2 MB)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Характер паузы:
|
||||||
|
- 51 секунда КОНСТАНТНА (не зависит от размера: 2 MB и 4 MB — одинаково)
|
||||||
|
- Задержка в фазе `send()` — клиент блокируется при отправке данных (TCP backpressure)
|
||||||
|
- Внутри кластера kube-vip форвардит трафик на ingress-под; когда клиент снаружи — kube-vip/ARP создаёт TCP stall
|
||||||
|
|
||||||
|
## Конфигурация kube-vip
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Режим: ARP
|
||||||
|
vip_leaderelection: false
|
||||||
|
Поды kube-vip: на всех 4 нодах
|
||||||
|
Ingress-поды: 2 реплики (на control-plane + worker)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ожидаемое поведение
|
||||||
|
|
||||||
|
Загрузка файлов 3-5 MB через WebSocket или HTTP POST должна происходить за 1-2 секунды (как это работает изнутри кластера).
|
||||||
|
|
||||||
|
## Запрос
|
||||||
|
|
||||||
|
1. Проверить конфигурацию kube-vip — почему ARP-трафик к VIP вызывает TCP stall для полезной нагрузки >50 KB
|
||||||
|
2. Проверить нет ли rate-limiting на уровне сети между внешним миром и VIP
|
||||||
|
3. Рассмотреть возможность переключения kube-vip в режим BGP вместо ARP
|
||||||
Reference in New Issue
Block a user