On Centos 7.4 Eu estou configurando um enxame onde eu quero executar vários roteadores todos alcançáveis na porta 80/443.
O objetivo é hospedar ambientes múltiplos (teste / escalonamento ...) em um único enxame, todos simetricamente.
Estou usando o Docker 17.12.0-ce e o Traefik v1.4.6 como roteador.
A ideia básica é ter um endereço IP virtual por ambiente e publicar as portas do Traefik apenas nesse endereço. Isso é impossível com o Docker Swarm, então eu tenho que recorrer para que as instâncias do Traefik escutem as portas 81/82 etc e de alguma forma traga o tráfego do VIP: 80 para: 81 /: 82.
Endereços IP virtuais para todos os ambientes nos gerenciadores de enxames são tratados pelo Keepalived.
Configuração relevante do serviço de encaixe para o Traefik:
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 81,
"PublishMode": "ingress"
},
# netstat -anp|grep 81
tcp6 7 0 :::81 :::* LISTEN 4578/dockerd
O firewalld está configurado para permitir o tráfego para as portas 80, 81, 82, etc.
Acessando os serviços de back-end expostos pelo Traefik diretamente na porta 81 dos trabalhos VIP.
O acesso à porta 80 no VIP quando nada está configurado corretamente leva à conexão recusada
A instância do Docker do Traefik está em execução no mesmo host que estou usando para os testes a seguir.
Eu tentei pela primeira vez com o DNAT básico:
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=81:toaddr=127.0.0.1
Isso levou a tempos limite, nenhuma conexão apareceu estabelecida no servidor e o tcpdump me disse que os SYNs são ignorados
em seguida eu tentei com um DNAT um pouco mais específico:
firewall-cmd --add-rich-rule='rule family=ipv4 forward-port port=80 protocol=tcp to-port=81 to-addr=127.0.0.1'
com os mesmos resultados.
Eu descobri GORB que parece adaptado ao meu caso de uso e o provisionei com
Serviço:
{
"host": "<VIP>",
"port": 80,
"protocol": "tcp",
"method": "rr",
"persistent": true,
"flags": "sh-port"
}
Backend para o serviço mencionado:
{
"host": "<VIP>",
"port": 81,
"method": "nat",
"weight": 100,
"pulse": {
"type": "tcp",
"interval": "30s",
"args": null
}
}
Eu verifiquei a configuração usando o ipvsadm e parece correto:
# ipvsadm -l -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP <VIP>:80 rr (flag-2)
-> <VIP>:81 Masq 100 0 0
neste caso, enquanto nenhuma conexão aparecia no servidor, o tcpdump mostrava SYN, SYNACK e ACK sendo trocados, seguidos pela requisição HTTP e seu ACK.
Nenhum outro tráfego foi aprovado e, em última análise, o pedido expirou no lado do cliente.
O ipvsadm registrou a conexão como ativa.
Se eu configurar o HAProxy para ouvir no VIP: 80 e para fazer proxy dos pedidos via HTTP para 127.0.0.1:81, tudo funciona, mas eu gostaria de evitá-lo, já que requer que todos os dados passem pelo HAProxy, perdendo recursos para nada e exigindo configuração local.
Estou sem ideias e não sei como resolver ainda mais.
EDIT para esclarecimento. Minha pergunta é:
É possível rotear o tráfego do VIP: 80 para: 81 /: 82 etc sem usar o HAProxy ou outro processo que simplesmente bombeasse dados para o roteador real (Traefik)?