裸金属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,自然访问超时。
- 如果Ingress Controller的Service是
2. 检查Ingress与Service的命名空间匹配问题
看你的配置:
- Ingress资源没有指定
namespace,默认会部署在default命名空间 - 你的
httpdService明确在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)访问httpdService - 检查集群的CNI插件是否有网络隔离规则,导致Ingress Controller无法访问后端Pod
按照上面的步骤排查,应该能定位到问题。先从Ingress Controller的Service配置和命名空间匹配这两个最常见的问题入手,大概率能解决你的超时问题。
内容的提问来源于stack exchange,提问作者Ricardo
相关产品推荐
相关产品推荐

