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
排查步骤
验证MetalLB IP宣告状态
- 登录集群节点,执行
ip addr show,检查是否有节点网卡绑定了151.62.196.222这个IP - 查看MetalLB Speaker Pod日志,确认IP宣告无错误:
kubectl logs -n metallb-system -l app=metallb,component=speaker
- 登录集群节点,执行
检查节点防火墙/安全组规则
- 确认节点防火墙(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"
- 对于firewalld:
- 如果是云环境/物理机房,检查上层安全组/机房防火墙是否允许外部访问该IP的80端口
- 确认节点防火墙(iptables/firewalld)放行80端口入站流量:
验证节点端口监听状态
在绑定了外部IP的节点上执行:ss -tulpn | grep 151.62.196.222:80确认有MetalLB或kube-proxy进程在监听该端口
检查kube-proxy转发规则
执行以下命令验证iptables是否正确配置了服务转发规则:iptables-save | grep nginx-service确认存在指向该服务的DNAT规则
检查Flannel网络兼容性
- 查看Flannel Pod日志,确认无网络异常:
kubectl logs -n kube-system -l app=flannel - 确认Flannel的CNI配置未限制外部IP流量转发到Pod
- 查看Flannel Pod日志,确认无网络异常:
常见解决方案
- 如果Speaker Pod日志有异常,重启Speaker Pod:
kubectl delete pod -n metallb-system -l app=metallb,component=speaker - 如果节点防火墙未放行端口,添加对应端口的入站规则
- 如果绑定IP的节点离线,恢复节点或等待MetalLB将IP重新分配到正常节点
内容的提问来源于stack exchange,提问作者Anh Tran
相关产品推荐
相关产品推荐

