3 पॉइंट द्वारा GN⁺ 2024-09-22 | 1 टिप्पणियां | WhatsApp पर शेयर करें

Kamal Proxy - न्यूनतम HTTP प्रॉक्सी जो ज़ीरो-डाउनटाइम डिप्लॉयमेंट को सपोर्ट करता है

सुविधाएँ

  • Kamal Proxy एक HTTP प्रॉक्सी है, जिसे ज़ीरो-डाउनटाइम डिप्लॉयमेंट को आसानी से ऑर्केस्ट्रेट करने के लिए डिज़ाइन किया गया है
  • Kamal Proxy के पीछे वेब एप्लिकेशन चलाने पर, चल रहे ट्रैफ़िक को रोके बिना बदलाव डिप्लॉय किए जा सकते हैं
  • यह एप्लिकेशन के किसी विशेष सहयोग के बिना भी काम कर सकता है
  • इसे Kamal के हिस्से के रूप में डिज़ाइन किया गया है, लेकिन इसे स्वतंत्र रूप से या अन्य डिप्लॉयमेंट टूल्स के साथ भी इस्तेमाल किया जा सकता है

संक्षिप्त अवलोकन

  • प्रॉक्सी इंस्टेंस चलाने के लिए kamal-proxy run कमांड का उपयोग करें
  • कोई configuration file नहीं है, लेकिन यदि डिफ़ॉल्ट सेटिंग्स एप्लिकेशन के लिए उपयुक्त नहीं हैं, तो विकल्प दिए जा सकते हैं
  • उदाहरण के लिए, यदि प्रॉक्सी को डिफ़ॉल्ट पोर्ट 80 के बजाय किसी दूसरे पोर्ट पर चलाना हो: kamal-proxy run --http-port 8080
  • सभी विकल्पों की सूची देखने के लिए kamal-proxy help run चलाएँ

ट्रैफ़िक रूटिंग

  • प्रॉक्सी के माध्यम से वेब एप्लिकेशन तक ट्रैफ़िक रूट करने के लिए, एप्लिकेशन इंस्टेंस को प्रॉक्सी में deploy करें
  • इंस्टेंस को डिप्लॉय करने पर वह प्रॉक्सी में उपलब्ध हो जाता है और पहले इस्तेमाल हो रहे इंस्टेंस को प्रतिस्थापित करता है
  • इंस्टेंस निर्दिष्ट करते समय hostname:port फ़ॉर्मेट का उपयोग करें
  • उदाहरण: kamal-proxy deploy service1 --target web-1:3000
  • प्रॉक्सी web-1:3000 को service1 सर्विस नाम से रजिस्टर करता है और तुरंत HTTP health check शुरू करता है
  • यदि इंस्टेंस तय समय के भीतर healthy नहीं होता, तो deploy कमांड डिप्लॉयमेंट रोक देता है और non-zero exit code लौटाता है
  • हर डिप्लॉयमेंट पहले से डिप्लॉय किए गए इंस्टेंस का पूरा ट्रैफ़िक अपने ऊपर ले लेता है
  • नया इंस्टेंस healthy होते ही सभी नए ट्रैफ़िक को उसी इंस्टेंस की ओर रूट किया जाता है
  • deploy कमांड तब तक प्रतीक्षा करता है जब तक पुराने इंस्टेंस का ट्रैफ़िक पूरी तरह drain नहीं हो जाता
  • इसलिए यदि deploy सफलतापूर्वक लौटता है, तो पुराने इंस्टेंस को हटाने पर भी चल रहे requests बाधित नहीं होते
  • नया इंस्टेंस healthy होने तक ट्रैफ़िक रूट नहीं किया जाता, और पुराना इंस्टेंस पूरी तरह drain होने के बाद हटाया जाता है, इसलिए ज़ीरो-डाउनटाइम डिप्लॉयमेंट संभव होता है

होस्ट-आधारित रूटिंग

  • होस्ट-आधारित रूटिंग के जरिए एक ही सर्वर पर कई एप्लिकेशन चलाए जा सकते हैं
  • इंस्टेंस डिप्लॉय करते समय यह निर्दिष्ट किया जा सकता है कि कौन-सा host ट्रैफ़िक सर्व करेगा
  • उदाहरण: kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com
  • इस तरह डिप्लॉय किया गया इंस्टेंस केवल निर्दिष्ट host के लिए ट्रैफ़िक प्राप्त करेगा
  • प्रत्येक host के लिए अलग इंस्टेंस डिप्लॉय करके, एक ही सर्वर पर बिना port conflict के कई एप्लिकेशन चलाए जा सकते हैं
  • कोई भी विशेष host एक समय में केवल एक सर्विस को ही रूट कर सकता है
  • उदाहरण के लिए, kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com के बाद यदि kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com चलाया जाए, तो error होगा
  • kamal-proxy remove service1 के बाद kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com चलाने पर यह सफल होगा

स्वचालित TLS

  • Kamal Proxy एप्लिकेशन के लिए TLS certificates को अपने आप प्राप्त और renew कर सकता है
  • इंस्टेंस डिप्लॉय करते समय --tls फ़्लैग जोड़कर इसे सक्षम किया जा सकता है
  • उदाहरण: kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com --tls

environment variables से run विकल्प सेट करना

  • Docker container में चलाने जैसी परिस्थितियों में, environment variables का उपयोग करके run विकल्प सेट करना सुविधाजनक हो सकता है
  • उदाहरण के लिए, HTTP port सेट करने के लिए: kamal-proxy run --http-port 8080 या HTTP_PORT=8080 kamal-proxy run
  • यदि environment variable किसी और चीज़ से टकराता है, तो उसे अलग दिखाने के लिए KAMAL_PROXY_ prefix जोड़ा जा सकता है
  • उदाहरण: KAMAL_PROXY_HTTP_PORT=8080 kamal-proxy run

बिल्ड

  • यदि Go environment सेट है, तो Kamal Proxy को लोकल में बिल्ड किया जा सकता है: make
  • या Docker container के रूप में बिल्ड किया जा सकता है: make docker

आज़माएँ

  • example फ़ोल्डर में Docker Compose configuration देखकर प्रॉक्सी कमांड्स को आज़माया जा सकता है

GN⁺ की संक्षिप्त टिप्पणी

  • Kamal Proxy ज़ीरो-डाउनटाइम डिप्लॉयमेंट को सपोर्ट करने वाला एक न्यूनतम HTTP प्रॉक्सी है, जो एप्लिकेशन के किसी विशेष सहयोग के बिना भी काम करता है
  • यह होस्ट-आधारित रूटिंग और स्वचालित TLS जैसी सुविधाएँ देता है, जिससे एक ही सर्वर पर कई एप्लिकेशन चलाए जा सकते हैं
  • environment variables के जरिए run विकल्प सेट किए जा सकते हैं, जो Docker जैसे वातावरण में उपयोगी है
  • ज़ीरो-डाउनटाइम डिप्लॉयमेंट के लिए यह ट्रैफ़िक को नए इंस्टेंस की ओर रूट करता है और पुराने इंस्टेंस का ट्रैफ़िक पूरी तरह drain होने तक प्रतीक्षा करता है
  • समान प्रकार की सुविधाएँ देने वाले प्रोजेक्ट्स में NGINX, HAProxy आदि शामिल हैं

1 टिप्पणियां

 
GN⁺ 2024-09-22
Hacker News टिप्पणियाँ
  • 'deploy' शब्द का इस्तेमाल भ्रमित करने वाला है

    • 'bind', 'intercept', 'proxy' जैसे शब्द ज़्यादा उपयुक्त लगते हैं
  • zero-downtime deployment के लिए पूरा सिस्टम बनाना हद से ज़्यादा है

    • Unix socket को सपोर्ट करने वाला app+web proxy भी zero-downtime deployment कर सकता है
  • Kamal proxy, Docker Swarm की समस्याओं को हल करने के लिए मौजूद है

    • Cloud 66 में Caddy और Traefik का इस्तेमाल किया गया था
  • यह जानने की जिज्ञासा है कि Kamal ने Swarm क्यों चुना

    • शायद simplicity की वजह से
    • complexity को छिपाया नहीं जा सकता, और आखिरकार अपना proxy बनाना पड़ता है
  • Kamal proxy को इस्तेमाल नहीं किया है, लेकिन support issues की वजह से संशय है

    • WebSockets, SSE, HTTP/3, अलग-अलग compression और encryption support की ज़रूरत है
  • यह ऐसा काम लगता है जो HAProxy आसानी से कर सकता है

    • इसमें hitless reload फीचर है
  • यह जानने की जिज्ञासा है कि क्या यह 'traffic pause' pattern को implement करता है

    • कुछ सेकंड के लिए traffic रोककर infrastructure changes किए जा सकते हैं
  • यह जानने की जिज्ञासा है कि zero-downtime deployment (ZDD) कैसे काम करता है

    • app के दो versions एक साथ चलते हैं, और नया traffic नए version की ओर route किया जाता है
    • यह जानने की जिज्ञासा है कि DB migration की समस्या को कैसे संभाला जाता है
  • Kamal 2 auto-SSL को support करेगा, और एक server पर कई apps को आसानी से चलाने देगा

  • इस्तेमाल करने का तरीका समझ में नहीं आता

    • उदाहरण के अनुसार 'web' service की 4 replicas शुरू की जाती हैं
    • zero-downtime deployment के लिए नए target पर deploy करना चाहिए
    • docker compose up --build --force-recreate web कमांड सब कुछ निरर्थक कर देती है
    • स्पष्ट निर्देशों की ज़रूरत है
  • यह जानने की जिज्ञासा है कि timeout सेट करने का कोई तरीका है या नहीं

  • यह NIH (Not Invented Here) syndrome है