怎么部署 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 支持,需额外配置 BGPPeerBGPAdvertisement(参考 官方文档)。


4. 验证 MetalLB 部署

4.1 检查 Pod 状态

kubectl get pods -n metallb-system

输出应显示 controllerspeaker 均为 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 池 创建 IPAddressPoolL2Advertisement
3. 测试服务 创建 LoadBalancer 类型的 Service
4. 配置 Ingress 修改 Ingress Controller Service 类型为 LoadBalancer

部署完成后,Kubernetes 的 LoadBalancer 服务将自动获得外部 IP,无需手动指定端口(如 30028)。