Instalación de Traefik

Traefik, mucho mas que un proxy inverso

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 ya has visto lo que es Traefik y las posibilidades que te ofrece, el siguiente paso es instalarlo para comenzar a trabajar con este proxy inverso. En particular, y dado que este tutorial está orientado a contenedores, la instalación la voy a realizar igualmente para contenedores. Así que en este capítulo del tutorial verás como realizar la instalación de Traefik

Si no conoces Docker, te recomiendo que realices el tutorial de Docker antes de adentrarte con Traefik, o al menos que le des un primer vistazo, porque de lo contrario, es posible que te pierdas.

En cuanto a la instalación de Traefik, comenzaré por instalar docker y docker-compose, aunque esto está explicado en el tutorial de Docker que he comentado anteriormente.

Instalación de Traefik

Requisitos

Indicar que para todos los ejemplos que encontrarás en este tutorial voy a utilizar un VPS de Ubuntu en clouding.io. De la misma forma lo podrías realizar en cualquier otro proveedor o en una Raspberry, esto es a gusto del consumidor.

De la misma forma, he utilizado Ubuntu como distribución, como podría haber utilizado cualquier otra distribución. En particular, para este tutorial, estoy utilizando Ubuntu 20.04.

Imprescindible

Como te he indicado en la introducción, lo primero es instalar Docker y docker-compose. Para ello, tienes que ejecutar las siguientes instrucciones,

sudo apt install docker.io

Y para docker-compose,

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Si quieres utilizar docker con tu usuario, necesitarás añadir a tu usuario al grupo docker para lo que tienes que ejecutar las siguientes instrucciones,

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

El último paso es levantar tu primer contenedor para asegurarte que todo ha ido correctamente. Para ello, ejecuta la siguiente instrucción,

docker run hello-world

Un último paso, necesario si quieres que Docker se inicie con el arranque de tu máquina. Este paso consiste en ejecutar la siguiente instrucción,

sudo systemctl enable docker

Instalar Traefik

Existen diferentes formas y maneras de instalar Traefik. Desde la opción de instalarlo desde sus binarios o incluso compilarlo desde el código fuente a utilizar la imagen Docker oficial. En este caso yo me decanto por esta opción, por utilizar la imagen oficial de Docker.

Por supuesto, es posible ejecutarlo directamente con la siguiente instrucción,

docker run -d -p 8080:8080 -p 80:80 \
           -v $PWD/traefik.yml:/etc/traefik/traefik.yml \
           traefik:v2.3

En este caso el archivo traefik.yml tiene que tener como mínimo el siguiente contenido,

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

Aunque yo, por comodidad, prefiero utilizar un archivo docker-compose, como el que te muestro a continuación,

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

Probando traefik

Llegados a este punto, tienes que probar Traefik, y ver que está funcionando correctamente. Para ello simplemente tienes que probar a ejecutar la siguiente instrucción,

curl localhost:8080/api/rawdata

Esto mismo lo puedes ejecutar desde un navegador, para ver el resultado que te arroja. En el caso de que utilices Firefox, te recomiendo que le instales el complemento JSON Lite, que te muestra el resultado de esta llamada de una forma mucho mas limpia.

Primeros pasos con la configuración

Antes de profundizar en Traefik, demos un vistazo al archivo de configuración, para de esta forma asentar los conceptos que viste en el capítulo de introducción.

El archivo de configuración se encuentra en /etc/traefik/traefik.yml, aunque también puede ser .toml. En particular, me he decantado por un archivo de tipo yaml porque me encuentro mas cómodo trabajando con ellos. En el docker-compose.yml he mapeado el archivo donde tengo la configuración a ese archivo.

Dentro de este archivo de configuración, encuentras tres apartados, aunque como veremos mas adelante, la configuración de Traefik puede tener mas apartados de los que te muestro en este primer ejemplo,

  • entryPoints indica los puntos de entrada. En este caso, están indicado los dos puertos por defecto, el 80 y el 443 para conexiones seguras. En el caso de que necesites mas puertos este es el lugar correcto para hacerlo.
  • api, en este apartado tienes que especificar todo lo relativo a la api de información de Traefik. Aquí puedes habilitar las llamadas a la API, así como el acceso al tablero de control, dashboard. En el caso de este ejemplo, lo he dejado como insecure, para poder hacer llamadas directas a la api, conforme te he mostrado con la instrucción curl localhost:8080/api/rawdata. Este método de acceder a la api no es seguro, y no deberías utilizarlo. En capítulos posteriores te mostraré como hacerlo de forma segura. Si quieres deshabilitarlo simplemente tienes que indicar insecure: false.
  • Providers. En este apartado defines los proveedores del servicio, que en este caso es Docker. Además defines aquellos parámetros necesarios para el correcto funcionamiento de cada uno de los proveedores.

El primer servicio

Con el fin de exprimir un poquito mas esta primera instalación de Traefik, edita el docker-compose.yml y añade lo siguiente,

whoami:
  image: traefik/whoami
  labels:
    - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"

Ahora ejecuta esta instrucción,

curl -H Host:whoami.localhost http://localhost

Verás que te devuelve algo como lo que te muestro a continuación,

Hostname: edb8275dc269
IP: 127.0.0.1
IP: 172.27.0.2
RemoteAddr: 172.27.0.3:48396
GET / HTTP/1.1
Host: whoami.localhost
User-Agent: curl/7.68.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.27.0.1
X-Forwarded-Host: whoami.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: b46dd85c3fdc
X-Real-Ip: 172.27.0.1

Aquí puedes ver hostname, y otros detalles interesantes relativos a la instancia que se está ejecutando. Si ejecutas de nuevo curl localhost:8080/api/rawdata | jq, verás que obtienes algo como,

"whoami-traefik@docker": {
  "loadBalancer": {
    "servers": [
      {
        "url": "http://172.27.0.2:80"
      }
    ],
    "passHostHeader": true
  },
  "status": "enabled",
  "usedBy": [
    "whoami@docker"
    Fíjate que no le he definido el iccontainer_name, la razón para esto te la comentaré mas adelante.
    Fíjate que no le he definido el iccontainer_name, la razón para esto te la comentaré mas adelante.
  ],
  "serverStatus": {
    "http://172.27.0.2:80": "UP"
  }
}

Aquí puedes ver como se asocia el contenedor whoami con la IP 172.27.0.2 que has obtenido en la llamada anterior.

Si te fijas el curl que he realizado anteriormente lo he enrutado con jq para mostrar el resultado de forma mas humana. Si no conoces jq y todas las posibilidades que ofrece, te recomiendo que le des un vistazo al artículo sobre tratar archivos json en Bash.


Imagen de portada de Josue Isai Ramos Figueroa en Unsplash

Deja una respuesta

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