k8s 中微服务之 MetailLB实现slb效果

一、文档概述

本文档适用于无云厂商负载均衡的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