Network & Security

MetalLB + External-DNS 2026: คู่มือ Bare-Metal Kubernetes Load Balancer สำหรับ SME ไทย

คู่มือใช้งาน MetalLB และ External-DNS สำหรับ SME ไทยที่ต้องการ Kubernetes Load Balancer บน Bare-Metal Server หรือ On-Premise โดยไม่ต้องพึ่งพา Cloud Provider พร้อมเปรียบเทียบ Layer 2 vs BGP Mode และตัวอย่างติดตั้งจริงปี 2026

AF
ADS FIT Team
·8 นาที
Share:
MetalLB + External-DNS 2026: คู่มือ Bare-Metal Kubernetes Load Balancer สำหรับ SME ไทย

# 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 อย่างหลัก:

  • Address Allocation — จองและจัดสรร External IP จาก IP Pool ที่กำหนด ให้กับ Service ประเภท LoadBalancer
  • External Announcement — ประกาศให้เครือข่ายภายนอกรู้ว่า IP เหล่านั้นอยู่ที่ Cluster ผ่าน Layer 2 (ARP/NDP) หรือ BGP
  • เมื่อ User สร้าง Service ที่กำหนด `type: LoadBalancer` MetalLB จะ:

  • เลือก IP จาก Pool ที่ Free
  • Patch Service ให้มี `status.loadBalancer.ingress.ip`
  • ส่ง Traffic เข้าหา Pod ผ่าน kube-proxy เหมือน Cloud LB ทั่วไป
  • 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 ใหญ่ |

    คำแนะนำ:

  • **เริ่มที่ Layer 2** หาก SME มี 3-5 nodes และอยู่ใน Subnet เดียวกัน ติดตั้งง่ายที่สุด
  • **ย้ายไป BGP** เมื่อต้องการ High Availability และ ECMP โดยใช้ร่วมกับ Router ที่รองรับ BGP เช่น MikroTik, OPNsense, FRR
  • ขั้นตอนติดตั้ง 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:

  • 192.168.10.240-192.168.10.250
  • ---

    apiVersion: metallb.io/v1beta1

    kind: L2Advertisement

    metadata:

    name: lan-l2

    namespace: metallb-system

    spec:

    ipAddressPools:

  • lan-pool
  • ```

    ทดสอบด้วย 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:

  • port: 80
  • selector:

    app: api

    ```

    เมื่อ deploy เสร็จ DNS Record `api.example.co.th -> 192.168.10.241` (หรือ Public IP ที่ NAT ไปยัง LB) จะถูกสร้างโดยอัตโนมัติ

    Best Practices สำหรับ Production

  • **แยก IP Pool ตาม Environment** (Dev / Staging / Prod) เพื่อง่ายต่อการ Audit
  • **ตั้ง Annotations** `metallb.universe.tf/address-pool` เลือก Pool ตาม Service
  • **Reserve IP สำคัญ** ผ่าน Annotation `metallb.universe.tf/loadBalancerIPs`
  • **Monitor MetalLB** ผ่าน Prometheus Metrics ที่ Port 7472
  • **ใช้ BGP กับ FRR** หากต้องการ Multi-Subnet หรือ ECMP เต็มรูปแบบ
  • **เปิด Audit Mode ก่อน** ใน External-DNS (`--policy=upsert-only`) ป้องกันการลบ Record โดยไม่ตั้งใจ
  • ปัญหาที่พบบ่อยและวิธีแก้

    | ปัญหา | สาเหตุ | วิธีแก้ |

    |-------|--------|---------|

    | 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:

  • ใช้ Layer 2 Mode สำหรับ SME ที่มี Cluster เล็ก-กลางในเครือข่ายเดียว
  • ใช้ BGP Mode เมื่อต้องการ HA และ ECMP
  • จับคู่ External-DNS เพื่อให้ DNS Record อัปเดตอัตโนมัติ
  • Monitor ผ่าน Prometheus เสมอ และตั้ง Alert บน Pool Exhaustion
  • หากต้องการที่ปรึกษาในการ Deploy Kubernetes Bare-Metal Stack สำหรับธุรกิจของคุณ [ติดต่อทีม ADS FIT](/#contact) เพื่อรับ Architecture Review ฟรี หรืออ่านบทความเกี่ยวกับ [Kubernetes และ Network](/blog) เพิ่มเติม

    Tags

    #MetalLB#External-DNS#Kubernetes#Bare-Metal#Load Balancer#BGP#SME ไทย

    สนใจโซลูชันนี้?

    ปรึกษาทีม ADS FIT ฟรี เราพร้อมออกแบบระบบที่ฟิตกับธุรกิจของคุณ

    ติดต่อเรา →

    บทความที่เกี่ยวข้อง