Publicar serviços do Docker Swarm em endereços IP específicos

1

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)?

    
por Seemone 23.01.2018 / 10:11

1 resposta

2

Em primeiro lugar, você pode usar vários IPs no host se tiver a capacidade de adicionar IPs na rede real. Este funciona no Swarm no Linux. Consulte macvlan docs e procure pelo "macvlan swarm" no Google.

Segundo, você está usando a rede de ingresso de sobreposição e enxame, certo?

3rd, A maioria das pessoas acaba de colocar o Traefik (ou o meu link ) para ouvir em 80/443 e encaminha para o serviço adequado / empilhar no Swarm com base no cabeçalho do host. Como Florin perguntou, por que você não está tentando isso?

    
por 24.01.2018 / 04:36