Время отклика Kubenet ухудшено, решено с помощью hostNetwork: правда, с приложением Unicorn - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь отладить проблему, которая решается с помощью hostNetwork: true.Установка k8s использует kubenet, а версия k8s 1.9.8.

Установка выполняется с помощью kops на AWS с использованием экземпляров m4.xlarge и c4.xlarge.

Проблема заключается в том, чтоследующее:

Когда мы перенесли это приложение в kubernetes, время отклика (процентиль 95) для определенной конечной точки увеличилось примерно на 20-30%.

Однако эта проблема решается при использованииhostNetwork: true в ямле.Производительность такая же, как на виртуальных машинах для этой конечной точки, т. Е. Процентиль 95 для времени отклика одинакова для этой конечной точки.

Я спрашивал об этом в рабочие часы офиса в Куберне 18 июля (да, некоторое время назад!) и обходной путь hostNetwork: true.

Пожалуйста, обратите внимание, что все вещи с kube-прокси могут быть отброшены, так как это увеличенное время отклика видно при измерении в самом приложении.Я имею в виду, что приложение ruby ​​измеряет время, которое требуется, и отправляет его сборщику журналов.На этот раз, то есть, поскольку запрос начинает обрабатываться приложением до его завершения, он уже показывает снижение производительности.Таким образом, kube-proxy и все такое выходит за пределы уравнения.

В модуле есть 3 контейнера:

  • Nginx
  • Сборщик журналов
  • Приложение (приложение ruby, работающее с единорогом)

Эти приложения также находятся в режиме виртуальных машин

Что я пробовал:

  • Найден способВоспроизвести с помощью ab (тест Apache)
    • ab -c 1 -n 1000 'https://...
    • То же самое происходит с http, а не https
  • Я попытался удалить контейнер nginx,но это ничего не меняет.Сборщик журналов используется поверх localhost, и то же самое делается на виртуальных машинах, которые не вызывают проблемы
  • Я пытался использовать unix-сокеты между nginx и приложением вместо localhost, но это не таклибо измените что-либо.
  • Пробовал использовать те же экземпляры (m4.xlarge) с EKS: то же самое происходит.Хотя затраты на производительность без использования hostNetwork: true меньше, около 10%.Обратите внимание, что EKS не использует kubenet и использует свое собственное сетевое наложение на основе какого-либо открытого источника.
  • Попытка с использованием другой конечной точки, которая просто возвращает строку (помещает «Ok»), и проблема не возникает
  • Попытка с использованием конечной точки, которая возвращает несколько МБ (например, "Die" * 10 * 1024 * 1024), и проблема также не возникает
  • Пробовала ту же конечную точку, которая имеет проблему с различными параметрами строки запроса, поэтому ответбольшой (9 МБ) или короткий (130 КБ) и оба надежно воспроизводят проблему
  • Пробовал приложение nodejs, которое возвращает похожие jsons из аналогичных источников, и проблема отсутствует (ни с короткими / длинными ответами) Что можетсделайте следующее:

Итак, я пытаюсь отладить эту проблему, чтобы понять, что это такое, и, надеюсь, прекратить использование hostNetwork: true.Кажется, есть путь, чтобы копать дальше:

  • Попробуйте другие CNI (EKS показал меньшее снижение производительности), чтобы увидеть, изменяется ли производительность

  • Посмотрите, чтоэта конечная точка делает или как она взаимодействует с единорогом и всем стеком.Одно большое отличие состоит в том, что единорог - это один процесс на запрос (синхронный), а nodejs - нет.

  • Попробуйте использовать более новые машины (m5 / c5), чтобы увидеть, снижают ли они снижение производительности,Но, поскольку эта проблема не существует с текущими экземплярами, использующими их в качестве виртуальных машин, кажется, что, если это поможет, будет только скрыть проблему

Эта конечная точка, которая имеет проблему перфорации, являетсяконечная точка в ruby, которая читает базу данных и возвращает json.С базой данных, хостом, сетью все выглядит нормально (мониторинг CPU, дисковый ввод-вывод, подкачка и т. Д. С помощью vmstat, наших обычных инструментов, консоли AWS, проверка kern.log, sysloca и тому подобного)

Случайно, у вас был подобный опыт?Или у вас есть другие идеи о том, как продолжить устранение этой проблемы?

Любые идеи или любая помощь более чем приветствуются!

Родриго

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Кажется, проблема в https://github.com/kubernetes/kubernetes/issues/56903

Упомянутые там обходные пути (например, dnsPolicy: Default) решают проблему для меня.

Эти два поста объясняют проблему подробно: https://www.weave.works/blog/racy-conntrack-and-dns-lookup-timeouts и https://blog.quentin -machu.fr / 2018/06/24 / 5-15s-dns-look-up-on-kubernetes /

А также предоставить некоторые обходные пути.

Короче говоря: в nf есть состояние гонки, которое влияет на протоколы без установления соединения (например, UDP) при выполнении DNAT / SNAT.Ребята плетения прислали патч, чтобы исправить большинство гонок.Чтобы обойти это, вы можете либо использовать внешний DNS (т.е. не Kube-DNS, поскольку он предоставляется через службу и, следовательно, использует DNAT), установить флаги для glibc (но не работают для Musl), использовать минимальную задержкус tc и т. д.

Примечание. Использование dnsPolicy: Default помогает, поскольку используется внешний DNS-сервер (т. е. не размещен в kubernetes и не доступен через службу, которая выполняет DNAT).

Я протестирую флаги glibc для моего кластера, хотя вещь dnsPolicy: Default решает эту проблему для меня, поскольку мы используем разрешение службы k8s DNS в некоторых приложениях.

0 голосов
/ 25 сентября 2018

Похоже, что накладные расходы, которые вы испытываете, связаны с NAT докера.
hostNetwork: true подвергает сеть хоста модулю / контейнеру, в отличие от использования NAT, обеспечивая лучшую производительность ... Носнижение безопасности.

Надеюсь, это поможет!

...