3 points par GN⁺ 2024-09-22 | 1 commentaires | Partager sur WhatsApp

Kamal Proxy - prend en charge les déploiements sans interruption avec un proxy HTTP minimal

Fonctionnalités

  • Kamal Proxy est un proxy HTTP conçu pour orchestrer facilement des déploiements sans interruption
  • En exécutant une application web derrière Kamal Proxy, il est possible de déployer des changements sans interrompre le trafic en cours
  • Il peut fonctionner sans coopération particulière de l’application
  • Il a été conçu comme une partie de Kamal, mais peut être utilisé de manière autonome ou avec d’autres outils de déploiement

Aperçu rapide

  • Pour lancer une instance du proxy, utilisez la commande kamal-proxy run
  • Il n’existe pas de fichier de configuration, mais il est possible de préciser des options si les valeurs par défaut ne conviennent pas à l’application
  • Par exemple, pour exécuter le proxy sur un port différent du port 80 par défaut : kamal-proxy run --http-port 8080
  • Pour voir la liste complète des options, exécutez kamal-proxy help run

Routage du trafic

  • Pour router le trafic vers une application web via le proxy, il faut deploy une instance de l’application vers le proxy
  • Lorsqu’une instance est déployée, elle devient disponible pour le proxy et remplace l’instance précédemment utilisée
  • Lors de la désignation d’une instance, utilisez le format hostname:port
  • Par exemple : kamal-proxy deploy service1 --target web-1:3000
  • Le proxy enregistre web-1:3000 sous le nom de service service1 et démarre immédiatement les vérifications d’état HTTP
  • Si l’instance ne devient pas saine dans le délai imparti, la commande deploy interrompt le déploiement et renvoie un code de sortie d’échec
  • Chaque déploiement reprend l’intégralité du trafic de l’instance précédemment déployée
  • Une fois la nouvelle instance saine, tout le nouveau trafic est routé vers cette instance
  • La commande deploy attend que le trafic de l’ancienne instance soit entièrement drainé
  • Ainsi, si deploy se termine avec succès, l’ancienne instance peut être supprimée sans interrompre les requêtes en cours
  • Aucun trafic n’est routé tant que la nouvelle instance n’est pas saine, et l’ancienne instance n’est supprimée qu’une fois son trafic entièrement drainé, ce qui permet des déploiements sans interruption

Routage basé sur l’hôte

  • Le routage basé sur l’hôte permet d’exécuter plusieurs applications sur le même serveur
  • Lors du déploiement d’une instance, il est possible de spécifier l’hôte qui recevra le trafic
  • Par exemple : kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com
  • Une instance déployée de cette manière ne reçoit du trafic que pour l’hôte spécifié
  • En déployant une instance distincte pour chaque hôte, il est possible d’exécuter plusieurs applications sur le même serveur sans conflit de ports
  • Un hôte donné ne peut router qu’un seul service à la fois
  • Par exemple, si vous exécutez kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com puis kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com, une erreur se produit
  • En revanche, après kamal-proxy remove service1, l’exécution de kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com réussit

TLS automatique

  • Kamal Proxy peut obtenir et renouveler automatiquement des certificats TLS pour les applications
  • Il est possible d’activer cette fonctionnalité en ajoutant le flag --tls lors du déploiement d’une instance
  • Par exemple : kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com --tls

Définir les options de run via des variables d’environnement

  • Dans certains environnements, comme lors d’une exécution dans un conteneur Docker, il peut être pratique d’utiliser des variables d’environnement pour définir les options de run
  • Par exemple, pour définir le port HTTP : kamal-proxy run --http-port 8080 ou HTTP_PORT=8080 kamal-proxy run
  • Si une variable d’environnement entre en conflit avec d’autres, il est possible de la distinguer à l’aide du préfixe KAMAL_PROXY_
  • Par exemple : KAMAL_PROXY_HTTP_PORT=8080 kamal-proxy run

Build

  • Si l’environnement Go est configuré, il est possible de compiler Kamal Proxy en local : make
  • Ou de le compiler via un conteneur Docker : make docker

Essayer

  • Dans le dossier d’exemple, vous pouvez consulter la configuration Docker Compose pour tester les commandes du proxy

Résumé de GN⁺

  • Kamal Proxy est un proxy HTTP minimal prenant en charge les déploiements sans interruption, et fonctionne sans coopération particulière de l’application
  • Il propose le routage basé sur l’hôte et le TLS automatique, permettant d’exécuter plusieurs applications sur le même serveur
  • Les options de run peuvent être définies via des variables d’environnement, ce qui est utile dans des environnements comme Docker
  • Pour assurer des déploiements sans interruption, il route le trafic vers la nouvelle instance et attend que le trafic de l’ancienne soit entièrement drainé
  • Parmi les projets offrant des fonctions similaires, on peut citer NGINX et HAProxy

1 commentaires

 
GN⁺ 2024-09-22
Avis Hacker News
  • L’usage du terme « deploy » prête à confusion

    • des termes comme « bind », « intercept » ou « proxy » sembleraient plus appropriés
  • Construire tout un système pour des déploiements sans interruption semble excessif

    • des déploiements sans interruption sont aussi possibles avec une application prenant en charge les sockets Unix + un proxy web
  • Le proxy Kamal existe pour résoudre les problèmes de Docker Swarm

    • chez Cloud 66, ils utilisaient Caddy et Traefik
  • On peut se demander pourquoi Kamal a choisi Swarm

    • c’est peut-être pour sa simplicité
    • la complexité ne peut pas être masquée, et cela conduit finalement à créer son propre proxy
  • Je n’ai pas utilisé le proxy Kamal, mais je reste sceptique à cause des questions de prise en charge

    • prise en charge nécessaire de WebSockets, SSE, HTTP/3, ainsi que de diverses méthodes de compression et de chiffrement
  • Cela ressemble à quelque chose que HAProxy peut faire facilement

    • il dispose d’une fonctionnalité de hitless reload
  • Je me demande s’il implémente le modèle de « pause temporaire du trafic »

    • on peut suspendre le trafic pendant quelques secondes pour effectuer des changements d’infrastructure
  • Je me demande comment fonctionne le déploiement sans interruption (ZDD)

    • deux versions de l’application tournent en même temps, et le nouveau trafic est routé vers la nouvelle version
    • je me demande comment sont gérés les problèmes de migration de base de données
  • Kamal 2 prendra en charge l’auto-SSL et facilitera l’exécution de plusieurs applications sur un seul serveur

  • Je ne comprends pas comment l’utiliser

    • d’après l’exemple, cela démarre 4 réplicas du service « web »
    • pour un déploiement sans interruption, il faut déployer vers une nouvelle cible
    • la commande docker compose up --build --force-recreate web annule tout cela
    • il faut des instructions plus claires
  • Je me demande s’il existe un moyen de configurer des timeouts

  • C’est du syndrome NIH (Not Invented Here)