En este artículo os vamos a enseñar como instalar y configurar Traefik en un cluster de Docker (Swarm). Muchos os preguntaréis que es Traefik, tal y como lo definen sus creadores es un “Router Cloud con proxy inverso y balanceador de carga”. Lo bueno que tiene Traefik es que se puede integrar con Docker por lo cual puedes desplegar réplicas de tus servicios y automáticamente quedan configurado como backends en Traefik con lo cual puedes escalar tus servicios cómodamente sin tener que reconfigurar Traefik.
Para poder instalar Traefik lo primero que haremos es instalar nuestro cluster con Docker Swarm tal y como explicamos en este artículo “Docker Swarm en Ubuntu“, solo seguiremos ese artículo hasta el apartado “Configuración para Workers” incluido. A partir de ahí lo que haremos es ejecutar un Stack, para lo que no sepáis lo que es consiste en un fichero con un conjunto de instrucciones que desplega servicios y contenedores en Docker.
Desplegar Traefik
Ahora viene el momento mágico como les gusta decir desde Traefik, crearemos un fichero traefik-stack.yml con el siguiente contenido:
version: "3.3"
services:
traefik:
image: traefik
command: --web \
--docker \
--docker.swarmmode \
--docker.domain=traefik.kb \
--docker.watch \
--logLevel=DEBUG
networks:
- traefik-net
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /dev/null:/traefik.toml
deploy:
placement:
constraints: [node.role==manager]
portainer:
image: portainer/portainer
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "portainerdata:/data"
networks:
- traefik-net
deploy:
placement:
constraints: [node.role == manager]
labels:
- "traefik.enable=true"
- "traefik.port=9000"
- "traefik.docker.network=mystack_traefik-net"
- "traefik.frontend.rule=Host:portainer.traefik.kb"
ms1:
image: melvindave/spring-boot-example
networks:
- traefik-net
depends_on:
- mongodb
deploy:
replicas: 3
labels:
- "traefik.enable=true"
- "traefik.port=8080"
- "traefik.docker.network=mystack_traefik-net"
- "traefik.frontend.rule=Host:ms1.traefik.kb"
mongodb:
image: mongo
volumes:
- "mongodata:/data/db"
networks:
- traefik-net
deploy:
replicas: 1
ports:
- "27017:27017"
networks:
traefik-net:
volumes:
portainerdata:
mongodata:
Crearemos 3 registros DNS apuntando a la IP de nuestro “manager-01” para apuntar a los servicios desplegados: ms1.traefik.kb portainer.traefik.kb dashboard.traefik.kb.
Ahora desplegaremos nuestra Stack ejecuntado:
# docker stack deploy -c traefik-stack.yml mystack
Nos ha de devolver:
Creating service mystack_ms1
Creating service mystack_mongodb
Creating service mystack_traefik
Creating service mystack_portainer
¡Ya tenemos todo funcionando!
Primeros pasos con Traefik
Ahora que ya tenemos desplegado Traefik entraremos en nuestro navegador a http://dashboard.traefik.kb:8080/ veremos los Frontend y Backends desplegados para cada servicio.
Como podemos ver en la captura nuestro frontal ms1.traefik.kb tiene 3 backends, esto quiere decir que cuando alguien visite la web ms1.traefik.kb cargará desde uno de ellos. Traefik ya hace balanceo de carga y va repartiendo las visitas entre los backends, si un backend fallara enviaría las visitas a los otros 2. Desde la pestaña “Health” podemos comprobar que todo funcione.
Administrar replicas y servicios
Como habéis podido ver también hemos desplegado un servicio de Portainer, en este artículo hay más explicaciones sobre que permite hacer Portainer. Para este artículo entraremos a http://portainer.traefik.kb para adminsitrar backend -réplicas-. Supongamos que tenemos previsto que nuestra web “ms1.traefik.kb” tenga muchas visitas por algún motivo, podemos desplegar más réplicas desde Portainer. Cuando volvamos a las visitas normales podemos volver a reducir el número de réplicas. Os dejamos algunas capturas del proceso.
Como habéis podido ver es muy fácil desplegar servicios y backends , la ventaja de usar Traefik frente a otros servicios de alta disponibilidad como podría ser HAProxy es que se configura solo.
Puedes desplegar o eliminar backends en segundos, con otros servicios cada vez que añades o eliminas backends has de modificar la configuración.
En este artículo hemos hecho un ejemplo sencillo con una página estática, se pueden hacer configuraciones similares con WordPress, PHP,… También se puede configurar el tipo de balanceo, peso de cada backend, nº de conexiones,… podéis encontrar más información en la web de Traefik.
¿Lo has probado? ¡Déjanos tus comentarios! 🙂
El stack de este artículo ha sido obtenido y modificado a partir de Melvinvivas