Я настроил кластер k8s на microk8s и портировал на него свое приложение. Я также добавил горизонтальное автоматическое масштабирование, которое добавляет модули в зависимости от загрузки процессора. Автомасштабирование работает нормально и добавляет модули, когда нагрузка выходит за пределы цели, и когда я снимаю нагрузку через некоторое время, он убивает модули.
Проблема в том, что я заметил, что в те самые моменты, когда автомасштабатор создает новые модули, некоторые запросы терпят неудачу:
POST Response Code : 200
POST Response Code : 200
POST Response Code : 200
POST Response Code : 200
POST Response Code : 200
POST Response Code : 502
java.io.IOException: Server returned HTTP response code: 502 for URL: http://10.203.101.61/gateway/compile
POST Response Code : 502
java.io.IOException: Server returned HTTP response code: 502 for URL: http://10.203.101.61/gateway/compile
POST Response Code : 200
POST Response Code : 502
java.io.IOException: Server returned HTTP response code: 502 for URL: http://10.203.101.61/gateway/compile
POST Response Code : 502
java.io.IOException: Server returned HTTP response code: 502 for URL: http://10.203.101.61/gateway/compile
POST Response Code : 200
POST Response Code : 200
POST Response Code : 200
POST Response Code : 200
POST Response Code : 200
POST Response Code : 200
POST Response Code : 200
POST Response Code : 200
Я хотел бы знать, в чем причина этого и как я могу это исправить?
Обновлять: Я думаю, что лучше дать вам больше информации о моей настройке:
Трафик поступает из-за пределов кластера, но и узел k8s, и программа, генерирующая запросы, находятся на одном компьютере, поэтому проблем с сетью нет. Существует собственный компонент nginx, который не выполняет балансировку нагрузки, а просто действует как обратный прокси-сервер и отправляет трафик на соответствующие службы.
Я провел еще один тест, который дал мне больше информации. Я провел тот же сравнительный тест, но на этот раз вместо отправки запросов обратному прокси-серверу (nginx) я использовал IP-адрес этой конкретной службы, и у меня не было неудачных запросов, в то время как автомасштабирование выполняло свою работу и запускало несколько модулей. Я не уверен, проблема в Nginx или k8s?
Нет, у меня нет живого зонда. Трафик поступает из-за пределов кластера, но и узел k8s, и программа, генерирующая запросы, находятся на одном компьютере, поэтому проблем с сетью нет. Существует собственный компонент nginx, который не выполняет балансировку нагрузки, а просто действует как обратный прокси-сервер и отправляет трафик на соответствующие службы.

Когда появляются новые поды, Kubernetes сразу же начинает перенаправлять на них трафик. Однако обычно требуется некоторое время, чтобы модуль загрузился и стал работоспособным (готовым).
Чтобы этого не произошло, вы можете определить Зонд готовности для своих модулей. K8s будет периодически вызывать модуль на конечной точке готовности, которую вы предоставили, чтобы определить, работает ли этот модуль и готов ли он принимать запросы. K8s не будет перенаправлять трафик на модуль до тех пор, пока конечные точки готовности не вернут успешный результат в зависимости от тип зонда (см. раздел «Типы зондов»).
Спасибо за ваш ответ, тем временем я провел еще один тест, который дал мне больше информации. Я провел тот же сравнительный тест, но на этот раз вместо отправки запросов обратному прокси-серверу (nginx) я использовал IP-адрес этой конкретной службы, и у меня не было неудачных запросов, в то время как автомасштабирование выполняло свою работу и запускало несколько модулей. Я не уверен, проблема в Nginx или k8s?
Я столкнулся с аналогичной проблемой: масштабируйте развертывание Core/kube DNS. Существует ограничение на DNS-запрос в секунду в core/kube DNS, поэтому, когда новый модуль раскручивается, он увеличивает нагрузку на DNS-сервер, и вы начинаете получать 502.
Моя проблема не была связана с k8s, но, как сказал @VictorVal, это проблема с Nginx, и я решил ее, добавив тест готовности к моему развертыванию. Теперь Nginx отправляет трафик только что созданным подам, когда они готовы.
О вашем вопросе:
I am not sure if the problem is Nginx or k8s?
Согласно документам ingress-nginx:
The NGINX ingress controller does not uses Services to route traffic to the pods. Instead it uses the Endpoints API in order to bypass kube-proxy to allow NGINX features like session affinity and custom load balancing algorithms. It also removes some overhead, such as conntrack entries for iptables DNAT
Поэтому я считаю, что проблема в Nginx, который не использует все функции Kubernetes (например, kube-proxy) и отправляет запросы в поды до того, как они будут полностью готовы.
Однако, очевидно, этот проблема был фиксированный в 0.23.0 (февраль 2019 г.), поэтому вам следует проверить свою версию.
Лично я испытываю меньше проблем после перехода с Ingress-Nginx на посол, который по умолчанию перенаправляет запросы в службы (поэтому Kubernetes отвечает за балансировку нагрузки и отправку ее в соответствующий под).
Вы установили тесты готовности и живучести при развертывании? этот трафик внутренний или приходит из внешней сети через ingress?