Opa!
Acreditamos que um dos maiores desafios ao trabalhar com alguma tecnologia de cluster, é a forma como você vai disponibilizar o conteúdo para seu usuário/cliente. Obviamente, isso pode ser feito de diversas maneiras, e cada uma delas pode atender à uma necessidade e objetivo.
A intenção hoje é trazer para vocês uma forma simples de disponibilizar conteúdo web – sites, API’s, etc – que têm como backend, o Docker Swarm. Sim, hoje falaremos do Traefik, um poderoso proxy web dinâmico. Mas antes disso, temos que responder a seguinte pergunta: Por que diabos precisamos de um proxy reverso dinâmico? Simples, porque as implementações atuais de Apache, Haproxy e Nginx foram desenvolvidas para serem estáticas, havendo necessidade de intervenções para que as modificações sejam aplicadas. É claro que existem iniciativas que tratam disso e também são boas alternativas, como é o caso do docker-flow-proxy e jwilder/nginx, mas se limitam ao que as tecnologias base oferecerem. No caso do traefik, a situação é bem diferente, ele é um proxy arquitetado e desenvolvido para ser totalmente dinâmico e orientado a micro-serviços. Além disso, ele suporta nativamente diversos tipos de backend, como é o caso do Docker Swarm, Kubernetes, Mesos, Docker, Consul, entre muitos outros.
Features
Algumas features/benefícios do Traefik, incluem:
- Velocidade
- Não há dependência, por ser um binário escrito em go
- Existe imagem oficial para Docker
- Fornece uma API Rest
- Reconfiguração sem a necessidade de reiniciar o processo
- Metricas (Rest, Prometheus, Datadog, Statd)
- Web UI em AngularJS
- Suporte a Let’s Encrypt (Com renovação automática)
- Alta disponibilidade em modo cluster (beta)
O Traefik foi desenvolvido para atender a demanda de requisições web, então ele pode ser utilizado para fazer o roteamento das conexões de um site ou API para o container ou serviço que foi criada para isso. A imagem abaixo é clássica, e explica bem esse comportamento:
Como podemos ver, o traefik fica “ouvindo” as ações que ocorrem no orquestrador – independente de qual for – e baseado nessas ações, se reconfigura para garantir o acesso ao serviço/container criado. Dessa forma, basta você apontar as requisições web (http ou https) para o servidor onde o traefik está trabalhando.
Mãos na massa?
Em nosso laboratório, vamos montar esse ambiente utilizando o Docker Swarm como nosso orquestrador, e para isso, tenha pelo menos três hosts, inicialize o Swarm em um deles, e em seguida adicione os demais ao cluster.
Feito isso, precisamos criar uma rede do tipo overlay, que será utilizada pelo traefik para enviar o trafego web:
docker network create -d overlay net.
Depois de inicializada a rede overlay, basta criar o serviço do traefik:
docker service create --name blog --label 'traefik.port=80' --label traefik.frontend.rule="Host:blog.mundodocker.com.br;" --network net wordpress
Com este comando, será criado um serviço mapeando o socket do Docker para que o traefik possa monitorar o que acontece neste cluster. Além disso, são expostas as portas 80 (para acesso dos sites/API’s) e 8080 (página administrativa do traefik), e caso precise da 443, basta adicionar à lista.
Ok, até o momento, o que fizemos foi criar o serviço do traefik no cluster para que ele monitore e se reconfigure baseando-se nos eventos do cluster. Agora precisamos criar nossos serviços web e ver se tudo funcionará como deveria. Vamos lá:
Blog:
Vamos criar agora uma nova aplicação web, que será responsável por um blog. O processo de criação é bem simples:
docker service create --name blog --label 'traefik.port=80' --label traefik.frontend.rule="Host:blog.mundodocker.com.br;" --network net wordpress
Criamos um serviço com nome de blog utilizando uma imagem do WordPress e adicionamos na rede “net”, essa mesma rede onde o traefik está. Agora vamos detalhar os novos parâmetros:
- traefik.port = Porta onde a aplicação vai trabalhar, no caso do wordpress, será na porta 80.
- traefik.frontend.rule = Qual será o virtual host que este serviço atende, com isso, o traefik consegue definir que, quando chegar uma requisição para: blog.mundodocker.com.br, ele encaminhará as requisições para o serviço correto.
Agora basta apontar no DNS a entrada blog.mundodocker.com.br para o servidor do traefik e a mágica estará feita.
Site:
Para ver como é fácil, tudo que você precisa fazer é executar este comando:
docker service create --name site --label 'traefik.port=80' --label traefik.frontend.rule="Host:www.mundodocker.com.br;" --network net tutum/apache-php
Dessa vez criamos um novo serviço, na mesma rede, mas com alguns parâmetros diferentes, como é o caso do traefik.frontend.rule, onde especificamos um novo endereço, e claro, a imagem que vamos utilizar, que agora é a tutum/apache-php.
URLs:
Outra feature muito legal do traefik é a possibilidade de redirecionar URL’s para backends diferentes. Mas o que isso quer dizer? Quer dizer que podemos enviar partes de uma aplicação para serviços diversos. Por exemplo, na aplicação existe um /compras e um /categoria e podemos enviar essas URL’s para serviços diferentes, apenas informando o traefik, veja:
docker service create --name categoria --label 'traefik.port=3000' --label traefik.frontend.rule="Host:www.mundodocker.com.br; Path: /categoria/" --network net node
Note que agora temos um novo parâmetro, o “Path”, onde especificamos qual URL este serviço vai atender. O resto é semelhante, informamos a porta e a imagem que este serviço vai utilizar. Para criar um serviço especifico para outra URL, basta:
docker service create --name compras --label 'traefik.port=3000' --label traefik.frontend.rule="Host:www.mundodocker.com.br; Path: /compras/" --network -net node
E pronto, sua aplicação estará “quebrada” entre vários serviços, e o mais legal, você não precisou editar um arquivo de configuração sequer. Além dessas facilidades, o traefik ainda disponibiliza uma interface para visualizar como está a saúde das URL’s. Em nosso lab, você acessará pela porta 8080, e visualizará algo como:
Neste dashboard você poderá visualizar como estão configuradas as suas entradas no proxy. Na aba health você poderá visualizar como está o tempo de resposta das URL’s e saber se está tudo certo com o tráfego, veja:
Bonito, né? E além de tudo, extremamente funcional. Em posts futuros veremos um pouco mais sobre como funciona a API do traefik, como configurar o Let’s Encrypt, e alguns outros pontos. Por enquanto, como post introdutório, era isso que eu gostaria de trazer a vocês.
Esperamos que tenham gostado. Qualquer dúvida/sugestão nos avise.
Grande abraço, até mais!