У меня есть кластер Kubernetes с развертыванием, подобным следующему:
![enter image description here](https://i.stack.imgur.com/0cKDI.png)
Цель здесь - развернуть приложение в нескольких модулях, доступных черезслужба 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