ทำความรู้จักกับ HAProxy และ MetalLB: หัวใจสำคัญของระบบ Load Balancing ใน Kubernetes
บทนำ
เมื่อองค์กรเริ่มพัฒนาโครงสร้างพื้นฐานด้าน IT เช่นซอฟแวร์การให้บริการต่างๆ อยู่บนเว็บหรือโมบอย และทำให้มันรองรับผู้ใช้งานจำนวนมาก ความสามารถในการ Load Balancing (การกระจายโหลด) และ High Availability (ความพร้อมใช้งานสูง) กลายเป็นองค์ประกอบสำคัญของระบบแบบขาดเสียไม่ได้ เพราะมันเป็นส่วนหนึ่งที่จะทำให้ availability หรือความพร้อมให้บริการนั้นสูงขึ้น
ในอดีต การออกแบบระบบมักใช้ Keepalived ร่วมกับ HAProxy บนเครื่อง Physical Server หรือ Virtual Machine แต่เมื่อเข้าสู่ยุคของ container และ Kubernetes ซึ่งมีการสร้างและทำลาย Pods ได้ตลอดเวลา แนวคิดในการให้บริการ IP Address และการกระจายโหลดจึงเปลี่ยนไป โดยจะมีส่วนของซอฟต์แวร์ที่เรียกว่า MetalLB เข้ามาทำหน้าที่แทน Keepalived
บทความนี้จะอธิบายหน้าที่ของ HAProxy และ MetalLB รวมถึงความแตกต่างและการทำงานร่วมกันอย่างละเอียด
Load Balancer คืออะไร และทำไมเราต้องมี
Load Balancer คือระบบที่ทำหน้าที่รับคำขอ (Request) จากผู้ใช้งาน แล้วกระจายคำขอเหล่านั้นไปยังเซิร์ฟเวอร์หลายเครื่องหรือหลายปลาทางหรือหลายโหนด เพื่อให้ทุกเครื่องทำงานร่วมกันอย่างมีประสิทธิภาพ และลดการทำงานในโหนดหรือหน่วยการประมวลตัวหนึ่งตัวใดเป็นพิเศษ เพื่อไม่ให้แต่ละตัวทำงานหนักจนเกิดไป
ประโยชน์ของ Load Balancer ได้แก่
HAProxy คืออะไร
HAProxy (High Availability Proxy) เป็นซอฟต์แวร์ประเภท Reverse Proxy และ Load Balancer ที่ได้รับความนิยมสูงในระดับองค์กร โดยมันจะทำงานอยู่ในชั้นของ Application เป็นหลัก โดยมันมีหน้าที่หลักของ ได้แก่

เมื่อผู้ใช้งานส่งคำขอเข้ามา HAProxy จะเลือกว่าจะส่งคำขอนั้นไปยัง Backend Server ตัวใด ตามอัลกอริทึมที่กำหนด เช่น
กล่าวได้ว่า HAProxy เป็นผู้ตัดสินใจว่า “คำขอนี้ควรไปที่เซิร์ฟเวอร์ใด”
Keepalived คืออะไร
ในระบบ Bare Metal หรือ Virtual Machine หากต้องการให้ HAProxy มีความพร้อมใช้งานสูง มักจะติดตั้ง Keepalived ควบคู่กัน โดยที่ Keepalived มีหน้าที่สร้าง Virtual IP (VIP) หรืออาจจะพูดง่ายๆ ได้ว่า สร้าง IP อยู่ตรงกลาง โดย ไอพีดังกล่าว อาจจะหมายถึงหลายเครื่องหรือมากกว่า หรือ ทำให้หลายเครื่องมีไอพีเดียวกันนั่นเอง (secondary ip) Keepalived จะย้าย VIP ไปยังเครื่องสำรองโดยอัตโนมัติ ทำให้ผู้ใช้งานยังคงเชื่อมต่อผ่าน IP เดิม
แล้วพอมาเป็น Kubernetes มันแตกต่างอย่างไรกับของเดิม หรือ ที่ใช้อยู่เดิมใน Bare Metal
Kubernetes มีแนวคิดที่แตกต่างจากระบบ VM แบบเดิม เพราะภายใน Kubernetes
ดังนั้นจึงไม่สามารถกำหนด IP ของ Pod แบบคงที่เหมือน VM ได้จึงเกิดองค์ประกอบใหม่คือ Kubernetes Service และ MetalLB
MetalLB คืออะไร
MetalLB คือ Load Balancer สำหรับ Kubernetes แบบ Bare Metal หรือ On-Premises MetalLB ทำหน้าที่คล้าย Keepalived แต่ถูกออกแบบมาเพื่อ Kubernetes โดยเฉพาะหน้าที่ของ MetalLB ได้แก่
MetalLB ไม่ใช่ HAProxy
หลายคนเข้าใจผิดว่า MetalLB เป็น Load Balancer ที่สามารถแทน HAProxy ได้
ความจริงแล้วทั้งสองตัวทำงานคนละระดับ
MetalLB “ไม่” สามารถทำสิ่งเหล่านี้ได้
MetalLB สนใจเพียงว่า IP นี้ควรอยู่ที่ Node ไหนเท่านั้น
HAProxy และ MetalLB ไม่ได้แข่งขันกัน แต่ทำงานเสริมกัน โดยที่ MetalLB มีหน้าที่ทำให้ Kubernetes มี IP Address ภายนอกที่ผู้ใช้งานสามารถเข้าถึงได้ พร้อมทั้งรับผิดชอบการย้าย IP เมื่อ Node เกิดปัญหา เพื่อให้บริการยังคงทำงานต่อได้ HAProxy มีหน้าที่รับคำขอจากผู้ใช้งาน วิเคราะห์ข้อมูลในระดับแอปพลิเคชัน เช่น URL, Host Header หรือ Cookie แล้วเลือก Backend Server หรือ Application Pod ที่เหมาะสมที่สุดในการให้บริการ
กล่าวโดยสรุป หากเปรียบเทียบกับระบบแบบดั้งเดิม Keepalived เปรียบเสมือน MetalLB และ HAProxy ยังคงเป็น HAProxy เช่นเดิม ความแตกต่างคือ Kubernetes เพิ่มองค์ประกอบอย่าง Service เข้ามาเพื่อบริหารจัดการ Pods ที่สามารถสร้าง ย้าย หรือปรับจำนวนได้ตลอดเวลา ทำให้ระบบมีความยืดหยุ่น รองรับการขยายตัว และมีความพร้อมใช้งานสูงกว่าสถาปัตยกรรมแบบเดิมอย่างมาก