# MetalLB + External-DNS 2026: คู่มือ Bare-Metal Kubernetes Load Balancer สำหรับ SME ไทย
หนึ่งในความท้าทายที่ใหญ่ที่สุดของการ Self-Host Kubernetes Cluster คือการจัดการ LoadBalancer Service เมื่อไม่ได้รันบน AWS, GCP หรือ Azure ที่มี Cloud Controller ในตัว Service ประเภท `LoadBalancer` จะค้างอยู่ที่สถานะ `<pending>` ตลอดไป
MetalLB คือคำตอบของปัญหานี้ เป็น Open-source Load Balancer ที่ออกแบบมาเฉพาะสำหรับ Bare-Metal Kubernetes Cluster ใช้คู่กับ External-DNS เพื่อ Auto-update DNS Record ทุกครั้งที่ Service ใหม่ Up จะได้ Workflow ที่ใกล้เคียงกับ Managed K8s บน Cloud
บทความนี้สำหรับ SME ไทยที่กำลัง Self-host Kubernetes บน On-Premise, Hetzner, Contabo หรือ Bare-Metal Server ในประเทศ จะอธิบายตั้งแต่หลักการทำงาน, การเลือก Mode (Layer 2 vs BGP), การติดตั้ง ไปจนถึงการ Monitor ในปี 2026
MetalLB ทำงานอย่างไร
MetalLB ทำหน้าที่ 2 อย่างหลัก:
เมื่อ User สร้าง Service ที่กำหนด `type: LoadBalancer` MetalLB จะ:
Layer 2 Mode vs BGP Mode
| คุณสมบัติ | Layer 2 Mode | BGP Mode |
|-----------|--------------|----------|
| Network Requirement | Single Subnet | Router รองรับ BGP |
| Failover | ~10 วินาที (ARP/NDP) | < 1 วินาที |
| Load Balancing | Active-Standby (1 node ถือ IP) | ECMP (กระจาย Traffic) |
| Scalability | จำกัด (1 Node ที่ active) | สูงมาก |
| Setup ความยาก | ง่าย | ปานกลาง |
| Use Case | Small Cluster, LAN | Production, DC ใหญ่ |
คำแนะนำ:
ขั้นตอนติดตั้ง MetalLB (Layer 2)
เตรียมความพร้อม: Cluster ที่ใช้ kube-proxy IPVS หรือ iptables ก็ได้, มี IP Range ว่างใน LAN ให้ MetalLB จัดการเช่น `192.168.10.240-192.168.10.250`
```
# 1. ติดตั้ง MetalLB ผ่าน Manifest
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/main/config/manifests/metallb-native.yaml
# 2. รอให้ controller และ speaker ready
kubectl -n metallb-system get pods
```
สร้าง IPAddressPool และ L2Advertisement:
```
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: lan-pool
namespace: metallb-system
spec:
addresses:
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: lan-l2
namespace: metallb-system
spec:
ipAddressPools:
```
ทดสอบด้วย Service:
```
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --type=LoadBalancer --port=80
kubectl get svc nginx
# คุณจะเห็น EXTERNAL-IP จาก Pool ที่กำหนด
```
รวมกับ External-DNS
External-DNS ทำหน้าที่ Sync DNS Records (A/CNAME) จาก Kubernetes Resources ไปยัง DNS Provider เช่น Cloudflare, Route53, PowerDNS, RFC2136 (BIND) อัตโนมัติ
Workflow:
1. MetalLB จองให้ Service ได้ External IP
2. External-DNS อ่าน Annotation `external-dns.alpha.kubernetes.io/hostname` จาก Service หรือ Ingress
3. External-DNS API เรียก DNS Provider สร้าง/อัปเดต A Record
4. ผู้ใช้เข้าผ่าน FQDN ได้ทันที
ตัวอย่าง Service ที่ใช้คู่กัน:
```
apiVersion: v1
kind: Service
metadata:
name: api-prod
annotations:
external-dns.alpha.kubernetes.io/hostname: api.example.co.th
metallb.universe.tf/loadBalancerIPs: 192.168.10.241
spec:
type: LoadBalancer
ports:
selector:
app: api
```
เมื่อ deploy เสร็จ DNS Record `api.example.co.th -> 192.168.10.241` (หรือ Public IP ที่ NAT ไปยัง LB) จะถูกสร้างโดยอัตโนมัติ
Best Practices สำหรับ Production
ปัญหาที่พบบ่อยและวิธีแก้
| ปัญหา | สาเหตุ | วิธีแก้ |
|-------|--------|---------|
| Service ค้าง pending | ยังไม่ได้สร้าง IPAddressPool | สร้าง Pool และ L2Advertisement |
| External IP ไม่ถูก ARP | Switch กรอง ARP หรือ MAC Spoofing | เปิด ARP/Promiscuous บน Switch |
| DNS Record ไม่ Update | External-DNS Permission ไม่พอ | เพิ่ม IAM Role / API Token ที่ถูกต้อง |
| BGP Session Down | AS Number หรือ Password ผิด | ตรวจสอบ Router Config |
| IP เลือกซ้ำ | Pool ทับกับ DHCP Range | จอง IP Range Static เฉพาะ MetalLB |
เปรียบเทียบกับทางเลือกอื่น
| Solution | Type | Cost | Pros | Cons |
|----------|------|------|------|------|
| MetalLB | Open-source | ฟรี | ง่ายและเสถียร | ต้องตั้ง Network เอง |
| Kube-VIP | Open-source | ฟรี | รวม VIP สำหรับ Control Plane ด้วย | Community ขนาดเล็กกว่า |
| PureLB | Open-source | ฟรี | Modular กว่า MetalLB | User น้อย |
| Cilium LB-IPAM | Open-source | ฟรี | รวมกับ Cilium ได้ | ต้องใช้ Cilium CNI |
| F5 BIG-IP CIS | Commercial | สูง | Enterprise-grade | ค่าใช้จ่ายสูง |
สำหรับ SME ไทยที่ใช้ Standard CNI (Calico, Flannel, WeaveNet) MetalLB ยังเป็นตัวเลือกที่สมดุลที่สุดในปี 2026
สรุปและ Next Steps
MetalLB + External-DNS เป็นชุดเครื่องมือที่ทำให้ Self-Hosted Kubernetes บน Bare-Metal มีประสบการณ์ใช้งานใกล้เคียงกับ Managed Kubernetes บน Cloud โดยไม่ต้องเสียค่า LB Hour-based
Key Takeaways:
หากต้องการที่ปรึกษาในการ Deploy Kubernetes Bare-Metal Stack สำหรับธุรกิจของคุณ [ติดต่อทีม ADS FIT](/#contact) เพื่อรับ Architecture Review ฟรี หรืออ่านบทความเกี่ยวกับ [Kubernetes และ Network](/blog) เพิ่มเติม
