Como rotear o tráfego para contêineres do Docker com o proxy reverso do Traefik


0

Logo Traefik

Traefik é um proxy reverso e balanceador de carga líder para operações nativas da nuvem e cargas de trabalho em contêiner. Funciona como um roteador de borda que publica seus serviços na internet.

O Traefik roteia solicitações para seus contêineres combinando atributos de solicitação, como domínio, URL e porta. O proxy incorpora a descoberta automática de serviços para que você possa adicionar novos contêineres em tempo real, sem reiniciar o serviço Traefik.

Neste guia, montaremos uma implantação simples do Traefik v2 que publicará vários contêineres do Docker. Isso permite que você use uma instalação do Docker para fornecer vários serviços na mesma porta, como um aplicativo da Web, API e painel de administração.

Começando

É mais fácil implantar o Traefik usando sua própria imagem do Docker. Vamos supor que você esteja executando o Traefik com o Docker no restante deste guia. Binários de arquivo único estão disponíveis como uma opção alternativa se você preferir que o Traefik fique fora da instalação do Docker.

Você deve criar um arquivo de configuração antes de começar a usar o Traefik. Adicione o seguinte conteúdo a um traefik.toml file – explicaremos o que ele faz abaixo:

[entryPoints]
  [entryPoints.http]
      address = ":80"
      [entryPoints.http.http.redirections.entryPoint]
          to = "https"
          scheme = "https"
  [entryPoints.https]
      address = ":443"
 
[providers]
  [providers.docker]
    network = "traefik"
Propaganda

Este arquivo de configuração configura o Traefik com dois “pontos de entrada”. Os pontos de entrada descrevem como as solicitações chegam ao serviço Traefik. Os pontos de entrada HTTP e HTTPS são criados para escutar nas portas 80 e 443, respectivamente. No caso de uma solicitação HTTP, uma regra de redirecionamento é usada para encaminhá-la ao https ponto de entrada em vez disso. Remova a seção de redirecionamento se desejar veicular conteúdo por HTTP simples.

A seção “provedores” configura as fontes que definem suas rotas de rede. Os provedores são simplesmente componentes de infraestrutura que podem emitir instruções de roteamento ao Traefik. Se quiser, você pode escrever um endpoint de API HTTP personalizado para definir suas rotas.

Neste exemplo, estamos simplificando e usando o docker fornecedor. Isso monitora os contêineres do Docker em execução em seu host. Quando um novo contêiner aparece com rótulos específicos do Traefik, esses valores serão usados ​​para configurar uma rota para o contêiner. Os recipientes devem ser anexados ao traefik Rede do Docker para que isso funcione, pois essa é a rede especificada no arquivo de configuração. Crie a rede agora:

docker network create traefik

Iniciando o Traefik

Agora você está pronto para iniciar o Traefik! Implante um novo contêiner com a imagem do Traefik. Vincule as portas 80 e 443 ao seu host, permitindo que o Traefik escute as solicitações recebidas. Você também deve juntar o container ao traefik rede criada anteriormente.

Monte o soquete Docker do seu host no contêiner Traefik com o -v bandeira. Isso dá ao Traefik a capacidade de acessar outros contêineres em execução em seu host, permitindo a detecção automática de rotas por meio do docker provedor configurado em seu arquivo de configuração. O próprio arquivo de configuração é montado em /traefik.toml dentro do contêiner Traefik.

docker run -d 
  -p 80:80 
  -p 443:443 
  -v $PWD/traefik.toml:/traefik.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Em seguida, inicie alguns contêineres para testar se o Traefik está funcionando:

docker run -d 
  --label traefik.http.routers.apache.rule=Host(`apache.example.com`) 
  --name apache 
  --network traefik 
  httpd:latest

docker run -d 
  --label traefik.http.routers.nginx.rule=Host(`nginx.example.com`) 
  --name nginx 
  --network traefik 
  nginx:latest
Propaganda

Certifique-se de ter adicionado registros DNS para apache.example.com e nginx.example.com esse mapa para o seu host Traefik. Você deve poder visitar esses domínios em seu navegador para ver as páginas de destino padrão do Apache e do NGINX, respectivamente. Os dois contêineres estão ligados à rede Traefik; seus traefik.http.routers os rótulos configuram rotas básicas que correspondem às solicitações recebidas pelo valor de suas Host cabeçalho.

Roteamento de tráfego

O Traefik suporta vários “matchers” diferentes para rotear seu tráfego. Usamos a correspondência de host acima, mas você também pode rotear por método HTTP, cabeçalhos, URI, endereço IP e parâmetros de string de consulta. Adicione vários correspondentes aos seus contêineres para criar regras de roteamento mais complexas.

O Traefik também oferece suporte a middlewares que permitem modificar a solicitação antes que ela chegue aos seus serviços. Você pode querer adicionar um prefixo, ajustar cabeçalhos ou aplicar a autenticação básica no nível de proxy. Aqui está um exemplo de uso do Headers middleware para adicionar um extra X-Proxied-By cabeçalho da solicitação:

docker run -d 
  --label traefik.http.routers.nginx.rule=Host(`nginx.example.com`) 
  --label traefik.http.middlewares.demo.headers.customrequestheaders.X-Proxied-By=traefik
  --name nginx 
  --network traefik 
  nginx:latest

O Traefik roteia o tráfego para as portas expostas de seus contêineres. Você pode especificar uma porta diferente configurando o traefik.http.services.<demo-service>.loadbalancer.server.port=8080 etiqueta.

Adicionando SSL

Em seguida, você deve adicionar SSL para garantir que seu tráfego esteja totalmente protegido. O Traefik inclui a integração Let’s Encrypt, então usaremos agora para automatizar a geração de certificados.

Adicione a seguinte seção ao seu traefik.toml Arquivo:

[certificatesResolvers.lets-encrypt.acme]
  email = "you@example.com"
  storage = "/acme.json"
  [certificatesResolvers.lets-encrypt.acme.tlsChallenge]

Isso configura o Traefik para usar o provedor Let’s Encrypt ACME ao resolver solicitações de certificado. Certifique-se de substituir o endereço de e-mail pelo seu próprio para receber quaisquer lembretes de expiração de certificado enviados pela Let’s Encrypt. O tlsChallenge seção define como ocorre a verificação da certificação; deixá-lo vazio usará o fluxo padrão de servir um arquivo exclusivo que o Let’s Encrypt solicitará e validará durante a emissão do certificado.

Propaganda

Reinicie ou substitua seu contêiner Traefik para aplicar a nova configuração. Você também deve montar um novo arquivo para /acme.json dentro do contêiner – o Traefik usará isso para armazenar certificados.

docker run -d 
  -p 80:80 
  -p 443:443 
  -v $PWD/acme.json:/acme.json 
  -v $PWD/traefik.toml:/traefik.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Usando o painel

O Traefik inclui uma interface do usuário da Web que oferece uma visualização gráfica dos terminais, provedores e serviços (contêineres) ativos em sua implantação. Você pode expor a interface do usuário configurando uma rota para ela em seu arquivo de configuração.

Primeiro modifique seu existente traefik.toml com a seguinte seção:

[api]
  dashboard = true
 
[providers.file]
  filename = "/traefik_dashboard.toml"

Próxima criação traefik_dashboard.toml com o seguinte conteúdo:

[http.middleware.dashboard_auth.basicAuth]
  users = [
    "admin:$123..."
  ]
 
[http.routers.api]
  rule = "Host(`traefik.example.com`)"
  entrypoints = ["https"]
  middlewares = ["dashboard_auth"]
  service = "api@internal"
  [http.routers.api.tls]
    certResolver = "lets-encrypt"

O novo arquivo é necessário, pois o Traefik não suporta configuração “dinâmica” (serviços e roteadores) junto com os valores “estáticos” em seu arquivo principal. traefik.toml. O arquivo de configuração do painel define manualmente uma rota que mapeia traefik.example.com para o serviço de IU da Web interno. O providers.file linha adicionada a traefik.toml registra a nova definição de rota com o file fornecedor.

Usar htpasswd para gerar um conjunto de credenciais HTTP Basic Auth. Adicione a string gerada ao users matriz no dashboard_auth middleware. Você precisará usar esse nome de usuário e senha para acessar o painel.

sudo apt install apache2-utils
htpasswd -nb admin your_password

# Outputs admin:$123...

Agora reinicie o Traefik com sua configuração atualizada, lembrando de montar o novo traefik_dashboard.toml arquivo também:

docker run -d 
  -p 80:80 
  -p 443:443 
  -v $PWD/acme.json:/acme.json 
  -v $PWD/traefik.toml:/traefik.toml 
  -v $PWD/traefik_dashboard.toml:/traefik_dashboard.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Você deve ser capaz de acessar o painel indo para traefik.example.com no seu navegador. Se você não quiser expor a interface do usuário da Web como uma rota e sempre acessá-la de sua máquina local, poderá publicar a porta 8080 em seu contêiner Traefik. Modifique seu traefik.toml arquivo com a seguinte seção:

[api]
  dashboard = true
  insecure = true
docker run -d 
  -p 8080:8080 
  -p 80:80 
  -p 443:443 
  -v $PWD/acme.json:/acme.json 
  -v $PWD/traefik.toml:/traefik.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6
Propaganda

Isso permitirá que você acesse o painel via http://localhost:8080. Essa abordagem não deve ser usada em ambientes de produção seguros, mas facilita a configuração de experimentos locais.

Conclusão

O Traefik é uma solução versátil de proxy reverso para seus contêineres. Neste artigo, abordamos apenas o mais fundamental de seus recursos. Além do uso básico com o Docker, o Traefik também trabalha com as principais soluções de orquestração de contêineres, incluindo Kubernetes, Docker Swarm e Mesos.

O Traefik fornece uma API REST, bem como métricas em formatos compreendidos por Prometheus, InfluxDB, Datadog e Statsd. Esses recursos permitem automatizar e instrumentar as implantações do Traefik junto com os outros componentes de infraestrutura em sua pilha. É uma maneira ideal de publicar cargas de trabalho em contêiner para o mundo sem usar uma solução de orquestração completa.


Like it? Share with your friends!

0

0 Comments

Your email address will not be published. Required fields are marked *