Kamal Proxy - รองรับการดีพลอยแบบไม่หยุดชะงักด้วย HTTP พร็อกซีแบบมินิมัล
ความสามารถ
- Kamal Proxy เป็น HTTP พร็อกซีที่ออกแบบมาเพื่อช่วยประสานการดีพลอยแบบไม่หยุดชะงักได้อย่างง่ายดาย
- หากรันเว็บแอปพลิเคชันไว้หลัง Kamal Proxy ก็สามารถดีพลอยการเปลี่ยนแปลงได้โดยไม่ขัดจังหวะทราฟฟิกที่กำลังดำเนินอยู่
- สามารถทำงานได้โดยไม่ต้องให้อะปพลิเคชันรองรับอะไรเป็นพิเศษ
- แม้ออกแบบมาให้เป็นส่วนหนึ่งของ Kamal แต่ก็สามารถใช้งานแยกเดี่ยวหรือใช้ร่วมกับเครื่องมือดีพลอยอื่นได้
ภาพรวมแบบย่อ
- ใช้คำสั่ง
kamal-proxy run เพื่อรันพร็อกซีอินสแตนซ์
- ไม่มีไฟล์คอนฟิก แต่สามารถระบุออปชันได้หากค่าเริ่มต้นไม่เหมาะกับแอปพลิเคชัน
- ตัวอย่างเช่น หากต้องการรันพร็อกซีบนพอร์ตที่ไม่ใช่พอร์ตเริ่มต้น 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 ทันที
- หากอินสแตนซ์ไม่อยู่ในสถานะพร้อมใช้งานภายในเวลาที่กำหนด คำสั่ง
deploy จะยกเลิกการดีพลอยและคืนค่า exit code ที่แสดงความผิดปกติ
- ทุกการดีพลอยจะรับช่วงทราฟฟิกทั้งหมดจากอินสแตนซ์ที่ดีพลอยไว้ก่อนหน้า
- เมื่ออินสแตนซ์ใหม่พร้อมใช้งานแล้ว ทราฟฟิกใหม่ทั้งหมดจะถูกส่งไปยังอินสแตนซ์นั้น
- คำสั่ง
deploy จะรอจนกว่าทราฟฟิกบนอินสแตนซ์เดิมจะหมดลงอย่างสมบูรณ์
- ดังนั้นเมื่อ
deploy คืนค่าสำเร็จ ก็สามารถลบอินสแตนซ์เดิมได้โดยไม่ทำให้คำขอที่กำลังดำเนินอยู่ถูกขัดจังหวะ
- เนื่องจากจะยังไม่ส่งทราฟฟิกไปยังอินสแตนซ์ใหม่จนกว่าจะพร้อมใช้งาน และจะลบอินสแตนซ์เดิมหลังจากทราฟฟิกหมดลงแล้ว จึงทำให้การดีพลอยแบบไม่หยุดชะงักเป็นไปได้
การกำหนดเส้นทางตามโฮสต์
- การกำหนดเส้นทางตามโฮสต์ช่วยให้รันหลายแอปพลิเคชันบนเซิร์ฟเวอร์เดียวกันได้
- ระหว่างดีพลอยอินสแตนซ์ สามารถระบุโฮสต์ที่จะให้บริการทราฟฟิกได้
- ตัวอย่างเช่น:
kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com
- อินสแตนซ์ที่ดีพลอยด้วยวิธีนี้จะรับทราฟฟิกเฉพาะสำหรับโฮสต์ที่ระบุเท่านั้น
- ด้วยการดีพลอยอินสแตนซ์แยกสำหรับแต่ละโฮสต์ จึงสามารถรันหลายแอปพลิเคชันบนเซิร์ฟเวอร์เดียวกันได้โดยไม่มีปัญหาพอร์ตชนกัน
- แต่ละโฮสต์สามารถกำหนดเส้นทางไปยังบริการได้ครั้งละหนึ่งบริการเท่านั้น
- ตัวอย่างเช่น หากรัน
kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com แล้วตามด้วย kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com จะเกิดข้อผิดพลาด
- หากรัน
kamal-proxy remove service1 แล้วรัน kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com จะสำเร็จ
TLS อัตโนมัติ
- Kamal Proxy สามารถขอและต่ออายุใบรับรอง TLS สำหรับแอปพลิเคชันโดยอัตโนมัติได้
- สามารถเปิดใช้งานได้โดยเพิ่มแฟล็ก
--tls ตอนดีพลอยอินสแตนซ์
- ตัวอย่างเช่น:
kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com --tls
ระบุออปชัน run ด้วยตัวแปรสภาพแวดล้อม
- ในสภาพแวดล้อมอย่างเช่นตอนรันใน Docker คอนเทนเนอร์ การระบุออปชัน
run ด้วยตัวแปรสภาพแวดล้อมอาจสะดวกกว่า
- ตัวอย่างเช่น หากต้องการตั้งค่า HTTP พอร์ต:
kamal-proxy run --http-port 8080 หรือ HTTP_PORT=8080 kamal-proxy run
- หากตัวแปรสภาพแวดล้อมชนกับอย่างอื่น สามารถแยกได้ด้วยการเติมคำนำหน้า
KAMAL_PROXY_
- ตัวอย่างเช่น:
KAMAL_PROXY_HTTP_PORT=8080 kamal-proxy run
การบิลด์
- หากตั้งค่า Go environment ไว้แล้ว ก็สามารถบิลด์ Kamal Proxy บนเครื่องโลคัลได้:
make
- หรือจะบิลด์เป็น Docker คอนเทนเนอร์ก็ได้:
make docker
ลองใช้งาน
- สามารถลองใช้คำสั่งของพร็อกซีได้โดยดูการตั้งค่า Docker Compose ในโฟลเดอร์ตัวอย่าง
สรุปโดย GN⁺
- Kamal Proxy เป็น HTTP พร็อกซีแบบมินิมัลที่รองรับการดีพลอยแบบไม่หยุดชะงัก และทำงานได้โดยไม่ต้องให้อะปพลิเคชันรองรับอะไรเป็นพิเศษ
- มีความสามารถด้านการกำหนดเส้นทางตามโฮสต์และ TLS อัตโนมัติ ช่วยให้รันหลายแอปพลิเคชันบนเซิร์ฟเวอร์เดียวกันได้
- สามารถระบุออปชัน
run ผ่านตัวแปรสภาพแวดล้อมได้ จึงมีประโยชน์ในสภาพแวดล้อมอย่าง Docker
- เพื่อให้ดีพลอยแบบไม่หยุดชะงัก ระบบจะส่งทราฟฟิกไปยังอินสแตนซ์ใหม่ และรอจนกว่าทราฟฟิกบนอินสแตนซ์เดิมจะหมดลงอย่างสมบูรณ์
- โครงการที่ให้ความสามารถคล้ายกัน ได้แก่ NGINX, HAProxy เป็นต้น
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
การใช้คำว่า 'deploy' ทำให้สับสน
การสร้างทั้งระบบเพื่อทำดีพลอยแบบไม่มีดาวน์ไทม์นั้นดูเกินความจำเป็น
Kamal Proxy มีขึ้นมาเพื่อแก้ปัญหาของ Docker Swarm
สงสัยว่าทำไม Kamal ถึงเลือกใช้ Swarm
ยังไม่เคยใช้ Kamal Proxy แต่ก็ตั้งข้อสงสัยเพราะปัญหาเรื่องการรองรับฟีเจอร์ต่าง ๆ
ดูเหมือนเป็นงานที่ HAProxy ทำได้สบาย
สงสัยว่ามีการใช้แพตเทิร์น 'พักทราฟฟิกชั่วคราว' หรือไม่
สงสัยว่าการทำดีพลอยแบบไม่มีดาวน์ไทม์ (ZDD) ทำงานอย่างไร
Kamal 2 จะรองรับ auto-SSL และทำให้รันหลายแอปบนเซิร์ฟเวอร์เดียวได้ง่ายขึ้น
ไม่เข้าใจวิธีใช้งาน
docker compose up --build --force-recreate webทำให้ทั้งหมดนี้หมดความหมายสงสัยว่ามีวิธีตั้งค่า timeout หรือไม่
เป็นอาการ NIH (Not Invented Here) syndrome