Kamal Proxy - un proxy HTTP mínimo para despliegues sin interrupciones
Funcionalidades
- Kamal Proxy es un proxy HTTP diseñado para coordinar fácilmente despliegues sin interrupciones
- Si ejecutas una aplicación web detrás de Kamal Proxy, puedes desplegar cambios sin interrumpir el tráfico en curso
- Puede funcionar sin cooperación especial por parte de la aplicación
- Fue diseñado como parte de Kamal, pero puede usarse de forma independiente o junto con otras herramientas de despliegue
Resumen rápido
- Para ejecutar una instancia del proxy, usa el comando
kamal-proxy run
- No hay archivo de configuración, pero puedes especificar opciones si los valores predeterminados no se ajustan a tu aplicación
- Por ejemplo, para ejecutar el proxy en un puerto distinto del puerto predeterminado 80:
kamal-proxy run --http-port 8080
- Para ver la lista completa de opciones, ejecuta
kamal-proxy help run
Enrutamiento de tráfico
- Para enrutar tráfico a una aplicación web a través del proxy, se hace
deploy de una instancia de la aplicación en el proxy
- Al desplegar una instancia, esta queda disponible para el proxy y reemplaza la instancia que se estaba usando anteriormente
- Al especificar una instancia, se usa el formato
hostname:port
- Por ejemplo:
kamal-proxy deploy service1 --target web-1:3000
- El proxy registra
web-1:3000 con el nombre de servicio service1 y comienza de inmediato las verificaciones de estado HTTP
- Si la instancia no alcanza un estado saludable dentro de un tiempo determinado, el comando
deploy aborta el despliegue y devuelve un código de salida de error
- Cada despliegue recibe todo el tráfico de la instancia desplegada anteriormente
- Cuando la nueva instancia entra en estado saludable, todo el tráfico nuevo se enruta hacia esa instancia
- El comando
deploy espera hasta que el tráfico de la instancia anterior se haya drenado por completo
- Por lo tanto, si
deploy termina correctamente, se puede eliminar la instancia anterior sin interrumpir las solicitudes en curso
- El tráfico no se enruta hasta que la nueva instancia esté saludable, y como la anterior se elimina solo después de que su tráfico se drene por completo, es posible hacer despliegues sin interrupciones
Enrutamiento basado en host
- El enrutamiento basado en host permite ejecutar varias aplicaciones en el mismo servidor
- Al desplegar una instancia, puedes especificar el host al que dará servicio el tráfico
- Por ejemplo:
kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com
- Una instancia desplegada de esta forma solo recibirá tráfico para el host especificado
- Al desplegar una instancia única para cada host, puedes ejecutar varias aplicaciones en el mismo servidor sin conflictos de puertos
- Un host específico solo puede enrutar un servicio a la vez
- Por ejemplo, si ejecutas
kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com y luego kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com, se producirá un error
- Si ejecutas
kamal-proxy remove service1 y luego kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com, funcionará correctamente
TLS automático
- Kamal Proxy puede obtener y renovar automáticamente certificados TLS para tus aplicaciones
- Puede activarse agregando la bandera
--tls al desplegar una instancia
- Por ejemplo:
kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com --tls
Especificar opciones de run con variables de entorno
- En entornos como cuando se ejecuta dentro de un contenedor Docker, puede ser conveniente usar variables de entorno para especificar las opciones de
run
- Por ejemplo, para configurar el puerto HTTP:
kamal-proxy run --http-port 8080 o HTTP_PORT=8080 kamal-proxy run
- Si las variables de entorno entran en conflicto con otras, se pueden diferenciar agregando el prefijo
KAMAL_PROXY_
- Por ejemplo:
KAMAL_PROXY_HTTP_PORT=8080 kamal-proxy run
Build
- Si tienes configurado un entorno de Go, puedes compilar Kamal Proxy localmente con:
make
- O puedes compilarlo como contenedor Docker con:
make docker
Pruébalo
- Puedes revisar la configuración de Docker Compose en la carpeta de ejemplos para probar los comandos del proxy
Resumen de GN⁺
- Kamal Proxy es un proxy HTTP mínimo que admite despliegues sin interrupciones y funciona sin requerir cooperación especial de la aplicación
- Ofrece enrutamiento basado en host y TLS automático, lo que permite ejecutar varias aplicaciones en el mismo servidor
- Permite especificar las opciones de
run mediante variables de entorno, lo que resulta útil en entornos como Docker
- Para lograr despliegues sin interrupciones, enruta el tráfico a una nueva instancia y espera hasta que el tráfico de la instancia anterior se haya drenado por completo
- Entre los proyectos con funciones similares están NGINX y HAProxy
1 comentarios
Opiniones de Hacker News
El uso del término 'deploy' resulta confuso
Construir todo un sistema para lograr despliegues sin tiempo de inactividad es excesivo
Kamal Proxy existe para resolver los problemas de Docker Swarm
Da curiosidad por qué Kamal eligió Swarm
No he usado Kamal Proxy, pero soy escéptico por temas de soporte
Parece el tipo de cosa que HAProxy puede hacer fácilmente
Me pregunto si implementa el patrón de 'pausa temporal del tráfico'
Me pregunto cómo funciona ZDD (zero-downtime deployment)
Kamal 2 va a soportar auto-SSL y permitirá ejecutar fácilmente varias apps en un solo servidor
No queda claro cómo se usa
docker compose up --build --force-recreate webinvalida todo esoMe pregunto si hay alguna forma de configurar timeouts
Es síndrome NIH (Not Invented Here)