# Варианты решения 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.