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.6.2
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
- 443:443
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, el80
y el443
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 laapi
, conforme te he mostrado con la instruccióncurl 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 indicarinsecure: false
.Providers
. En este apartado defines los proveedores del servicio, que en este caso esDocker
. 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": "https://172.27.0.2:80"
}
],
"passHostHeader": true
},
"status": "enabled",
"usedBy": [
"whoami@docker"
],
"serverStatus": {
"https://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
Muy buenas, lo primero decirte que haces una labor con el podcast envidiable y lo segundo la duda:
En el paso donde dices que ejecutas la orden: curl -H Host:whoami.localhost https://localhost
A mi me da un error: curl: (7) Failed to connect to localhost port 443: Connection refused
Solo me funciona si la petición la hago así: curl -H Host:whoami.localhost http://localhost
Es decir, sustituyendo https por http
¿Estoy haciendo algo mal para que no me funcione por https?
Muchas gracias.