>> Apresentações e considerações

Yo ChurrOpers!

Nesse artigo vamos falar de um cara muito legal que possui uma gama de features sensacionais que de fato fazem a diferença e que torna o Balanceamento de Carga e o Proxy Reverso muito mais divertido e prático de se trabalhar!

É isso mesmo, vamos falar do Traefik, curioso?

Let’s go!

>> O que é o Traefik

Træfik (pronuncia-se como “traffic”) é um moderno proxy reverso HTTP e LoadBalancer para deploy de microservices com rapidez e facilidade.

Uma das principais grandes sacadas do Traefik é que ele é totalmente dinâmico, quando você trabalha com Nginx, Apache ou HA Proxy por exemplo para realizar suas funções é necessário ter todas as rotas, mapeamentos, e outras configurações declaradas em um ou mais arquivos de configuração e ao adicionar uma nova Stack ou Host para fazer parte do pool as informações precisam ser atualizadas nos arquivos para que a configuração seja válida para o novo ambiente.

Com o Traefik as configurações são definidas nos containers ou nos services por exemplo e são adicionadas dinamicamente na configuração do Traefik, e ele faz isso com maestria, show né?

Nessa imagem temos uma representação de seu funcionamento.

traefik-topology

>> Features

Segue a lista das Features que Traefik proporciona:

  • Único binário escrito em go, leve e rápido
  • Possui imagem Docker oficial com tamanho mínimo
  • Rest API
  • Reload a quente de configurações, sem restart do serviço
  • Circuit breakers, retry
  • Round Robin, rebalancer load-balancers
  • Métricas (Rest, Prometheus, Datadog, Statd)
  • Web Interface limpa em AngularJS
  • Websocket, HTTP/2, GRPC ready
  • Access Logs (JSON, CLF)
  • Suporta o Let’s Encrypt ( HTTPS com renovação automática)
  • Alta disponibilidade no modo Cluster

>> Backend Suportados

  • Docker / Swarm mode
  • Kubernetes
  • Mesos / Marathon
  • Rancher (API, Metadata)
  • Consul / Etcd / Zookeeper / BoltDB
  • Eureka
  • Amazon ECS
  • Amazon DynamoDB
  • File
  • Rest API

>> Mão na massa, Traefik com Swarm

O que será feito?

Vamos criar 3 docker hosts no VirtualBox utilizando o docker-machine, preparar esse ambiente como um cluster swarm e fazer deploy da nossa Stack:

Pré-requisitos

Para prosseguir nesse artigo, você precisa possuir o docker-machine e o VirtualBox instalado em sua máquina.

>> Criando os Nodes no VirtualBox

~# docker-machine create -d virtualbox churrops1
~# docker-machine create -d virtualbox churrops2
~# docker-machine create -d virtualbox churrops3

Validando:

~# docker-machine ls
NAME    ACTIVE  DRIVER   STATE   URL                SWARM   DOCKER  ERRORS
churrops1 - virtualbox Running tcp://192.168.99.112:2376  v17.10.0-ce   
churrops2 - virtualbox Running tcp://192.168.99.113:2376  v17.10.0-ce   
churrops3 - virtualbox Running tcp://192.168.99.114:2376  v17.10.0-ce 

Agora vamos preparar o cluster na seguinte ordem:

  • Inicialiar o cluster
  • “Pegar” o token para o join do manager
  • Ingressar os nodes no Swarm
~# docker-machine ssh churrops1 "docker swarm init \
    --listen-addr $(docker-machine ip churrops1) \
    --advertise-addr $(docker-machine ip churrops1)"

~# export manager_token=$(docker-machine ssh churrops1 "docker swarm \
join-token manager -q")

~# docker-machine ssh churrops2 "docker swarm join \
    --token=${manager_token} \
    --listen-addr $(docker-machine ip churrops2) \
    --advertise-addr $(docker-machine ip churrops2) \
    $(docker-machine ip churrops1)"

~# docker-machine ssh churrops3 "docker swarm join \
    --token=${manager_token} \
    --listen-addr $(docker-machine ip churrops3) \
    --advertise-addr $(docker-machine ip churrops3) \
    $(docker-machine ip churrops1)"

Validando se os serviços estão em execução

~# docker-machine ssh churrops1 docker node ls
ID                          HOSTNAME   STATUS AVAILABILITY  MANAGER STATUS
clt6obif88qc5rl0k3zjxd2co * churrops1  Ready  Active        Leader
fbmq1in2hdl07r35cgcr3m621   churrops2  Ready  Active        Reachable
cshas5e4ckaq784d4ycxws7kv   churrops3  Ready  Active        Reachable

>> Fazendo deploy da aplicação

Com todo o ambiente das máquinas e do Swarm preparados e funcionais vamos listar e carregar as variáveis do nosso node Leader do Swarm para o deploy da aplicação

~# docker-machine env churrops1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.112:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/churrops1"
export DOCKER_MACHINE_NAME="churrops1"
# Run this command to configure your shell: 
# eval $(docker-machine env churrops1)

~# eval $(docker-machine env churrops1)

Realizando o download do nosso compose e realizando o deploy da nossa Stack

~# mkdir churrops-lab && wget https://gist.githubusercontent.com/churrops/65a578fce7efb1fa699225e111bbc564/raw/deb922642c28cc3d5ff5b18398a02b2c78401160/docker-stack-traefik-churrops_lab.yml

~# docker stack deploy -c docker-stack-traefik-churrops_lab.yml churrops-app

Creating network churrops-app_churrops-net
Creating network churrops-app_default
Creating service churrops-app_web
Creating service churrops-app_visualizer
Creating service churrops-app_traefik
~# docker service ls
ID           NAME           MODE      REPLICAS      IMAGE     PORTS
6ujkuiisfubu churrops-app_web     replicated 3/3 emilevauge/whoami:latest          
hr2s81jh9yt5 churrops-app_traefik replicated 3/3 traefik:latest    *:80->80/tcp,*:443->443/tcp,*:8080->8080/tcp
hv4l8oxpzawo  churrops-app_visualizer replicated 1/1          dockersamples/visualizer:stable   *:8081->8080/tcp

>> Validando com o curl

No primeiro teste vamos fazer um curl no host da nossa aplicação, e veremos que a cada execução ele vai direcionar a requisição para um container diferente!

~# curl -H Host:whoami.churrops.lab http://$(docker-machine ip churrops1)

Hostname: 3c261bd2fe23
IP: 127.0.0.1
IP: 10.0.1.5
IP: 10.0.1.8
IP: 172.18.0.4
GET / HTTP/1.1
Host: whoami.churrops.lab
User-Agent: curl/7.47.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.255.0.2
X-Forwarded-Host: whoami.churrops.lab
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 5f67102cdbdf
X-Real-Ip: 10.255.0.2
~# curl -H Host:whoami.churrops.lab http://$(docker-machine ip churrops1)

Hostname: d1926fa15b7f
IP: 127.0.0.1
IP: 10.0.1.5
IP: 10.0.1.6
IP: 172.18.0.4
GET / HTTP/1.1
Host: whoami.churrops.lab
User-Agent: curl/7.47.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.255.0.2
X-Forwarded-Host: whoami.churrops.lab
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 5b8729b0f5a8
X-Real-Ip: 10.255.0.2

>> Acessando a aplicação pelo Browser

Você pode configurar um DNS por exemplo, ou simplesmente adicionar a entrada no arquivo /etc/hosts apontando para IP do seu manager.

No nosso caso vamos adicionar no arquivos /etc/hosts

~# echo $(docker-machine ip churrops1) whoami.churrops.lab >> /etc/hosts

Com isso basta acessar pelo browser: http://whoami.churrops.lab

validacao-browser

>> Visualizando a distribuição dos Containers

No service do Visualizer fizemos o bind da porta 8081 do nosso cluster para a porta 8080 do container, com isso para acessá-lo basta pegar o IP do seu node do Swarm na porta 8081, e com isso você pode visualizar a divisão dos containers entre os hosts.

Peguei o IP através do comando:

~# docker-machine ip churrops1
192.168.99.112

No browser o acesso ficou assim: http://192.168.99.112:8081

visualizer-swarm

>> Console do Traefik

Utilizando o IP do Host na porta 8080, podemos visualizar a console do Traefik que é onde podemos ter uma visão mais simples e objetiva do status da nossa aplicação, quais são os containers mapeados e como está o healhcheck.

traefik-web1

traefik-web2

>> Conclusão

Por hoje é isso pessoal, espero que com esse artigo tenham sido esclarecidas algumas dúvidas e gerado novas dúvidas, se esse é o seu caso, você está no caminho e o propósito do artigo foi atingido.

Curtiu o artigo? Não deixem de compartilhar com seus amigos nas suas redes sociais e vamos divulgar conhecimento!

Abraço!

>> Referências

https://docs.traefik.io/user-guide/swarm-mode/
https://github.com/containous/traefik/blob/master/examples/compose-traefik.yml

https://github.com/churrops/Meetup-Churrops/blob/master/ansible/swarm/templates/traefik-docker-compose.yml