88 lines
3.3 KiB
Markdown
88 lines
3.3 KiB
Markdown
# Kube-vip + externalTrafficPolicy: Local + ingress replicas
|
||
|
||
**Дата:** 2026-07-13
|
||
**Кластер:** iot-naeel
|
||
**Сервис:** `ingress/shturval-ingress-controller-controller`
|
||
|
||
---
|
||
|
||
## Проблема
|
||
|
||
`externalTrafficPolicy: Local` на ingress-сервисе + 2 ingress-пода на 4 нодах.
|
||
|
||
Kube-vip раздаёт VIP (`185.247.187.151`) на **все 4 ноды** через ARP.
|
||
С `Local` трафик, пришедший на ноду БЕЗ ingress-пода — **дропается**.
|
||
|
||
Результат: 50% запросов → `ERR_TIMED_OUT`.
|
||
|
||
## Почему не было раньше
|
||
|
||
Раньше стоял `externalTrafficPolicy: Cluster` — kube-vip форвардил трафик
|
||
на любую ноду с ingress через Geneve-туннель. F5 работал, но при передаче
|
||
**больших файлов** возникал TCP stall на 51 секунду (cross-node Geneve).
|
||
|
||
## Хронология
|
||
|
||
1. `Cluster` → всё работало, но большие файлы висли на 51с
|
||
2. `Cluster` → `Local` — файлы перестали виснуть, но F5 стал дропаться (реплик 2)
|
||
3. `kubectl scale --replicas=4` — обе проблемы решены
|
||
4. **2026-07-13 10:24 MSK** — Helm-релиз ревизия 6 → `replicas` сброшены с 4 на 2
|
||
5. `kubectl scale --replicas=4` — снова 4
|
||
|
||
## Почему сбрасывается
|
||
|
||
Ingress управляется Helm-чартом `shturval-ingress-controller-2.12.1`.
|
||
|
||
```yaml
|
||
# helm get values -n ingress shturval-ingress-controller
|
||
controller:
|
||
replicaCount: 2 # ← вот причина
|
||
```
|
||
|
||
Штурвал периодически реконсилит деплой под Helm-значения —
|
||
видит 4 → возвращает на 2.
|
||
|
||
`externalTrafficPolicy: Local` при этом **не сбрасывается** (ставилось через `kubectl patch svc`, не через Helm).
|
||
|
||
## Что нужно от девопса
|
||
|
||
**Единственное изменение:** `replicaCount: 2 → 4` в Helm-чарте ingress.
|
||
|
||
```
|
||
helm upgrade -n ingress shturval-ingress-controller <чарт> --set controller.replicaCount=4
|
||
```
|
||
|
||
Или DaemonSet.
|
||
|
||
## Текущее состояние (исправлено вручную, будет сброшено)
|
||
|
||
```bash
|
||
kubectl scale deploy -n ingress shturval-ingress-controller-controller --replicas=4
|
||
```
|
||
|
||
| Под | Нода |
|
||
|-----|------|
|
||
| `j4z6z` | iot-naeel-control-plane-xb699 |
|
||
| `q8v8g` | iot-naeel-workers-vqphm-6f74n |
|
||
| `zqxqg` | iot-naeel-workers-vqphm-bhbvs |
|
||
| `fp4p2` | iot-naeel-workers-vqphm-v8zq4 |
|
||
|
||
## Результат
|
||
|
||
10 последовательных запросов: 10/10 HTTP 200, 130-250ms.
|
||
|
||
## Что нужно от девопса
|
||
|
||
1. Перевести ingress на **DaemonSet** — автоматически по поду на ноду
|
||
2. Или `replicas = max(2, количество нод)` — автоскейлинг при добавлении нод
|
||
3. При передеплое Штурвала `replicas` не должен сбрасываться на 2
|
||
|
||
## Ноды (4)
|
||
|
||
| Нода | Тип |
|
||
|------|-----|
|
||
| iot-naeel-control-plane-xb699 | control-plane |
|
||
| iot-naeel-workers-vqphm-6f74n | workers |
|
||
| iot-naeel-workers-vqphm-bhbvs | workers |
|
||
| iot-naeel-workers-vqphm-v8zq4 | workers |
|