Балансировка трафика с использованием наименьшего соединения в Кубернетес - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть кластер Kubernetes с развертыванием, подобным следующему:

enter image description here

Цель здесь - развернуть приложение в нескольких модулях, доступных черезслужба ClusterIP с именем my-app. Одно и то же развертывание выполняется в нескольких пространствах имен (A, B и C), слегка изменяя конфигурацию приложения. Затем в некоторых узлах у меня есть HAProxy, использующий hostNetwork для привязки к портам узла. Эти HAProxy открываются для моих клиентов через DNS, указывающий на них (my_app.com).

Когда клиент подключается к моему приложению, они отправляют заголовок, указывающий пространство имен, в которое следует перенаправить запрос (A,B или C) и HAProxy разрешает IP-адрес службы, используя do-resolve для записи DNS, такой как my_app.A.svc.cluster.local, которая возвращает IP-адрес службы my_app в пространстве имен A. Таким образом, у меня может быть одна точка входа (одна запись DNS) и один порт (80) для моего кластера, что является одним из моих требований. Я также могу создавать новые пространства имен и развертывать другие конфигурации моего приложения без необходимости изменять HAProxies, что является вторым требованием.

Теперь полученные запросы представляют собой сочетание коротких и длинных запросов. поэтому мне нужно использовать наименьшее соединение здесь. Это невозможно в HAProxies, так как у меня нет списка бэкэндов (перенаправление динамическое, как вы можете видеть в коде ниже). Я пытаюсь использовать Kube-прокси с IPVS и режимом наименьшего подключения. Что я заметил, так это то, что отслеживание подключений к разным модулям происходит для каждого узла, и эта информация не распределяется между разными узлами. Таким образом, если два запроса к my_app.com Namespace: A обрабатываются двумя разными узлами, оба могут перейти к одному и тому же модулю (например, pod_1), как и в каждом узле, количество активных подключений к этому модулю равно 0. Проблема становится хуже, так какЯ увеличиваю количество HAProxies за DNS.

Как я могу решить эту проблему и получить лучший баланс без единой точки входа в кластер (с одним HAProxy позади DNS)?

Я добавляю сюда код, используемый в HAProxy для маршрутизации на основе заголовков:

resolvers dns
    hold nx 3s
    hold other 3s
    parse-resolv-conf

frontend my_app_frontend
    bind :80
    default_backend my_app_backend
    http-request set-var(sess.namespace) hdr(X-Namespace)
    http-request do-resolve(txn.service,dns,ipv4) str(),concat(my_app.,sess.namespace,.svc.cluster.local)

backend my_app_backend
    http-request set-dst var(txn.service)
    http-request set-dst-port int(80)
    server service 0.0.0.0:0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...