Как разрешить только одно соединение для каждого модуля с помощью контроллера входящего трафика nginx

Мой кластер Kubernetes использует replicaSet для запуска N похожих модулей. Каждый модуль может обрабатывать только одно соединение с веб-сокетом из-за ограничений ресурсов. Мой Kubernetes использует входной контроллер nginx.

Есть ли способ заставить nginx отправлять только одно входящее соединение с веб-сокетом для каждого модуля и в случае отсутствия доступных модулей отклонять входящее соединение?


person user1886318    schedule 20.10.2019    source источник
comment
Привет, @ user1886318, помогли ли ниже ответы решить вашу проблему?   -  person Jakub    schedule 22.10.2019


Ответы (2)


Я не очень хорошо знаком с настройкой входящего трафика Kubernetes Nginx, но если предположить, что он предоставляет некоторые параметры конфигурации Nginx для настройки групп серверов, в функции server есть параметр с именем max_conns, который позволит вам ограничить количество подключений к серверу. данный сервер. Предполагая, что во входном контроллере есть сопоставление, должна быть возможность установить max_conns=1 для каждого сервера, который создается и добавляется в конфигурацию Nginx под капотом.

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

Изменить: небольшое беглое исследование, и похоже, что это действительно возможно. Похоже, вы можете указать это в ConfigMap как nginx.org/max-conns в соответствии с основным списком параметров здесь: https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/configmap-and-annotations.md

person josephkibe    schedule 20.10.2019

Вы можете использовать readinessProbe с относительно низким periodSecond и, очевидно, {success,failure}Threshold, установленным на 1, чтобы выпускать или не выпускать Pod как можно быстрее.

По сути, вы можете настроить сценарий или простую конечную точку HTTP, которая возвращает код состояния сбоя в случае, если соединение было установлено: таким образом, конечная точка Pod будет удалена из списка конечных точек службы и не будет выбрана контроллером Ingress.

Просто имейте в виду, что на это решение могут повлиять условия гонки, но оно наиболее простое: лучшим решением может быть использование Service Mesh, но это означает дополнительную сложность.

person prometherion    schedule 20.10.2019