# 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 |
