From 38109ba6ec9020abeb0f68905456186dab05125e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 13 Jul 2026 11:53:47 +0400 Subject: [PATCH] =?UTF-8?q?docs:=20INGRESS-SOLUTIONS=20=E2=80=94=20Sonnet?= =?UTF-8?q?=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=20=D0=B2=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B0=D0=BD=D1=82=D0=BE=D0=B2=20DaemonSet/MTU/DSR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/INGRESS-SOLUTIONS.md | 102 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 docs/INGRESS-SOLUTIONS.md diff --git a/docs/INGRESS-SOLUTIONS.md b/docs/INGRESS-SOLUTIONS.md new file mode 100644 index 0000000..90329f4 --- /dev/null +++ b/docs/INGRESS-SOLUTIONS.md @@ -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.