Кубе-прокси или ELB «задерживают» пакеты HTTP-запросов

Мы запускаем приложение веб-API на Kubernetes (1.9.3) в AWS (установлено с помощью KOPS). Приложение представляет собой развертывание и представлено службой (тип: LoadBalancer), которая на самом деле является ELB (v1) на AWS. Обычно это работает - за исключением того, что некоторые пакеты (фрагменты HTTP-запросов) «задерживаются» где-то между контейнером client <-> app. (Как в HTTP, так и в HTTPS, который заканчивается на ELB).

Со стороны узла:

(Примечание: почти все пакеты на стороне сервера прибывают дублированными 3 раза.)

Мы используем keep-alive, чтобы tcp-сокет был открыт, а запросы приходили и возвращались довольно быстро. Тогда возникает проблема:

  • сначала приходит пакет только с заголовками [PSH, ACK] (я вижу заголовки в полезной нагрузке с tcpdump).
  • [ACK] отправляется обратно контейнером.
  • Сокет / поток tcp очень долго молчит (до 30 лет и более - но интервал не согласован, мы рассматриваем> 1 с как проблему).
  • поступает еще один [PSH, ACK] с данными HTTP, и, наконец, запрос может быть обработан в приложении.

Со стороны клиента:

Я запустил некоторый трафик со своего компьютера, записывая его на стороне клиента, чтобы увидеть другой конец проблемы, но не на 100% уверен, что он представляет реальную сторону клиента.

  • a [PSH, ASK] с гаснут заголовки.
  • пара [ACK] с частями полезной нагрузки начинают выходить.
  • ответ не приходит в течение нескольких секунд (или более), и пакеты больше не выходят.
  • [ACK], помеченный как [TCP Window update], прибывает.
  • снова короткая пауза, и [ACK] начинают поступать, и сеанс продолжается до конца полезной нагрузки.

Это происходит только под нагрузкой.

Насколько я понимаю, это что-то среднее между ELB и Kube-Proxy, но я невежественен и отчаянно нуждаюсь в помощи.

Это аргументы, с которыми работает Kube-Proxy:

Commands: /bin/sh -c mkfifo /tmp/pipe; (tee -a /var/log/kube-proxy.log < /tmp/pipe & ) ; exec /usr/local/bin/kube-proxy --cluster-cidr=100.96.0.0/11 --conntrack-max-per-core=131072 --hostname-override=ip-10-176-111-91.ec2.internal --kubeconfig=/var/lib/kube-proxy/kubeconfig --master=https://api.internal.prd.k8s.local --oom-score-adj=-998 --resource-container = "" --v=2 > /tmp/pipe 2>&1

И мы используем Calico в качестве CNI:

Пока я пробовал:

  • Используя service.beta.kubernetes.io/aws-load-balancer-type: "nlb" - проблема осталась.
  • (Поиграйте с настройками ELB в надежде, что что-то поможет ¯_ (ツ) _ / ¯)
  • Искал ошибки в Kube-Proxy, обнаружил следующие редкие случаи:

E0801 04:10:57.269475 1 reflector.go:205] k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/factory.go:85: Failed to list *core.Endpoints: Get https://api.internal.prd.k8s.local/api/v1/endpoints?limit=500&resourceVersion=0: dial tcp: lookup api.internal.prd.k8s.local on 10.176.0.2:53: no such host

...а также...

E0801 04:09:48.075452 1 proxier.go:1667] Failed to execute iptables-restore: exit status 1 (iptables-restore: line 7 failed ) I0801 04:09:48.075496 1 proxier.go:1669] Closing local ports after iptables-restore failure

Я не смог найти ничего, описывающего такую ​​проблему, и буду благодарен за любую помощь. Приветствуются идеи о том, как продолжить и устранить неполадки.

Лучший, А

Не могли бы вы попытаться разрешить весь межсетевой трафик между всеми узлами в кластере и создать тестовую службу с типом nodePort, чтобы проверить, есть ли проблема с балансировщиком или kube-proxy?

Nick Rak 02.08.2018 13:02

Привет, @ArAr, я назначил награду за этот вопрос, потому что в настоящее время у нас есть аналогичная проблема. Думаю, этот вопрос заслуживает большего внимания! Будем надеяться, что найдем решение;)

prichrd 04.10.2018 23:18

@ArAr Вы нашли решение этой проблемы? У меня похожие проблемы с ELB с Kubernetes.

Kirill 22.11.2018 18:59

Какое приложение в итоге обрабатывает запросы? Возможно ли, что он однопоточный и блокирует ввод-вывод? Это означало бы, что он может обрабатывать только один запрос за раз. Поэтому, когда один запрос находится на рассмотрении, все остальные запросы будут устаревшими.

Johannes 'fish' Ziemke 23.01.2019 00:48

Сколько экземпляров подов у вас есть для вашего приложения? Может ли быть, что у вас проблема только для определенного экземпляра модуля / для модулей в определенном узле? +1 за предложение NickRak о тесте Nodeport, но, честно говоря, я не думаю, что ELB станет проблемой.

whites11 07.06.2019 17:57

Только что понял, что это очень старый вопрос, извините, что возобновил его. Вы решили это в конце концов?

whites11 07.06.2019 17:58

Вы исправили это? или мы должны закрыть вопрос?

Rico 21.07.2020 03:51
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
10
7
537
0

Другие вопросы по теме