You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MetalLB配置后无法从K8s集群外部访问LoadBalancer服务求助

问题排查:Kubernetes LoadBalancer服务外部访问被拒绝(内部正常)

环境信息

  • K8s版本: v1.25
  • MetalLB版本: 0.13(搭配Flannel v0.20)
  • 已配置IPAddressPool和L2Advertisement,LoadBalancer服务已分配外部IP 151.62.196.222,但外部访问返回curl: (7) Failed to connect to 151.62.196.222 port 80 after 15 ms: Connection refused,集群内部访问正常。

配置清单

IP池配置

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 151.62.196.222-151.62.196.222

通告配置

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: adv
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool

Deployment配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

Service配置

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
  type: LoadBalancer

排查步骤

  1. 验证MetalLB IP宣告状态

    • 登录集群节点,执行ip addr show,检查是否有节点网卡绑定了151.62.196.222这个IP
    • 查看MetalLB Speaker Pod日志,确认IP宣告无错误:
      kubectl logs -n metallb-system -l app=metallb,component=speaker
      
  2. 检查节点防火墙/安全组规则

    • 确认节点防火墙(iptables/firewalld)放行80端口入站流量:
      • 对于firewalld:
        firewall-cmd --query-port=80/tcp
        # 若未放行,执行:
        firewall-cmd --add-port=80/tcp --permanent && firewall-cmd --reload
        
      • 对于iptables:
        iptables-save | grep -A5 -B5 "dport 80"
        
    • 如果是云环境/物理机房,检查上层安全组/机房防火墙是否允许外部访问该IP的80端口
  3. 验证节点端口监听状态
    在绑定了外部IP的节点上执行:

    ss -tulpn | grep 151.62.196.222:80
    

    确认有MetalLB或kube-proxy进程在监听该端口

  4. 检查kube-proxy转发规则
    执行以下命令验证iptables是否正确配置了服务转发规则:

    iptables-save | grep nginx-service
    

    确认存在指向该服务的DNAT规则

  5. 检查Flannel网络兼容性

    • 查看Flannel Pod日志,确认无网络异常:
      kubectl logs -n kube-system -l app=flannel
      
    • 确认Flannel的CNI配置未限制外部IP流量转发到Pod

常见解决方案

  • 如果Speaker Pod日志有异常,重启Speaker Pod:
    kubectl delete pod -n metallb-system -l app=metallb,component=speaker
    
  • 如果节点防火墙未放行端口,添加对应端口的入站规则
  • 如果绑定IP的节点离线,恢复节点或等待MetalLB将IP重新分配到正常节点

内容的提问来源于stack exchange,提问作者Anh Tran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:20:55