MetalLB K8S 负载均衡器教程

在云平台(AWS、GCP、Azure)的 Kubernetes 中,创建 LoadBalancer 类型的 Service 会自动分配一个外部 IP。但在搬瓦工 VPS 这样的裸金属环境中,Kubernetes 本身不提供负载均衡器实现,LoadBalancer 类型的 Service 会一直处于 Pending 状态。MetalLB 填补了这个空缺,它为裸金属 Kubernetes 集群提供了网络负载均衡器的实现。

一、MetalLB 工作模式

  • Layer2 模式:使用 ARP(IPv4)或 NDP(IPv6)协议在本地网络中宣告 IP。配置简单,不需要特殊网络设备,适合搬瓦工 VPS 单节点或小型集群。
  • BGP 模式:通过 BGP 协议与网络路由器交换路由信息。适合大规模部署,但需要支持 BGP 的路由设备。

对于搬瓦工 VPS 环境,Layer2 模式是最简单实用的选择。

二、安装 MetalLB

2.1 使用 Manifest 安装

# 安装 MetalLB
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.3/config/manifests/metallb-native.yaml

# 等待 Pod 就绪
kubectl wait --namespace metallb-system \
  --for=condition=Ready pods \
  --all --timeout=120s

2.2 使用 Helm 安装

helm repo add metallb https://metallb.github.io/metallb
helm repo update

helm install metallb metallb/metallb \
  --namespace metallb-system \
  --create-namespace

三、配置 Layer2 模式

# 创建 IP 地址池
cat > metallb-config.yaml <<'EOF'
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default-pool
  namespace: metallb-system
spec:
  addresses:
  - 你的VPS公网IP/32
  # 如果有多个IP,可以配置范围
  # - 192.168.1.200-192.168.1.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default
  namespace: metallb-system
spec:
  ipAddressPools:
  - default-pool
EOF
kubectl apply -f metallb-config.yaml

在搬瓦工 VPS 单 IP 环境中,将 VPS 的公网 IP 作为地址池。注意这种配置下只能有一个 LoadBalancer Service 使用该 IP,不同服务通过端口区分。

四、使用 LoadBalancer Service

# 创建 LoadBalancer 类型的 Service
cat > nginx-lb.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-lb
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
EOF
kubectl apply -f nginx-lb.yaml

# 查看分配的 External IP
kubectl get svc nginx-lb

五、指定 IP 地址

# 在 Service 中指定特定 IP
apiVersion: v1
kind: Service
metadata:
  name: myapp-lb
  annotations:
    metallb.universe.tf/address-pool: default-pool
spec:
  type: LoadBalancer
  loadBalancerIP: 指定IP地址
  selector:
    app: myapp
  ports:
  - port: 443
    targetPort: 8443

六、多地址池配置

cat > multi-pool.yaml <<'EOF'
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: internal-pool
  namespace: metallb-system
spec:
  addresses:
  - 10.0.0.200-10.0.0.250
  autoAssign: false
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: external-pool
  namespace: metallb-system
spec:
  addresses:
  - 公网IP/32
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: internal-adv
  namespace: metallb-system
spec:
  ipAddressPools:
  - internal-pool
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: external-adv
  namespace: metallb-system
spec:
  ipAddressPools:
  - external-pool
EOF
kubectl apply -f multi-pool.yaml

七、与 Ingress Controller 配合

在搬瓦工 VPS 上,推荐用 MetalLB 为 Ingress Controller 提供 LoadBalancer IP,再由 Ingress 路由到不同服务:

# 安装 Nginx Ingress Controller 并使用 MetalLB
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --set controller.service.type=LoadBalancer

# 查看 Ingress Controller 获取的外部 IP
kubectl get svc -n ingress-nginx

所有 HTTP/HTTPS 流量通过 Ingress Controller 的 LoadBalancer IP 进入,再根据域名和路径规则分发到后端 Service。

八、监控和排错

# 查看 MetalLB 控制器日志
kubectl logs -n metallb-system -l app=metallb,component=controller

# 查看 Speaker 日志
kubectl logs -n metallb-system -l app=metallb,component=speaker

# 查看 IP 分配情况
kubectl get ipaddresspools -n metallb-system
kubectl get svc --all-namespaces | grep LoadBalancer

九、常见问题

Service External IP 一直 Pending

# 检查 MetalLB Pod 是否正常运行
kubectl get pods -n metallb-system

# 检查 IP 地址池是否配置正确
kubectl get ipaddresspool -n metallb-system -o yaml

# 检查 L2Advertisement 是否创建
kubectl get l2advertisement -n metallb-system

Layer2 模式下的故障转移

Layer2 模式中,某一时刻只有一个节点响应 ARP 请求。当该节点故障时,MetalLB 会自动将 IP 切换到另一个健康节点,切换时间约 10 秒。

总结

MetalLB 让搬瓦工 VPS 上的 Kubernetes 集群也能使用 LoadBalancer 类型的 Service,填补了裸金属环境下的负载均衡缺口。搭配 External DNS 实现域名自动配置,可以构建完整的服务暴露方案。更多 Kubernetes 管理工具请参考 KustomizeArgoCD。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。