Kube-прокси или ELB "задерживают" пакеты HTTP-запросов

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

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

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

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

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

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

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

  • [PSH,ASK] с заголовками погаснуть.
  • пара [ACK] с частями полезной нагрузки начинает выходить.
  • в течение нескольких секунд (или более) не приходит никакого ответа, и больше не отправляются пакеты.
  • [ACK], помеченный как [Обновление окна TCP], прибывает.
  • снова короткая пауза, и [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

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

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

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

E0801 04: 10: 57.269475 1 refleor.go:205] k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/factory.go:85: Не удалось перечислить *core.Endpoints: Получить https://api.internal.prd.k8s.local/api/v1/endpoints?limit=500&resourceVersion=0: dial tcp: lookup api.internal.prd.k8s.local на 10.176.0.2:53: такого хоста нет

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

E0801 04: 09: 48.075452 1 proxier.go: 1667] Не удалось выполнить iptables-restore: состояние выхода 1 (iptables-restore: сбой строки 7) I0801 04:09:48.075496 1 proxier.go:1669] Закрытие локальных портов после iptables восстановление

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

Бест, А

0 ответов

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