內容概述
MetalLB 是專為裸機(Bare Metal)Kubernetes 叢集設計的網路負載平衡器,透過標準路由協定實現服務的高可用性和可擴展性。
在缺乏雲端供應商提供的負載平衡服務時,MetalLB 為使用者提供了一個有效的替代方案。
應用場景
在公有雲平台(如 GCP、AWS、Azure)上,Kubernetes 通常利用雲端供應商的負載平衡服務來實現 Service 的 LoadBalancer 類型。
然而,在裸機環境或不支援此類服務的私有雲中,這種方法不可行。
MetalLB 旨在填補這一空白,使裸機 Kubernetes 叢集也能夠輕鬆地建立 LoadBalancer 類型的 Service。
技術特點
- 位址分配:MetalLB 從預先設定的 IP 位址池中為每個 LoadBalancer Service 分配一個外部 IP。
- 對外公告:透過 Layer2(ARP/NDP)或 BGP 協定,將服務的 IP 位址公告給外部網路。
- 操作模式:
- Layer2 模式:使用 ARP(IPv4)或 NDP(IPv6)協定,將服務 IP 宣告給本地網路。
- BGP 模式:與鄰近路由器建立 BGP 對等會話,宣告服務 IP,實現多節點負載平衡和精細的流量控制。
其他整合
MetalLB 可以與多種 Kubernetes 網路插件(如 Flannel、Calico、Cilium 等)協同工作,提供靈活的網路設定選項。
在使用 BGP 模式時,可能需要確保網路基礎設施支援 BGP 協定。
安裝步驟
以下以 Kubernetes 清單(manifests)安裝 MetalLB,本文查核時的版本為 v0.16.1。
1. 準備工作:
- Kubernetes 1.13.0 或更新版本,且叢集中尚未有其他網路負載平衡功能。
- 一組可以分配給 MetalLB 的 IPv4 位址。
- 若 kube-proxy 使用 IPVS 模式,需啟用嚴格 ARP 模式(
strictARP: true):
kubectl edit configmap -n kube-system kube-proxy2. 安裝 MetalLB:只使用 Layer2 或簡單 BGP 時,可使用輕量的 native 版本:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.16.1/config/manifests/metallb-native.yaml若需要 BGP 搭配 BFD、IPv6 等進階功能,官方建議改用 FRR-K8s 版本(metallb-frr-k8s.yaml);從 v0.16.0 起 FRR-K8s 已是預設的 BGP 後端。安裝後可確認元件是否就緒:
kubectl get pods -n metallb-system3. 確認目前叢集 worker 所使用的 IP 網段範圍(以 Kind 叢集為例):
docker network inspect -f '{{.IPAM.Config}}' kind
[{172.18.0.0/16 172.18.0.1 map[]} {fc00:f853:ccd:e793::/64 fc00:f853:ccd:e793::1 map[]}]4. 設定位址池:舊版教學使用 ConfigMap 設定位址池,但 MetalLB 自 v0.13 起已改用 CRD,不再支援 ConfigMap 設定。現在需要建立 IPAddressPool 定義可用的 IP 範圍,再用 L2Advertisement 以 Layer2 模式對外公告:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 172.18.255.200-172.18.255.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system位址範圍請挑選網段中沒有被節點或其他設備使用的區段(範例取 172.18.0.0/16 尾端的一段),避免與閘道或節點 IP 衝突。L2Advertisement 未指定位址池時,會公告所有的 IPAddressPool。將上述設定儲存為 metallb-config.yaml,然後執行:
kubectl apply -f metallb-config.yaml存取和操作
安裝並設定 MetalLB 後,您可以像在雲端環境中一樣,建立 LoadBalancer 類型的 Service。
MetalLB 會自動分配外部 IP,並將其公告給網路,使服務可供外部存取。可以用 kubectl get svc 查看 Service 的 EXTERNAL-IP 欄位是否已取得位址。
小技巧
- 在 Layer2 模式下,節點故障的偵測使用 memberlist,預設使用 7946 連接埠(TCP 和 UDP),請確保節點之間互通。
- 在 BGP 模式下,確保網路基礎設施支援 BGP,並正確設定路由策略。
- 定期檢查 MetalLB 的日誌,以監控其運行情況並及時發現潛在問題。
- 在公有雲上通常不需要也無法使用 MetalLB,請改用雲端供應商的負載平衡服務。
適用規模與維運成本
- 適用規模:自建機房、家用實驗室(Homelab)或私有雲的 Kubernetes 叢集,需要 LoadBalancer 類型 Service 時使用;單節點或本機測試叢集(如 Kind)也能用來學習。
- Layer2 或 BGP:Layer2 設定最簡單,但同一個服務 IP 同時只由一個節點接收流量,適合小型環境;需要多節點分流與大型網路時再考慮 BGP,但需要支援 BGP 的路由器與網路管理知識。
- 維運成本:MetalLB 本身資源需求不高;主要的維運工作是規劃 IP 位址、升級時閱讀 release notes(例如 v0.13 的 CRD 改版、v0.16 的 BGP 後端變更)。
教學影片
影片來源:OpenShift/YouTube
參考連結
成本與風險摘要
- 適用對象與規模:裸機、私有雲或家用實驗室的 Kubernetes 叢集。
- 成本(硬體、訂閱、授權):MetalLB 為 Apache 2.0 開源授權,免費;需準備可分配的 IP 位址,BGP 模式另需支援 BGP 的路由器。
- 維護時間:初次設定約為規劃 IP 與套用設定;之後主要是版本升級與監控。
- 資安注意事項:LoadBalancer IP 會直接對區網(或公網)開放服務,請搭配 NetworkPolicy 或防火牆,只開放必要的服務;Layer2 模式會回應 ARP,請確認位址範圍不會與其他設備衝突。
- 常見誤區:沿用舊版 ConfigMap 設定(新版已不支援);位址池與節點、閘道 IP 重疊;在公有雲上安裝 MetalLB。
- 不建議使用的情況:公有雲代管 Kubernetes(請使用雲端負載平衡服務)。
- 測試日期與版本號:資料查核日期:2026-10-28;依官方文件對照 MetalLB v0.16.1(範例為作者早期在 Kind 上的實作,本次未重新實機測試)。
