docs: INGRESS-SOLUTIONS — Sonnet анализ вариантов DaemonSet/MTU/DSR
Deploy drhider / validate (push) Waiting to run
Deploy drhider / validate (push) Waiting to run
This commit is contained in:
@@ -0,0 +1,102 @@
|
|||||||
|
# Варианты решения ingress replicas + TCP stall
|
||||||
|
|
||||||
|
**Дата:** 2026-07-13
|
||||||
|
**Источник:** Sonnet analysis
|
||||||
|
**Связано:** [KUBEVIP-EXTERNAL-TRAFFIC-POLICY.md](KUBEVIP-EXTERNAL-TRAFFIC-POLICY.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Корень — две независимые проблемы
|
||||||
|
|
||||||
|
```
|
||||||
|
Проблема А: TCP stall 51с
|
||||||
|
└── причина: MTU Path Discovery Blackhole при Geneve-туннеле
|
||||||
|
|
||||||
|
Проблема Б: replicaCount сбрасывается Helm-ом
|
||||||
|
└── причина: DaemonSet не используется
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Варианты
|
||||||
|
|
||||||
|
### 1. DaemonSet (рекомендуется)
|
||||||
|
|
||||||
|
Одно изменение в Helm values:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
controller:
|
||||||
|
kind: DaemonSet
|
||||||
|
# replicaCount игнорируется
|
||||||
|
```
|
||||||
|
|
||||||
|
- ✅ Автоматически 1 под/ноду
|
||||||
|
- ✅ Helm не ломает
|
||||||
|
- ✅ Стандарт для bare-metal / kube-vip
|
||||||
|
- ✅ Не требует менять сетевую конфигурацию
|
||||||
|
|
||||||
|
### 2. Починить MTU (убрать stall в корне)
|
||||||
|
|
||||||
|
51с — это классический Path MTU Discovery Blackhole. Geneve: MTU 1500 → ~1450.
|
||||||
|
|
||||||
|
**Диагностика:**
|
||||||
|
```bash
|
||||||
|
ip link show | grep -E "cilium|genev"
|
||||||
|
iptables -t mangle -L FORWARD -n -v | grep TCPMSS
|
||||||
|
```
|
||||||
|
|
||||||
|
**Исправление:**
|
||||||
|
```bash
|
||||||
|
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
|
||||||
|
```
|
||||||
|
|
||||||
|
Если stall устранён → можно вернуть `externalTrafficPolicy: Cluster` и replicaCount 2.
|
||||||
|
|
||||||
|
### 3. Cilium DSR (Direct Server Return)
|
||||||
|
|
||||||
|
Ответный трафик идёт напрямую от пода к клиенту, без cross-node SNAT.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# cilium-config (требует kube-proxy replacement = strict)
|
||||||
|
loadBalancer:
|
||||||
|
mode: dsr
|
||||||
|
kubeProxyReplacement: strict
|
||||||
|
```
|
||||||
|
|
||||||
|
- ❌ Долго, меняет всю сетевую конфигурацию
|
||||||
|
|
||||||
|
### 4. replicaCount: 4 + podAntiAffinity
|
||||||
|
|
||||||
|
Если Штурвал не даёт сменить `kind` на DaemonSet:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
controller:
|
||||||
|
replicaCount: 4
|
||||||
|
affinity:
|
||||||
|
podAntiAffinity:
|
||||||
|
requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- labelSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: ingress-nginx
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
|
```
|
||||||
|
|
||||||
|
- ✅ Гарантирует 1 под/ноду
|
||||||
|
- ✅ Helm values зафиксированы, не сбрасывается
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Рекомендуемый путь
|
||||||
|
|
||||||
|
| Приоритет | Действие |
|
||||||
|
|-----------|----------|
|
||||||
|
| 🟢 Быстро | Вариант 1 — DaemonSet в Helm values |
|
||||||
|
| 🟡 Параллельно | Диагностика MTU (Вариант 2) |
|
||||||
|
| 🔵 Если MTU исправлен | Вернуться к Cluster policy + Deployment |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Текущий статус
|
||||||
|
|
||||||
|
`externalTrafficPolicy: Local` — не сбрасывается.
|
||||||
|
`replicas: 4` — ручной scale, периодически сбрасывается Helm на 2.
|
||||||
Reference in New Issue
Block a user