3 puntos por GN⁺ 2024-09-22 | 1 comentarios | Compartir por WhatsApp

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

 
GN⁺ 2024-09-22
Opiniones de Hacker News
  • El uso del término 'deploy' resulta confuso

    • Términos como 'bind', 'intercept' y 'proxy' parecen más adecuados
  • Construir todo un sistema para lograr despliegues sin tiempo de inactividad es excesivo

    • Con una app + proxy web que soporte sockets Unix también se pueden hacer despliegues sin interrupciones
  • Kamal Proxy existe para resolver los problemas de Docker Swarm

    • En Cloud 66 usaban Caddy y Traefik
  • Da curiosidad por qué Kamal eligió Swarm

    • Tal vez fue por simplicidad
    • La complejidad no se puede ocultar y al final terminan creando su propio proxy
  • No he usado Kamal Proxy, pero soy escéptico por temas de soporte

    • Hace falta soporte para WebSockets, SSE, HTTP/3 y distintos métodos de compresión y cifrado
  • Parece el tipo de cosa que HAProxy puede hacer fácilmente

    • Tiene la función de hitless reload
  • Me pregunto si implementa el patrón de 'pausa temporal del tráfico'

    • Se puede pausar el tráfico por unos segundos para realizar cambios en la infraestructura
  • Me pregunto cómo funciona ZDD (zero-downtime deployment)

    • Dos versiones de la app corren al mismo tiempo y el tráfico nuevo se enruta a la versión nueva
    • Me pregunto cómo manejan el problema de las migraciones de base de datos
  • 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

    • Según el ejemplo, inicia 4 réplicas del servicio 'web'
    • Para un despliegue sin tiempo de inactividad, debería desplegarse hacia un nuevo target
    • El comando docker compose up --build --force-recreate web invalida todo eso
    • Hacen falta instrucciones claras
  • Me pregunto si hay alguna forma de configurar timeouts

  • Es síndrome NIH (Not Invented Here)