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.
¿Que es lo que sucede cuando se llama a un servicio de los que hayas levantado detrás de Traefik?. Cualquier llamada que llegue, el primer paso es conectarse a un punto de entrada, que en la mayor parte de las veces se corresponderá con un puerto, aunque no siempre. A partir, de aquí en función de la ruta que hayas pasado, y siguiendo las reglas que hayas establecido se dirigirá a uno u a otro servicio. Incluso, si has establecido algún tipo de mecanismo intermedio, middleware, es probable que se apliquen determinadas transformaciones, antes de que lleguen al servicio al que querías llegar. Aquí nos vamos a quedar en los entrypoints en Traefik. Al principio de todo.
Como ves, es un largo viaje, desde que llamas a un servicio de Traefik, hasta que llega a su destino. Un viaje, que pasa por diferentes etapas, hasta llegar a su destino. No las pierdas de vista, en ningún momento, porque te van a dar una visión global, de todo el proceso, y te simplificarán considerablemente la comprensión del mismo.
EntryPoints en Traefik o puntos de entrada
Como te decía en la introducción, el viaje desde que llamas a un servicio detrás de Traefik, hasta que esa llamada llega a su destino, pasa por cuatro puntos,
- Los entrypoints o puntos de entrada. Básicamente se refiere a los elementos que están escuchando por el tráfico entrante. En general a los puertos de llegada, pero no siempre. Digamos que son las orejas de Traefik. Por ejemplo, los puntos de entrada en mi configuración están definidos de la siguiente forma en el archivo
traefik.yml
entryPoints:
http:
address: ":80"
http:
redirections:
entryPoint:
to: https
https:
address: ":443"
mtcp:
address: ":64738"
mudp:
address: ":64738/udp"
Si te fijas, los puntos de entrada están definidos por el puerto correspondiente, y en su caso, indicando si se trata de UDP
.
- Los routers o enrutamientos son los que te permiten redirigir el tráfico desde el origen, tu llamada, al destino, tu servicio. La operativa es analizar tu llamada, y en función de una serie de reglas decidir cual es el camino mas adecuado. En el caso habitual, tu tienes definido el enrutamiento a través de los labels o etiquetas de tu archivo
docker-compose.yml
, pero, en el caso de que tu provider que veremos mas adelante, sea un archivo, lo podrías tener de la siguiente forma definido,
routers:
router0:
entryPoints:
- https
service: servicio1
rule: Host(`servicio1.tuservidor.com`)
tls:
certResolver: myresolver
En el caso mas habitual, todo esto lo defines en el apartado de etiquetas del archivo docker-compose.yml
de la configuración de cada servicio. Eso, si de forma parecida,
labels:
- traefik.http.routers.webdav.entryPoints=https
- traefik.http.routers.webdav.rule=Host(`wevdav.tuservidor.com`)
- traefik.http.routers.webdav.tls=true
- traefik.http.routers.webdav.certReslver=myresolver
- El middleware o capa intermedia te permite realizar determinadas operaciones, como puedes ser algo tan sencillo como limitar el número de llamadas por segundo, como puedes ver en el siguiente ejemplo,
labels:
- traefik.http.middlewares.webdav.ratelimit.average=100
- traefik.http.middlewares.webdav.ratelimit.burst=50
Los EntryPoints en Traefik
Los entryPoins en Traefik son los puntos de entrada desde la red a tu servicio. Básicamente definen el puerto en el que se recibe la llamada y el protocolo que se utiliza, TCP
, por defecto, o UDP
, en cuyo caso tendrás que declararlo de forma explícita. Un ejemplo, similar al anterior,
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
mumble:
address: ":64738/udp"
Pero además de definir un puerto, también tienes la posibilidad de definir directamente una IP
a la que escuchar, por ejemplo,
entryPoints:
special:
address: "192.168.1.136:8080"
O incluso, puedes definir una url
en lugar de una dirección IP
, aunque también puedes definir perfectamente una IPv6
.
Posibles opciones y configuraciones
Con esto que has visto hasta el momento es suficiente para realizar todas tus operaciones con Traefik. A partir de aquí, esto son posibles configuraciones que te pueden ser de utilidad en determinados casos o situaciones. Pero, como te digo, con la configuración que ves un poco mas arriba, tienes mas que suficiente.
Forwarded Headers
Es posible configurar Traefik para confiar en la información enviada en el encabezado C-Forwarded-*
, cuando viene de determinadas IPs
, como por ejemplo, puedes ver en el siguiente ejemplo,
entryPoints:
web:
address: ":80"
forwardedHeaders:
trustedIPs:
- "192.168.1.145"
O también la posibilidad de confiar en todos, utilizando esta configuración,
entryPoints:
web:
address: ":80"
forwardedHeaders:
insecure: true
De la misma forma que se definen los forwarded headers es posible también pasar el protocolo Proxy. Para esto, en lugar de definir forwardedHeaders
, tienes que definir proxyProtocol
.
Malditos timeouts
Es posible definir timeouts
para las peticiones que se realizan a Traefik, pero ten en cuenta, que esta configuración no tiene ningún efecto sobre los puntos de entrada con protocolo UDP
.
Así tienes los siguientes timeouts
a definir,
- el
readTimeout
de lectura, es decir el tiempo en leer por completo la petición, incluyendo el cuerpo de la misma. Si lo estableces como0
, quiere decir, que no haytimeout
, como es lógico. De otra forma si no indicas unidades serán segundos, pero puedes indicarm
para minutos,h
para horas y mas. Por defecto el timeout que hay establecido es0s
. writeTimeout
es el tiempo que transcurre desde el final de la lectura hasta que se devuelve la respuesta. La configuración es exactamente la misma que para elreadTimeout
.- el tiempo de espera o
idleTimeout
es la máxima duración, y está definida igual que en los casos anteriores.
entryPoints:
web:
address: ":80"
transport:
respondingTimeouts:
readTimeout: 50
writeTimeout: 50
idleTimeout: 1m
Opciones HTTP
Es posible definir una serie de opciones realmente interesantes, que probablemente te ahorrarán trabajo. La primera de estas opciones es la redirección. Esto lo puedes hacer como en el siguiente ejemplo,
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
Además también puedes definir que la redirección es permantente, añadiendo la opción permanent: true
, o la prioridad del enrutamiento generado, con la clave priority
.
También tienes la posibilidad de definir la configuración tls
por defecto, para que no la tengas que aplicar a todos y cada uno de los router
asociado. Como por ejemplo,
entryPoints:
websecure:
address: ":443"
http:
tls:
certResolver: myresolver
Conclusión
Por concluir, como ves al final esto de los entryPoints, en la mayoría de los casos se resume en una configuración tan sencilla como la que has estado viendo a lo largo de todo el capítulo, y que se puede resumir en la siguiente,
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
Tan sencillo como esto, el resto, lo puedes obviar en la mayoría de los casos. Recuerda que la instalación de Traefik, está compuesta de al menos dos archivos. Por un lado el docker-compose y por el otro el archivo traefik.yml, que es donde iría, precisamente, esta configuración.
Imagen de portada de Dima Pechurin en Unsplash