ทำไมถึงควรพิจารณา 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 ความคิดเห็น
ความคิดเห็นบน Hacker News