怎么部署 MetalLB
在 Kubernetes 集群中部署 MetalLB(用于在裸金属或本地环境中提供 LoadBalancer 类型的服务支持),需按照以下步骤操作:
1. 前提条件
- Kubernetes 集群:版本 ≥ 1.13.0(支持
LoadBalancer类型 Service)。 - 网络环境:
- 集群节点在同一二层网络(ARP/NDP 模式)或支持 BGP 路由。
- 预留一段未被占用的 IP 地址池(如
192.168.1.100-192.168.1.200)。
2. 安装 MetalLB
方法 1:通过 Manifest 安装(推荐)
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
注意:替换
v0.13.7为最新版本(参考 MetalLB 发布页)。
方法 2:Helm 安装
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb -n metallb-system --create-namespace
3. 配置 IP 地址池
3.1 创建 IP 地址池
创建文件 ip-pool.yaml:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.100-192.168.1.200 # 替换为你的 IP 范围
autoAssign: true
3.2 配置 L2 广播模式(或 BGP)
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2-advert
namespace: metallb-system
spec:
ipAddressPools:
- default-pool
应用配置:
kubectl apply -f ip-pool.yaml -f l2-advert.yaml
BGP 模式:若需 BGP 支持,需额外配置
BGPPeer和BGPAdvertisement(参考 官方文档)。
4. 验证 MetalLB 部署
4.1 检查 Pod 状态
kubectl get pods -n metallb-system
输出应显示 controller 和 speaker 均为 Running:
NAME READY STATUS RESTARTS AGE
controller-5c9894b5cd-vp2qg 1/1 Running 0 1m
speaker-2x8m5 1/1 Running 0 1m
4.2 测试 LoadBalancer 服务
部署一个测试服务:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
检查分配的 IP:
kubectl get svc nginx
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 10.96.xx.xx 192.168.1.100 80:30080/TCP 1m
5. 配置 Ingress 使用 MetalLB
5.1 修改 Nginx Ingress Service
kubectl edit svc ingress-nginx-controller -n ingress-nginx
将 spec.type 改为 LoadBalancer:
spec:
type: LoadBalancer
externalTrafficPolicy: Local
MetalLB 会自动分配 IP,如 192.168.1.101。
5.2 验证 Ingress 访问
kubectl get svc -n ingress-nginx
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.96.xx.xx 192.168.1.101 80:30080/TCP,443:30443/TCP 5m
通过 http://192.168.1.101 访问 Ingress。
6. 高级配置
6.1 多 IP 地址池
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: production-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.100-192.168.1.150
autoAssign: false # 手动分配
6.2 服务注解指定 IP
apiVersion: v1
kind: Service
metadata:
name: nginx
annotations:
metallb.universe.tf/address-pool: production-pool # 指定池
spec:
type: LoadBalancer
7. 故障排查
问题 1:IP 未分配
kubectl describe service nginx # 查看事件日志
kubectl logs -n metallb-system -l app=metallb # 检查控制器日志
问题 2:ARP/BGP 不生效
- ARP 模式:确保所有节点在同一二层网络。
- BGP 模式:检查路由器配置和
BGPPeer匹配。
总结
| 步骤 | 操作 |
|---|---|
| 1. 安装 MetalLB | kubectl apply -f metallb-native.yaml |
| 2. 配置 IP 池 | 创建 IPAddressPool 和 L2Advertisement |
| 3. 测试服务 | 创建 LoadBalancer 类型的 Service |
| 4. 配置 Ingress | 修改 Ingress Controller Service 类型为 LoadBalancer |
部署完成后,Kubernetes 的 LoadBalancer 服务将自动获得外部 IP,无需手动指定端口(如 30028)。
















