3 คะแนน โดย GN⁺ 2024-09-22 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

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 ความคิดเห็น

 
GN⁺ 2024-09-22
ความคิดเห็นบน Hacker News
  • การใช้คำว่า 'deploy' ทำให้สับสน

    • คำอย่าง 'bind', 'intercept', 'proxy' น่าจะเหมาะสมกว่า
  • การสร้างทั้งระบบเพื่อทำดีพลอยแบบไม่มีดาวน์ไทม์นั้นดูเกินความจำเป็น

    • แอป+เว็บพร็อกซีที่รองรับ Unix socket ก็สามารถทำดีพลอยแบบไม่มีดาวน์ไทม์ได้
  • Kamal Proxy มีขึ้นมาเพื่อแก้ปัญหาของ Docker Swarm

    • ที่ Cloud 66 เคยใช้ Caddy และ Traefik
  • สงสัยว่าทำไม Kamal ถึงเลือกใช้ Swarm

    • อาจเป็นเพราะความเรียบง่าย
    • ความซับซ้อนไม่สามารถซ่อนไว้ได้ และสุดท้ายก็ต้องสร้างพร็อกซีของตัวเอง
  • ยังไม่เคยใช้ Kamal Proxy แต่ก็ตั้งข้อสงสัยเพราะปัญหาเรื่องการรองรับฟีเจอร์ต่าง ๆ

    • ต้องรองรับ WebSockets, SSE, HTTP/3 รวมถึงการบีบอัดและการเข้ารหัสหลายรูปแบบ
  • ดูเหมือนเป็นงานที่ HAProxy ทำได้สบาย

    • มีฟีเจอร์ hitless reload
  • สงสัยว่ามีการใช้แพตเทิร์น 'พักทราฟฟิกชั่วคราว' หรือไม่

    • สามารถพักทราฟฟิกไว้สักไม่กี่วินาทีเพื่อทำการเปลี่ยนแปลงโครงสร้างพื้นฐานได้
  • สงสัยว่าการทำดีพลอยแบบไม่มีดาวน์ไทม์ (ZDD) ทำงานอย่างไร

    • แอปสองเวอร์ชันรันพร้อมกัน และทราฟฟิกใหม่จะถูกส่งไปยังเวอร์ชันใหม่
    • สงสัยว่าจัดการปัญหา DB migration อย่างไร
  • Kamal 2 จะรองรับ auto-SSL และทำให้รันหลายแอปบนเซิร์ฟเวอร์เดียวได้ง่ายขึ้น

  • ไม่เข้าใจวิธีใช้งาน

    • ตามตัวอย่าง มีการเริ่มต้น replica ของบริการ 'web' จำนวน 4 ตัว
    • เพื่อทำดีพลอยแบบไม่มีดาวน์ไทม์ ต้องดีพลอยไปยัง target ใหม่
    • คำสั่ง docker compose up --build --force-recreate web ทำให้ทั้งหมดนี้หมดความหมาย
    • ต้องการคำแนะนำที่ชัดเจนกว่านี้
  • สงสัยว่ามีวิธีตั้งค่า timeout หรือไม่

  • เป็นอาการ NIH (Not Invented Here) syndrome