Primeros pasos con Traefik

Este es uno de los capítulos del tutorial Traefik, mucho mas que un proxy inverso. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

Una vez visto que es Traefik, y los conceptos básicos, llega el momento de adentrarse y comenzar a exprimirlo. Es necesario materializar todos los conceptos vistos, y ver exactamente en que se traduce cada uno de ellos, y como puedes sacarle partido. Así, el objetivo de este capítulo es poner en marcha Traefik, con algunos servicios para que veas como se configura tanto este enrutador, como cada uno de los servicios que levantes. Este capítulo no es ni mas ni menos que un primeros pasos con Traefik.

No solo verás como trabajar con varios servicios bajo Traefik, sino también como levantar varias instancias de un mismo servicio, y como Traefik, se encarga de balancear el tráfico hacia estas diferentes instancias.

Pero, que no te asuste nada de lo que estás leyendo, porque vas a ver que es tremendamente sencillo, y que Traefik, te abre todo un mundo de opciones y posibilidades, que van mas allá de un simple proxy inverso.

Primeros pasos con Traefik

Primeros pasos con Traefik

En el capítulo anterior te mostré como podías instalar Traefik en un contenedor y levantarlo con una configuración mínima y básica. En estos primeros pasos con Traefik, continuo con la misma configuración que viste en el capítulo anterior.

version: '3'

services:
  reverse-proxy:
    image: traefik:v2.3
    container_name: traefik
    ports:
      - 80:80
      - 8080:8080
    volumes:
      - ./traefik.yml:/etc/traefik/traefik.yml
      - /var/run/docker.sock:/var/run/docker.sock

Donde el archivo traefik.yml tiene el siguiente contenido,

entryPoints:
  web:
    address: :80
  websecure:
    address: :443
api:
  insecure: true
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"

El siguiente paso es levantar el contenedor, para esto, ejecuta la siguiente instrucción,

docker-compose up -d

Ya lo tienes levantado, como viste en el capítulo anterior. Puedes comprobarlo ejecutando la siguiente instrucción,

curl localhost:8080/api/rawdata

Añadamos un servicio

Ahora toca añadir un nuevo servicio. Para esto tienes que editar el archivo docker-compose.yml. No te preocupes en detener Traefik, no es necesario que lo hagas conforme vas a ver mas adelante.

Este nuevo servicio que vas a añadir es un servidor web Nginx con PHP lo que te va a permitir ver directamente en una página web información sobre la instancia que has levantado.

Para esto crea un Dockerfile con el siguiente contenido,

FROM jmcarbo/nginx-php-fpm:latest
COPY index.php /usr/share/nginx/html

Además tienes que crear el archivo index.php con el siguiente contenido,

<!doctype html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title></title>
    </head>
    <body>
        <h1>Este es un ejemplo</h1>
        <?php echo "Hostname: ".gethostname(); ?>
    </body>
</html>

Este es un sencillo archivo PHP para poder ver el nombre del host de la instancia correspondiente.

Ahora toca modificar el archivo docker-compose.yml añadiendo la parte correspondiente a este servicio. Para ello, añadimos las siguientes líneas,

  sample:
    build: .
    restart: unless-stopped
    labels:
      - "traefik.http.routers.sample.entrypoints=web"
      - "traefik.http.routers.sample.rule=Path(`/`)"

Fíjate que no le he definido el container_name, la razón para esto te la comentaré mas adelante.

Ya puedes levantar este nuevo servicio. Para ello tan solo tienes que ejecuta la siguiente instrucción,

docker-compose up -d sample

Ahora te toca comprobar que todo está funcionando correctamente. Para esto abre un navegador y apunta a la url donde estás corriendo Traefik. Como seguramente no tienes todavía un FQDN, tendrás que apuntar a la IP. Si no conoces la ip, ejecuta ip a.

Si todo ha ido bien, en el navegador tienes que ver algo como lo que te muestro a continuación,

Este es un ejemplo
Hostname: fd3f38fdc3b5

Como te puedes imaginar se tiene que mostrar formateado, no como en el ejemplo anterior,que no tiene ningún formato.

Algunas ideas básicas

Como te comenté en la introducción la ventaja de Traefik frente a otros balanceadores de carga, es que permite cargar la configuración directamente desde la información aportada por el propio servicio que queremos levantar.

En este caso, esta información se la pasamos mediante el uso de etiquetas, labels. Para el ejemplo en cuestión, las tres etiquetas son,

- "traefik.enable=true"
- "traefik.http.routers.sample.entrypoints=web"
- "traefik.http.routers.sample.rule=Path(`/`)"
  • La primera línea habilita Traefik para este servicio
  • En el caso de la segunda línea se indica el punto de entrada al servicio. Recuerda que en el archivo traefik.yml hemos definido dos puntos de entrada web y websecure. La entrada web apunta al puerto 80 que es el que estoy utilizando justo en este momento.
  • Por último, se define la regla que establece como ir a cada uno de los servicios. En este caso, al apuntar a / se irá al servicio en cuestión.

En los siguientes capítulos del tutorial profundizaré en estos aspectos.

Mas instancias

En este ejemplo, realmente el balanceador solo balancea sobre una instancia. Sin embargo, podemos añadir mas instancias para ver como se comporta nuestro servicio. Esto, lo puedes hacer fácilmente sin necesidad de modificar el archivo docker-compose.yml. Tan solo tienes que ejecutar la siguiente instrucción,

docker-compose up -d --scale sample=4

En este caso he levantado cuatro instancias en total del servicio sample. ¿Como comprobar que hay cuatro instancias levantadas?. Pues de la misma forma que lo has hecho hasta el momento. Tienes dos opciones. La primera es consultar a la api,

curl localhost:8080/api/rawdata | jq

Recuerda que jq solo lo estoy utilizando para facilitar la interpretación de los resultados que me vuelca la api. En este caso es algo como lo que ver a continuación,

"sample-traefik@docker": {
  "loadBalancer": {
    "servers": [
      {
        "url": "https://172.25.0.4:80"
      },
      {
        "url": "https://172.25.0.5:80"
      },
      {
        "url": "https://172.25.0.6:80"
      },
      {
        "url": "https://172.25.0.2:80"
      }
    ],
    "passHostHeader": true
  },
  "status": "enabled",
  "usedBy": [
    "sample@docker"
  ],
  "serverStatus": {
    "https://172.25.0.2:80": "UP",
    "https://172.25.0.4:80": "UP",
    "https://172.25.0.5:80": "UP",
    "https://172.25.0.6:80": "UP"
  }
},

Igualmente, puedes ir a tu navegador y visitar la IP de tu servidor. Verás que te muestra lo mismo que cuando solo habías levantado una instancia. Sin embargo, si recargas la página, verás que cambia el hostname, y así tantas veces como instancias del servicio hayas levantado. Esto mismo lo puedes hacer desde el terminal ejecutando curl localhost.

O mejor todavía, puedes ejecutar lo siguiente que te devolverá directamente el hostname de cada una de las instancias,

curl -s localhost | grep Hostname | awk '{print $2}'

Para reducir el número de instancias, lo tienes que hacer de la misma forma,

docker-compose up -d --scale sample=1

para el caso de que solo quieras dejar una instancia. Y si quieres detener absolutamente todas las instancias, en ese caso tienes que ejecutar la siguiente instrucción,

docker-compose up -d --scale sample=0

Si lo quieres detener todo entonces, simplemente, docker-compose down

Conclusiones

Con este capítulo del tutorial, ya has dado tus primeros pasos con Traefik, y te has iniciado en un maravilloso mundo. No solo has levantado tu primer servicio, sino que además has podido levantar varias instancias de ese servicio, y has utilizado Traefik para balancear entre cada una de las instancias.

En el siguiente capítulo te introducirás en el mundo del descubrimiento, es decir, como Traefik encuentra cada uno de los servicios que están corriendo.


Imagen de portada de Bruno Nascimento en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *