2.9 KiB
2.9 KiB
Варианты решения ingress replicas + TCP stall
Дата: 2026-07-13
Источник: Sonnet analysis
Связано: KUBEVIP-EXTERNAL-TRAFFIC-POLICY.md
Корень — две независимые проблемы
Проблема А: TCP stall 51с
└── причина: MTU Path Discovery Blackhole при Geneve-туннеле
Проблема Б: replicaCount сбрасывается Helm-ом
└── причина: DaemonSet не используется
Варианты
1. DaemonSet (рекомендуется)
Одно изменение в Helm values:
controller:
kind: DaemonSet
# replicaCount игнорируется
- ✅ Автоматически 1 под/ноду
- ✅ Helm не ломает
- ✅ Стандарт для bare-metal / kube-vip
- ✅ Не требует менять сетевую конфигурацию
2. Починить MTU (убрать stall в корне)
51с — это классический Path MTU Discovery Blackhole. Geneve: MTU 1500 → ~1450.
Диагностика:
ip link show | grep -E "cilium|genev"
iptables -t mangle -L FORWARD -n -v | grep TCPMSS
Исправление:
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.
# cilium-config (требует kube-proxy replacement = strict)
loadBalancer:
mode: dsr
kubeProxyReplacement: strict
- ❌ Долго, меняет всю сетевую конфигурацию
4. replicaCount: 4 + podAntiAffinity
Если Штурвал не даёт сменить kind на DaemonSet:
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.