reconfigurando o backend do haproxy dinamicamente

4

Meu requisito é ter ~ 50 backends haproxy http, que serão adicionados e removidos dinamicamente (sem o meu envolvimento) em qualquer lugar da rede interna. Eu posso supor que cada backend http sabe seu endereço IP e sabe o endereço IP do haproxy. Eu posso supor que eu possa adicionar um pouco de código a cada backend http, para permitir que ele se registre com o haproxy sempre que ele girar e cancelar o registro antes que ele diminua.

Eu tenho haproxy ouvindo na porta 80:

frontend main *:80

Além disso, eu exponho um soquete stat:

stats socket 0.0.0.0:8080

Minha configuração funciona & em particular, eu posso conectar ao soquete de estatísticas usando socat readline TCP4:<haproxyIP>:8080

Vamos supor que temos dois backends http servindo em 10.0.0.1:4040 e 10.0.0.2:4040 , e que haproxy pode alcançar ambos os endereços.

Qual comando stat socket eu preciso emitir sobre o soquete stat para que qualquer solicitação para <haproxyIP>:8080/backend1/status seja roteada para 10.0.0.1:4040/status e qualquer solicitação para <haproxyIP>:8080/backend2/version seja roteada para 10.0.0.2:4040/version ?

Em geral: como faço dinamicamente solicitações HTTP de [GET|POST] <haproxyIP>:<haproxyPort>/<backendID>/<remainingPath> para [GET|POST] <backendIP>:<backendPort>/<remainingPath> , já que conheço um mapa de backendID -> backendIP, backendPort .

    
por Adam Kurkiewicz 28.06.2016 / 12:13

2 respostas

2

Se todas as suas solicitações chegarem a este frontend, elas estarão em tal formato:

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/(.*)     \ /
    server foo ...

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

Se você tiver algumas solicitações que não estão nesse formato, adicione mais use_backend-s ou default_backend. Você também pode fazer com que a ferramenta de orquestração que gera a configuração gere um arquivo simples com todos os nomes de backend e você pode usá-lo para ainda mais lógica

acl existing_backends path -f all_backends.txt -m beg

Onde o all_backends.txt se parece:

/backend1/
/backend2/
...

Dependendo da versão exata do HAProxy que você está usando, isso pode ser um pouco otimizado (usando aspas, variáveis, etc.), mas desta forma deve funcionar com 1.5 +.

    
por 12.06.2017 / 01:46
1

você pode conseguir isso usando os comandos do soquete unix. Dê uma olhada no ponto 9.2 do arquivo doc management.txt .

Existem ferramentas de terceiros que usam essa 'api' como haproxyctl , mas eu não tenho nenhuma experiência com elas.

    
por 28.06.2016 / 12:32