Экспоненциальный откат в Кубернетес?
Я новичок в kubernetes, и у меня возникают проблемы с отслеживанием экспоненциального сигнала отката, который я наблюдаю в своих нагрузочных тестах Jmeter для определения времени отклика. У меня есть сервис kubernetes, который работает между 4-32 модулями с горизонтальным автоматическим масштабированием. В каждом модуле работает WSGI Gunicorn, обслуживающий бэкэнд-джанго. Все различные сервисы k8s находятся за обратным прокси-сервером nginx, который перенаправляет входящий трафик непосредственно в VIP-службу. Nginx находится позади Amazon ELB, который подвергается интернет-трафику конечного пользователя. В конечном счете, ELB истекает через 60 секунд.
На каждом сервере gunicorn работает один рабочий с 3-мя гринлетами, и его предел ожидания равен 1. Таким образом, он может обрабатывать только 4 запроса в любой момент времени и немедленно возвращает сообщение об ошибке для любых дополнительных запросов, которые nginx пытается отправить. Я предполагаю, что эти запросы об ошибках затем перехватываются и повторяются с экспоненциальной отсрочкой, но я не могу понять, где это происходит.
Насколько я знаю, nginx не может быть источником для экспоненциальных повторных попыток, поскольку он обслуживает только одну конечную точку восходящего потока для запроса. И я не смог найти ничего в документации, в которой обсуждаются экспоненциально рассчитанные повторные попытки при ответе на ошибку на любом этапе маршрутизации kubernetes. Кластер k8s работает на версии 1.9.
1 ответ
Википедия говорит:
В различных компьютерных сетях двоичный экспоненциальный откат или усеченный двоичный экспоненциальный откат относится к алгоритму, используемому для разнесения повторных повторных передач одного и того же блока данных, часто как часть предотвращения перегрузки сети.
"Усеченный" просто означает, что после определенного числа возрастаний возведение в степень прекращается; то есть время ожидания повторной передачи достигло предела и после этого больше не увеличивается.
Компоненты Kubernetes не имеют возможности повторной передачи запроса. Они просто маршрутизируют трафик между компонентами сети, и если пакет по какой-то причине отбрасывается, он теряется навсегда.
Istio имеет такую функцию, поэтому, если она установлена, это может быть причиной экспоненциального отката. Istio не является частью кластерного дистрибутива Kubernetes по умолчанию, поэтому вы должны установить его вручную, чтобы использовать эту функцию.
Однако, если у вас не установлен istio, повторную передачу пакетов на уровне соединения может выполнить участник TCP-соединения, а именно Jmeter, nginx и ваше приложение. Я предполагаю, что nginx в вашей конфигурации просто перенаправляет трафик на серверные модули и ничего более. На уровне приложения повторная передача также возможна, но в этом случае это будет только Jmeter и backend-приложение.