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

裸金属Kubernetes集群Ingress访问超时问题求助

排查Ingress访问超时问题的步骤

结合你提供的配置和测试信息,咱们一步步拆解问题:

1. 先确认Ingress Controller的Service配置(最关键的前置条件)

裸金属环境下,Ingress本身不会直接处理外部流量,所有Ingress的请求都得先打到Ingress Controller的Service上。你提到直接暴露Service为LoadBalancer能正常访问,说明MetalLB工作正常,但得先确认Ingress Controller的Service是不是正确配置了MetalLB:

  • 执行命令查看Ingress Controller的Service(通常在kube-system命名空间):
    kubectl get svc -n kube-system | grep nginx-ingress
    
  • 检查这个Service的TYPE是不是LoadBalancer,并且EXTERNAL-IP字段有没有分配到MetalLB池中的IP(和你Ingress资源显示的IP一致)。
    • 如果Ingress Controller的Service是NodePort或者ClusterIP类型,那MetalLB分配给Ingress的IP根本没有关联到Ingress Controller,自然访问超时。

2. 检查Ingress与Service的命名空间匹配问题

看你的配置:

  • Ingress资源没有指定namespace,默认会部署在default命名空间
  • 你的httpd Service明确在development命名空间

Kubernetes的Ingress默认只能引用同一命名空间下的Service!也就是说,你当前的Ingress在default里,会去default找名为httpd的Service,但这个Service实际在development,所以即使流量到了Ingress Controller,也会找不到后端服务(不过你现在是ping超时,这是更靠前的问题,但这个错误必须修正)。
修正方法:

  • 在Ingress配置中添加namespace: development,把Ingress部署到和Service同一个命名空间:
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: dev-ingress
      namespace: development  # 新增这一行
      annotations:
        kubernetes.io/ingress.class: nginx
    spec:
      rules:
      - http:
          paths:
          - path: /
            backend:
              serviceName: httpd
              servicePort: 80
    

3. 验证MetalLB的IP是否正确绑定到节点

因为你ping Ingress的IP超时,说明这个IP没有被正确路由到集群节点:

  • 先确认MetalLB的IP池配置,确保Ingress的IP在你配置的池范围内
  • 登录集群节点,执行ip addr查看有没有这个IP被绑定到某个网卡上(Layer2模式下MetalLB会把IP绑定到某个节点的网卡)
  • 在绑定了该IP的节点上,尝试ping这个IP,如果能通,再检查集群外部到该节点的网络是否开放了80/443端口(防火墙、安全组规则)
  • 如果节点上也ping不通这个IP,查看MetalLB控制器的日志,确认IP分配和绑定过程有没有异常

4. 检查Ingress Controller的流量接收情况

你提到访问Ingress IP时,Ingress Controller日志没有新内容,说明流量根本没到Ingress Controller:

  • 先确认Ingress Controller的Pod是否正常运行:kubectl get pods -n kube-system | grep nginx-ingress
  • 尝试直接访问Ingress Controller的Pod IP(比如curl <pod-ip>:80),看能不能返回默认的404页面(如果没有匹配的Ingress规则的话)
  • 如果Pod能正常响应,再检查Ingress Controller的Service是否正确关联到Pod(看Endpoints是否正常:kubectl get endpoints -n kube-system <nginx-ingress-svc-name>)

5. 排查网络策略或防火墙限制

  • 检查集群节点的防火墙规则,确保80/443端口对外开放(比如iptables -L或者firewall-cmd --list-ports)
  • 检查development命名空间有没有NetworkPolicy,是否阻止了Ingress Controller所在命名空间(通常是kube-system)访问httpd Service
  • 检查集群的CNI插件是否有网络隔离规则,导致Ingress Controller无法访问后端Pod

按照上面的步骤排查,应该能定位到问题。先从Ingress Controller的Service配置和命名空间匹配这两个最常见的问题入手,大概率能解决你的超时问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:52:34