Назад | Перейти на главную страницу

динамическая перенастройка бэкэнда haproxy

Мое требование - иметь ~ 50 бэкэндов haproxy http, которые будут добавляться и удаляться динамически (без моего участия) в любом месте внутренней сети. Я могу предположить, что каждый HTTP-сервер знает свой IP-адрес и знает IP-адрес haproxy. Я могу предположить, что могу добавить немного кода в каждый HTTP-сервер, чтобы он мог регистрироваться в haproxy всякий раз, когда он запускается, и отменять регистрацию, прежде чем он замедлится.

У меня haproxy прослушивает порт 80:

frontend main *:80

Дополнительно выставляю статистический сокет:

stats socket 0.0.0.0:8080

Моя установка работает, и, в частности, я могу подключиться к сокету статистики, используя socat readline TCP4:<haproxyIP>:8080

Предположим, у нас есть два HTTP-сервера, обслуживающие 10.0.0.1:4040 и 10.0.0.2:4040, и этот haproxy может подключиться к обоим адресам.

Какую команду сокета stat мне нужно выполнить через сокет stat, чтобы любой запрос <haproxyIP>:8080/backend1/status направляется к 10.0.0.1:4040/status и любой запрос <haproxyIP>:8080/backend2/version направляется к 10.0.0.2:4040/version?

В общем: как мне динамически проксировать HTTP-запросы от [GET|POST] <haproxyIP>:<haproxyPort>/<backendID>/<remainingPath> к [GET|POST] <backendIP>:<backendPort>/<remainingPath> учитывая, что я знаю карту из backendID -> backendIP, backendPort.

Если все ваши запросы, поступающие на этот интерфейс, имеют такую ​​форму:

frontend main
    bind *:80 # Use separate bind directives as they are supported by new HAProxy versions
    use_backend %[path,fields(2,/)]

backend backend1
    reqrep ^([^\ :]*)\ /backend1/(.*)     \1\ /\2
    server foo ...

backend backend2
    reqrep ^([^\ :]*)\ /backend2/(.*)     \1\ /\2
    server bar ...

Если у вас есть запросы, которые не в этом формате, вы можете добавить больше use_backend-s или default_backend. У вас также может быть инструмент оркестрации, который генерирует конфигурацию, сгенерировать плоский файл со всеми именами бэкэнда, и вы можете затем использовать его для еще большей логики.

acl existing_backends path -f all_backends.txt -m beg

Где all_backends.txt будет выглядеть так:

/backend1/
/backend2/
...

В зависимости от конкретной версии HAProxy, которую вы используете, это может быть несколько оптимизировано (с использованием кавычек, переменных и т. Д.), Но таким образом оно должно работать с 1.5+.

вы можете добиться этого с помощью команд сокета unix. Взгляните на пункт 9.2 management.txt doc файл.

Есть сторонние инструменты, которые используют этот api, например haproxyctl, но у меня нет опыта работы с ними.