一、文档概述
本文档适用于无云厂商负载均衡的K8s裸金属集群,采用MetalLB L2二层ARP模式实现LoadBalancer类型Service内网VIP分配,全程可直接复制执行,适配192.168.33.0/24物理网段,适配普通机房交换机,无需特殊网络设备。
二、环境信息
| 配置项 | 参数详情 |
|---|---|
| 集群物理网段 | 192.168.33.0/24 |
| 集群节点IP | 192.168.33.4、192.168.33.42 |
| MetalLB版本 | v0.14.8(稳定生产版本) |
| 工作模式 | L2二层ARP广播模式(通用机房交换机,无需BGP配置) |
| VIP地址池范围 | 192.168.33.200 ~ 192.168.33.210(共11个可用VIP) |
| 测试固定VIP | 192.168.33.200 |
| 适用场景 | 裸金属K8s、物理机集群、无云厂商SLB环境 |
三、部署前置原理(必看)
3.1 裸金属K8s集群痛点
K8s原生LoadBalancer类型Service仅云厂商集群支持(阿里云、腾讯云、AWS等自带SLB组件),自建裸金属集群存在以下问题:
- LoadBalancer类型Service无法自动分配内网/外网VIP
- Service的EXTERNAL-IP状态永久为 <pending>
- 仅能使用NodePort、ClusterIP模式,无法实现统一入口负载均衡
3.2 MetalLB核心作用
MetalLB是裸金属K8s集群专用负载均衡插件,可模拟云厂商SLB能力,为集群Service提供同网段内网VIP ,支持负载均衡、故障节点VIP漂移,完美适配生产环境。

3.3 L2模式核心特性
- 基于ARP二层广播实现,无需交换机配置BGP协议
- VIP必须与集群节点物理网卡同网段,不支持跨网段
- 故障自动漂移:节点宕机后,VIP自动切换至健康节点
四、MetalLB完整部署步骤
4.1 初始化部署目录
创建专属部署目录,统一管理配置文件
bash
mkdir -p /root/metallb
cd /root/metallb
4.2 下载官方原生部署清单
下载v0.14.8稳定版官方YAML资源清单
bash
wget https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
1698 image: quay.io/metallb/controller:v0.14.8
1795 image: quay.io/metallb/speaker:v0.14.8
4.3 部署MetalLB核心组件
bash
kubectl apply -f metallb-native.yaml
部署后会自动创建 metallb-system 命名空间,包含controller(单副本控制器)、speaker(集群每节点自动部署一个Pod)两类组件。
4.5 等待所有Pod就绪
实时查看Pod运行状态,直至全部就绪
bash
kubectl get pods -n metallb-system -w
正常就绪状态标准:
- controller-xxx:1/1 Running,无重启、无异常
- speaker-xxx(节点数对应副本数):1/1 Running,所有节点Pod正常运行
按下 Ctrl+C 退出监控界面
五、配置L2地址池与二层宣告(核心关键)
必须配置与集群节点同网段的VIP地址池,跨网段会导致ARP广播失效、VIP无法访问。
5.1 创建L2配置文件
在部署目录创建 configmap.yml 配置文件,定义VIP地址池和L2广播规则
bash
cat > configmap.yml << EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 192.168.33.200-192.168.33.210
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- first-pool
EOF
5.2 应用L2配置
bash
kubectl apply -f configmap.yml
配置生效后,MetalLB会监听集群LoadBalancer类型Service,自动分配地址池内VIP。
六、业务测试:固定VIP部署Nginx服务
通过修改Nginx Service,固定分配测试VIP 192.168.33.200,验证MetalLB功能可用性。
6.1 为Service绑定固定VIP
bash
kubectl patch svc nginx-svc -p '{"spec":{"loadBalancerIP":"192.168.33.200"}}'
6.2 查看Service生效状态
bash
kubectl get svc nginx-svc
部署成功标准输出:
plain
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc LoadBalancer 10.99.209.53 192.168.33.200 80:31711/TCP 2d1h
七、连通性测试
在集群任意节点或同网段物理机访问VIP,验证服务可用性
bash
curl 192.168.33.200