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 टिप्पणियां
Hacker News टिप्पणियाँ
'deploy' शब्द का इस्तेमाल भ्रमित करने वाला है
zero-downtime deployment के लिए पूरा सिस्टम बनाना हद से ज़्यादा है
Kamal proxy, Docker Swarm की समस्याओं को हल करने के लिए मौजूद है
यह जानने की जिज्ञासा है कि Kamal ने Swarm क्यों चुना
Kamal proxy को इस्तेमाल नहीं किया है, लेकिन support issues की वजह से संशय है
यह ऐसा काम लगता है जो HAProxy आसानी से कर सकता है
यह जानने की जिज्ञासा है कि क्या यह 'traffic pause' pattern को implement करता है
यह जानने की जिज्ञासा है कि zero-downtime deployment (ZDD) कैसे काम करता है
Kamal 2 auto-SSL को support करेगा, और एक server पर कई apps को आसानी से चलाने देगा
इस्तेमाल करने का तरीका समझ में नहीं आता
docker compose up --build --force-recreate webकमांड सब कुछ निरर्थक कर देती हैयह जानने की जिज्ञासा है कि timeout सेट करने का कोई तरीका है या नहीं
यह NIH (Not Invented Here) syndrome है