>> 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.
>> 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
>> 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
>> 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.
>> 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
08/11/2017 at 11:21 pm
Sem palavras Rodrigo, muito bom, bem explicativo, superou a própria documentação do traefik!
CurtirCurtido por 1 pessoa
17/04/2018 at 4:18 am
Muito bom o artigo!!
Talvez você possa me dar uma luz…
Eu tenho um Websocket rodando via swarm, quando eu aumento o número de replicas
os sockets não se comunicão entre si, ou seja, cada um cai em uma replica…
Eu faço o proxy com o nginx…
Tem alguma idéia de como posso fazer isso funcionar?
CurtirCurtir
31/05/2018 at 8:21 pm
Desculpa a demora na resposta man, eu precisaria validar e testar essa questão, de qualquer forma, segue o link do nosso grupo no Telegram lá tem várias pessoas em uma comunidade bem ativa, acredito que abrindo uma discussão por conseguiremos achar uma resposta de forma mais prática!
https://t.me/churrops
Abraço!
CurtirCurtir