A rede do Docker Swarm Mode e o balanceamento de carga não funcionam no segundo serviço

2

Minha configuração

Dois nós (2 GB de RAM, 2 vCPU) executando o mecanismo do docker (v17.06.1-ce) - um enxame e um trabalhador. Largura de banda da rede interna: 10Gbps. Todos os arquivos e bancos de dados estão localizados fora desse cluster do docker (AWS S3 e instâncias diferentes para o banco de dados).

O que estou tentando alcançar?

Estou tentando criar uma "plataforma" baseada no docker na qual eu forneço serviços stateless e o docker manipula balanceamento de carga, atualizações etc. Além disso, também estou tentando configurar o proxy reverso e permitir serviços para ter acesso a este proxy.

O que eu fiz até agora?

Primeiramente, criei uma rede de sobreposição e a chamei de "pública". (10.0.9.0/24) Em seguida, criei um serviço nginx no modo "global". O serviço por si só é anexado à rede "pública". Eu verifiquei ambos os nós worker e swarm e o serviço é executado em ambos sem problemas.

Em segundo lugar, criei o arquivo de composição do docker para a rápida implantação de vários serviços. Para o bem dos meus testes, mantive um serviço por arquivo de composição:

version: '3.3'
services:
  web:
    image: app1_image:latest
    networks:
      - public
networks:
  public:
    external:
      name: public

Para o segundo serviço, eu apenas mudei o nome da imagem e mantive tudo o mesmo. Ran "pilhas":

docker stack deploy --with-registry-auth --compose-file compose1.yml app1
docker stack deploy --with-registry-auth --compose-file compose2.yml app2

Após inspecionar os dois serviços, vejo que os dois serviços estão na rede "overlay" com IPs como 10.0.9.5 (app1_web) e 10.0.9.6 (app2_web). app1_web é criado no nó swarm e app2_web é criado no nó do funcionário.

Então, eu crio dois arquivos de configuração nginx para os dois serviços da seguinte maneira:

server {
    listen 80;
    server_name app1.example.com;
    location / {
        proxy_pass http://app1_web; # This line is important
        # Other proxy parameters
    }
}

Como você vê, estou passando o nome do serviço na configuração nginx. Para facilitar o gerenciamento de configuração, uso as configurações do docker:

docker config create nginx_app1.conf app1.conf
docker config create nginx_app1.conf app1.conf

docker service update --config-add source=nginx_app1.conf,target=/etc/nginx/conf.d/app1.conf nginx_proxy
docker service update --config-add source=nginx_app2.conf,target=/etc/nginx/conf.d/app2.conf nginx_proxy

Adicionar essas configurações reinicia automaticamente os serviços nginx e os executa. Isso é tudo. Eu queria te dar uma ideia do meu processo antes de seguir em frente.

O problema

app1_web é criado no swarm; Então, quando eu vou para app1.example.com, o nginx faz um proxies do meu pedido para o serviço e eu recebo uma saída apropriada. Isso é o que é esperado e estou feliz com o resultado.

No entanto, como app2_web é criado no nó do funcionário, o nginx me dá um erro de que app2_web não existe. Então, comecei a solucionar problemas.

Do swarm, encontrei o ID da instância do docker e tentei executar um comando do proxy nginx:

docker exec nginx-proxy-id ping app2_web

Isso me deu um erro de "endereço incorreto". Então, entrei no compose2.yml e adicionei portas:

ports:
  - 5380:80

Quando eu fui ao swarm.example.com:5380, ele basicamente me deu 404. No entanto, abrindo a mesma porta do worker.example.com:5380, abriu o app2.

Eu testei o mesmo para app1. Eu repliquei o app1 usando docker service scale app1=2 e o serviço foi criado no nó do trabalhador. Então pausei o serviço no swarm usando docker pause app1-id . Quando fui ao app1.example.com, funcionava metade do tempo. Eu acho que ainda era estranho porque eu esperava que o Docker soubesse que o serviço está pausado e só proxy o serviço para o nó do trabalhador, mas o que for. Pelo menos estava funcionando. A replicação de app2 não ajudou. Eu ainda continuei recebendo erro que o nome do host não existe. Depois disso, fui mais longe e disse ao nó do funcionário para deixar o enxame: docker swarm leave e, coincidentemente, tudo funcionou normalmente ...

Depois de gastar pelo menos 10 horas com isso, estou perdido no que estou fazendo de errado aqui. Por alguma razão, quando o serviço é criado primeiro no worker, o Docker não gosta dele.

Desculpe por uma longa parede de texto. Eu queria compartilhar todos os passos que dei. Eu realmente aprecio sua ajuda.

    
por Gasim 08.09.2017 / 14:25

0 respostas