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

ทำไมถึงควรพิจารณา Traefik แม้ไม่ได้ใช้คอนเทนเนอร์

สิ่งที่รู้จักเกี่ยวกับ Traefik

  • Traefik มีเป้าหมายเพื่อช่วยโลกของไมโครเซอร์วิส
  • มีผู้ผลิตคอนเทนต์หลายคนบน YouTube ที่แชร์ว่ามีโครงสร้างพื้นฐานแบบคอนเทนเนอร์เช่น Docker หรือ Kubernetes
  • Traefik รันเป็นคอนเทนเนอร์ และสามารถตรวจจับคอนเทนเนอร์อื่นที่ต้องการเปิดเผยผ่าน Traefik โดยอัตโนมัติด้วยการ mount Docker socket เข้าคอนเทนเนอร์ Traefik
  • สามารถกำหนดการทำงานของพร็อกซีให้กับคอนเทนเนอร์เฉพาะผ่าน labels
  • Traefik ขอใบรับรอง TLS จาก Let's Encrypt โดยอัตโนมัติ และบริการก็พร้อมใช้งานทันทีเมื่อมีการตรวจพบคอนเทนเนอร์ใหม่

Traefik ยังมีประโยชน์แม้ไม่ใช้คอนเทนเนอร์

ความเข้าใจผิดที่พบบ่อย: ไม่จำเป็นต้องมี container engine

  • Traefik ไม่จำเป็นต้องทำงานบน container engine และบริการไม่จำเป็นต้องทำงานบน container engine เช่นกัน
  • Traefik เขียนด้วย Golang และคอมไพล์เป็นไฟล์ปฏิบัติการตัวเดียว
  • ซอฟต์แวร์ที่เขียนด้วย Golang และคอมไพล์เป็นไฟล์ไบนารีตัวเดียวให้ความรู้สึกดีมาก
  • การ deploy จึงทำได้ง่าย และยังคงความควบคุมได้เต็มที่

ความเข้าใจผิดที่พบบ่อย: รองรับไฟล์คอนฟิก

  • ถ้าไม่ใช้คอนเทนเนอร์ ก็ใช้ labels แบบคอนเทนเนอร์ไม่ได้ และ labels ก็น่าจะสับสนและอ่านยาก
  • Traefik ก็สามารถกำหนดค่าได้ผ่านไฟล์ config ด้วย
  • Traefik แบ่งการตั้งค่าเป็น “static” ซึ่งมี certificate provider (เช่น Let's Encrypt) และ entrypoint (พอร์ตที่ Traefik รอฟัง) และ “dynamic” ซึ่งมี router, service และ middleware
  • Traefik รับเหตุการณ์ระบบไฟล์และสามารถทำ hot reload ส่วน dynamic ได้

มีเอกสารที่ดีมาก

  • Traefik อธิบายแนวคิดพื้นฐานทั้งหมดที่มันยืนอยู่ได้อย่างชัดเจน
  • ที่ส่วนต้นของหน้าที่เกี่ยวข้องมีตัวอย่างการคอนฟิกตามวิธีเลือก instance ที่คุณเลือกไว้
  • เอกสารครอบคลุมความต้องการเกือบทั้งหมด
  • Sidebar ช่วยได้มาก

Traefik ดูแข็งแรงและออกแบบได้ดี

  • Traefik จะแจ้งเตือนเมื่อการกำหนดค่าไม่เข้าที่ และปัญหาสุ่มก็ยังไม่พบ
  • ดูเหมือนว่า Traefik จะไม่ค่อยบันทึก log มากนักตามค่าเริ่มต้น แต่ทำให้เข้าใจวิธีที่ request ทำงานได้ง่าย และเริ่มต้นได้เร็วโดยไม่สะดุด

ฟีเจอร์ที่ชอบมากที่สุด

TLS passthrough และ PROXY protocol

  • Traefik รองรับ TLS passthrough และ PROXY protocol ของ HAProxy (อินพุตและเอาต์พุต)
  • TLS passthrough หมายถึงการส่งผ่าน traffic ไปยังเว็บเซอร์วิสที่ให้บริการ TLS certificate ของตัวเอง
  • ทำให้บริการสามารถขอใบรับรองจาก Let's Encrypt โดยตรงได้ โดยไม่ต้อง terminate TLS ที่พร็อกซี
  • PROXY protocol เป็นวิธีที่ช่วยส่งข้อมูลที่ผู้ใช้มาถึงพร็อกซีก่อนไปยังปลายทางได้อย่างปลอดภัยมากขึ้นและลดการสูญหายของข้อมูล
  • PROXY protocol ต้องได้รับการรองรับจากบริการปลายทางด้วย โดย Apache2 และ Nginx (เช่น PHP) รองรับแล้ว และรายชื่อบริการที่รองรับโปรโตคอลนี้กำลังเพิ่มขึ้น

ข้อสังเกตเมื่อใช้ Traefik

Authentication

  • ใน NGINX มีการใช้ Vouch Proxy เพื่อป้องกันบริการบางอย่างด้วย Azure AD
  • Traefik รองรับ ForwardAuth ที่คล้ายกับระบบการยืนยันตัวตนของ NGINX แต่ Vouch Proxy ยังไม่ทำงานบน Traefik
  • สามารถ rollout Keycloak แล้วรวมกับ AAD จากนั้นจึงใช้กับ ForwardAuth ได้ แต่อย่างไรก็ตามต้องตั้งค่าและดูแล Keycloak instance นี้ให้ปลอดภัยและอัปเดตก่อน
  • แม้ traefik-forward-auth จะถูกแนะนำบ่อย แต่คอมมิตอัปเดตล่าสุดอยู่เดือนมิถุนายน 2020 และผู้พัฒนาก็หายไปจาก GitHub จึงต้องอัปเดต dependencies เอง
  • เคยมีประสบการณ์ไม่ดีครั้งหนึ่งกับ oauth2-proxy
  • HTTP2/3, timeout, ขนาด body และ WebSocket จำเป็นต้องตั้งค่าในพร็อกซี่ทุกตัวระหว่างผู้ใช้กับบริการ ทำให้การพร็อกซีต่อพร็อกซีมีความเสี่ยงต่อข้อผิดพลาดสูง
  • Traefik ForwardAuth ดูง่ายจึงดูเหมือนว่าต้องสร้างเครื่องมือเล็กๆ ขึ้นมาเองเพื่อผสานกับ AAD หรือ fork โปรเจกต์ traefik-forward-auth แล้วรีวิวโค้ดและอัปเดต dependencies

การบล็อก User-Agent และ IP

  • ไม่ต้องการให้ archive.org เก็บบริการภายใน
  • robots.txt และ header ลักษณะเดียวกันใช้งานไม่ได้กับการห้ามของ Archive.org ดังนั้นวิธีเดียวที่เหลือสำหรับการบล็อก crawler คือการบล็อก user-agent "archive.org_bot" หรือบล็อกช่วง IP
  • ใน Traefik จะสามารถบล็อก user-agent หรือ IP address ได้เฉพาะผ่านปลั๊กอินบุคคลที่สามเท่านั้น
  • ปลั๊กอินบุคคลที่สามไม่ค่อยชอบเพราะต้องระวังการอัปเดตและอาจก่อให้เกิดช่องโหว่ทางความปลอดภัย
  • ใช้ middleware ชื่อ IPAllowList ในการบล็อก IP และอนุญาตทุกอย่างยกเว้น IP ที่ต้องการบล็อก
  • คุณสามารถคำนวณช่วง IP ได้ และไม่เลวร้ายกว่าการบล็อกตรงๆ แต่เนื่องจากเห็นเฉพาะสิ่งที่เหลืออยู่ จึงไม่เห็น subnet ที่ถูกบล็อกอย่างแม่นยำ และจึงไม่รู้สึกหรูหรา

ความคิดเห็นของ GN+

  • Traefik ดูเหมือนเป็น reverse proxy ที่น่าสนใจไม่ว่าจะใช้คอนเทนเนอร์หรือไม่ โดยเฉพาะข้อดีคือการเขียนด้วย Golang และคอมไพล์เป็นไฟล์ปฏิบัติการตัวเดียว ซึ่งช่วยให้การ deploy และการจัดการง่าย
  • เอกสารค่อนข้างละเอียด จึงมีแนวโน้มช่วยเข้าใจแนวคิดของ Traefik และหา example การตั้งค่าได้ง่ายขึ้นมาก
  • ฟีเจอร์ขั้นสูงอย่าง TLS passthrough และการรองรับ PROXY protocol ก็ดูทำงานได้ดี
  • อย่างไรก็ตามในส่วน authentication ยังดูเหมือนยังไม่มีโซลูชันที่พอใจ จึงอาจต้องพัฒนาระบบ auth ของตัวเองหรือพัฒนาปรับปรุงโปรเจกต์ที่มีอยู่
  • ตัวเลือกที่ดีของ user-agent/IP blocking มาพร้อมกับระบบเริ่มต้นก็น่าจะดี แต่ตอนนี้ดูเหมือนไม่มีทางที่ดูดีนอกจากการใช้ปลั๊กอินภายนอก
  • Traefik ดูมีเหตุผลพอที่จะเป็นทางเลือกแทน NGINX โดยเฉพาะถ้าคิดว่า NGINX config ซับซ้อน ความเรียบง่ายของ Traefik จะเป็นจุดเด่น

1 ความคิดเห็น

 
GN⁺ 2024-05-06
ความคิดเห็นบน Hacker News
  • เปรียบเทียบข้อดีข้อเสียของ Traefik
    • ข้อดี: ย้ายจาก NGINX ไปยัง Traefik เพราะมีการผสาน Let's Encrypt อัตโนมัติ
    • ข้อเสีย: เอกสารไม่ครบถ้วนและการ logging ก็ไม่ละเอียดนัก อีกทั้งการสร้างใบรับรองใหม่เป็นครั้งคราวล้มเหลว ทำให้ระบบ production ขัดข้องได้
    • สุดท้ายกลับมาใช้ NGINX อีกครั้ง
  • ความคิดเห็นที่ชอบใช้ Caddy แทน Traefik
    • Caddyfile จัดการได้ง่ายกว่าการตั้งค่าแบบ YAML ของ Traefik มาก
    • รองรับปลั๊กอินหลากหลาย (เช่น ปลั๊กอิน Coraza WAF ของ Caddy)
  • การอภิปรายเรื่องกรณีการใช้งานที่ Traefik อาจมีข้อได้เปรียบเหนือ NGINX
    • สำหรับโฮสต์ Docker ขนาดเล็กที่มีคอนเทนเนอร์เพียงไม่กี่สิบตัว NGINX Proxy Manager ก็เพียงพอ
    • บน K3s ที่ Traefik ถูกตั้งค่าเริ่มต้นไว้อัตโนมัติ ทำให้ตั้งค่า Kubernetes cluster เพื่อทดสอบได้เร็วขึ้น
  • สำหรับผู้ที่กำลังพิจารณาย้ายจาก Caddy มา Traefik
    • ข้อดีของ Caddy: การตั้งค่าอัตโนมัติผ่าน Docker label, การจัดการใบรับรอง TLS, การตั้งค่า DNS อัตโนมัติ และอื่นๆ
    • ข้อเสียของ Caddy: เมื่อ restart workload แล้ว Caddy ถูก restart ใหม่ทั้งหมด ทำให้บริการหยุดชั่วคราว และการตั้งค่า wildcard certificate ค่อนข้างซับซ้อน
    • มีประสบการณ์ใช้งาน Traefik ในสภาพแวดล้อม K8s ที่ดี จึงกำลังพิจารณานำมาใช้กับโปรเจกต์ส่วนตัว
  • ประสบการณ์การย้ายมาใช้ Caddy เนื่องจากการตั้งค่าแบบไดนามิกและการดีบักของ Traefik ทำได้ยาก
    • Caddy กระชับและมีชั้นน้อยกว่า จึงตั้งค่าได้ง่ายกว่ามาก
  • หลังใช้งาน Traefik มานานก็เริ่มตระหนักถึงข้อดีของการตั้งค่าแบบคงที่
    • ความยุ่งยากของการตั้งค่าแบบไดนามิกผ่าน Docker label และความยุ่งยากในการดีบัก
    • สร้างไฟล์กำหนดค่าคงที่แบบง่ายผ่าน template engine สำหรับการผสม host/target/port
    • อัตโนมัติการสร้างและแจกจ่ายไฟล์กำหนดค่าด้วย Ansible
  • การเปรียบเทียบกับ HAProxy
    • ใช้ HAProxy มานานกว่าสิบปี และมีการปรับให้ทันสมัยตามยุคคลาวด์ เช่น การตั้งค่าแบบไดนามิกผ่าน runtime API
  • ข้อดีและข้อเสียที่สำคัญที่สุดในการใช้ Traefik
    • ข้อดี: การส่งการตั้งค่าผ่าน Docker label ทำให้แทบไม่ต้องแก้ไขตัวเองของ Traefik
    • ข้อเสีย: ความยากในการออกเสียง Traefik ให้ถูกต้อง (รู้สึกอยากออกเสียงว่า "trey-feek" เป็นต้น)