diff --git a/docs/INGRESS-SOLUTIONS.md b/docs/INGRESS-SOLUTIONS.md index 90329f4..87e3ef3 100644 --- a/docs/INGRESS-SOLUTIONS.md +++ b/docs/INGRESS-SOLUTIONS.md @@ -1,20 +1,19 @@ # Варианты решения ingress replicas + TCP stall **Дата:** 2026-07-13 -**Источник:** Sonnet analysis +**Источники:** Sonnet analysis, Opus analysis **Связано:** [KUBEVIP-EXTERNAL-TRAFFIC-POLICY.md](KUBEVIP-EXTERNAL-TRAFFIC-POLICY.md) --- -## Корень — две независимые проблемы +## Ключевой вывод (оба согласны) -``` -Проблема А: TCP stall 51с - └── причина: MTU Path Discovery Blackhole при Geneve-туннеле +Проблемы **две независимые**, решать по отдельности: -Проблема Б: replicaCount сбрасывается Helm-ом - └── причина: DaemonSet не используется -``` +1. **TCP stall 51с** — PMTU Blackhole на Geneve-туннеле, а не свойство `Cluster`-политики. `Local` лечит как побочный эффект (убирает cross-node). +2. **Сброс реплик** — `kubectl scale` обходит Helm, поэтому реконсиляция откатывает. + +> ⚠️ **Важно (Opus):** `kubectl scale` вы обходите Helm, поэтому и сбрасывается. Любое итоговое решение должно быть в **values чарта**, а не через `kubectl`. --- @@ -86,13 +85,46 @@ controller: --- -## Рекомендуемый путь +## Рекомендуемый путь (Sonnet + Opus) -| Приоритет | Действие | -|-----------|----------| -| 🟢 Быстро | Вариант 1 — DaemonSet в Helm values | -| 🟡 Параллельно | Диагностика MTU (Вариант 2) | -| 🔵 Если MTU исправлен | Вернуться к Cluster policy + Deployment | +| Приоритет | Действие | Эффект | +|-----------|----------|--------| +| 🟢 Сразу | `controller.kind: DaemonSet` в Helm values | Убирает костыль с репликами навсегда | +| 🟡 Параллельно | Диагностика MTU + MSS clamping | Устраняет stall в корне | +| 🔵 Потом | Если MTU починен — вернуть `Cluster` | Можно уйти от `Local` и требования под/ноду | + +## Как передать девопсу (Opus) + +Для чарта `shturval-ingress-controller-2.12.1`: + +```bash +# Вариант A: DaemonSet +helm upgrade -n ingress shturval-ingress-controller <чарт> \ + --set controller.kind=DaemonSet + +# Вариант B: replicaCount + antiAffinity (если DaemonSet недоступен) +helm upgrade -n ingress shturval-ingress-controller <чарт> \ + --set controller.replicaCount=4 \ + --set controller.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchLabels.app\.kubernetes\.io/name=ingress-nginx \ + --set controller.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].topologyKey=kubernetes.io/hostname +``` + +Либо через Штурвал UI — изменить `replicaCount: 4` в настройках чарта. + +## Диагностика MTU (Opus) + +```bash +# реальный MTU туннеля +ip link show | grep -E "cilium|genev" + +# есть ли MSS clamping +iptables -t mangle -L FORWARD -n -v | grep MSS +``` + +Варианты фикса: +- MSS clamping: `iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu` +- Cilium DSR: `loadBalancer.mode: dsr` + `kubeProxyReplacement: strict` +- Выставить MTU в Cilium под физическую сеть (Geneve overhead ~50 байт) ---