Files
drhider/docs/INGRESS-SOLUTIONS.md
T
2026-07-13 11:53:47 +04:00

103 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Варианты решения 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.