MetalLB 是一个 Kubernetes 的 LoadBalancer 解决方案,专门用于裸机(Bare Metal)集群。由于 Kubernetes 本身在裸机环境中没有内置的负载均衡(不像云环境有 ELB、ALB),MetalLB 通过 BGP 或 ARP 提供 LoadBalancer 类型的服务支持,使得服务可以获得外部可访问的 IP 地址。
MetalLB 模式对比
| 模式 | 说明 | 适用场景 |
|---|---|---|
| L2 模式(ARP/NDP 广播) | 通过 ARP 或 NDP 让局域网设备知道 LoadBalancer IP | 适用于 简单网络,推荐 |
| BGP 模式(边界网关协议) | 让 Kubernetes 节点与物理路由器对等连接,实现外网负载均衡 | 适用于 复杂网络(如 ISP、数据中心) |
MetalLB 安装
部署 MetalLB
metallb-native.yaml:
1 | apiVersion: v1 |
应用yaml文件:
1 | kubectl apply -f metallb-native.yaml |
查看MetalLB Pod 运行情况
1 | kubectl get pods -n metallb-system |
1 | NAME READY STATUS RESTARTS AGE |
controller:管理 MetalLB 的控制器。speaker:在每个节点上运行,负责广播负载均衡 IP。
配置 MetalLB IP 池
创建 IPAddressPool
MetalLB 需要一个 IP 池(地址范围),用于分配 LoadBalancer IP。
ip-pool.yaml文件:
1 | apiVersion: metallb.io/v1beta1 |
应用yaml文件:
1 | kubectl apply -f ip-pool.yaml |
注意:
addresses定义了一段可以分配的 IP 地址范围,需确保它在你的网络中可用(跟你的k8s节点同一个网段,且IP没被分配)- 你可以调整 IP 范围以适应你的网络。
创建 L2Advertisement(Layer 2 模式)
使用L2(ARP 广播)模式,还需要创建 L2Advertisement 资源。
l2-advertisement.yaml文件:
1 | apiVersion: metallb.io/v1beta1 |
应用yaml文件:
1 | kubectl apply -f l2-advertisement.yaml |
创建完之后我们可以查看一下k8s的ingress-nginx的svc信息,看external-ip,没装前是pending

部署完Metallb之后再查看:

然后我们创建Ingress,然后把域名解析到这个external-ip就可以访问集群内的网站。
删除Metallb
如果需要删除Metallb:
1 | kubectl delete -f l2-advertisement.yaml |

