无法通过Ingress访问K8s API,求故障排查方法
1. 检查命名空间一致性
你的Ingress部署在app命名空间,需确认Deployment和Service也在该命名空间下:
kubectl get deployment weather-api -n app kubectl get service api-svc -n app
如果两者不在app命名空间,Ingress会无法找到后端服务,直接导致路由失败。
2. 查看Ingress控制器实时日志
Ingress-Nginx控制器的日志能直接暴露路由失败的具体原因,执行命令跟踪日志:
kubectl logs -n ingress-nginx deployment/ingress-nginx-controller -f
重点关注包含api-ingress或api-svc的日志条目,排查是否存在服务找不到、路径匹配错误或转发失败的提示。
3. 验证Ingress规则加载状态
检查Ingress资源的状态,确认规则已被控制器正确识别:
kubectl describe ingress api-ingress -n app
查看Events字段,确认是否有Successfully configured类的成功提示;同时核对Rules部分的路径、后端服务配置是否与预期一致。
4. 测试集群内部路由连通性
在集群内临时启动一个busybox Pod,测试从集群内部访问Ingress控制器的ClusterIP和目标路径:
kubectl run -it --rm busybox --image=busybox:1.35 -- sh # 在busybox终端内执行 wget -O - http://10.0.240.185/api
如果内部访问也超时,说明Ingress控制器到后端服务的链路存在问题;若内部能正常访问,则问题出在外部到集群的网络层面。
5. 检查后端服务的端点关联状态
确认Service已正确关联到Pod的端点:
kubectl get endpoints api-svc -n app
查看ENDPOINTS字段是否显示Pod的IP和端口(如10.xx.xx.xx:80),如果为空,说明Service的标签选择器与Pod的标签不匹配(需核对Deployment的Pod标签app: ingress-weather和Service的selector是否一致)。
6. 排查外部网络防火墙/安全组
确认集群所在环境的防火墙或云平台安全组已开放Ingress控制器的端口:
- 云平台场景:检查LoadBalancer对应的安全组是否允许80端口(或NodePort 32294)的TCP入站流量;
- 本地集群场景:检查节点的防火墙规则是否放行32294端口的入站请求。
7. 验证Ingress类匹配情况
确认Ingress控制器使用的Ingress类与你的Ingress配置一致:
kubectl get deployment ingress-nginx-controller -n ingress-nginx -o yaml | grep -i ingress.class
如果控制器使用的类名(如nginx-ingress)与Ingress注解kubernetes.io/ingress.class: nginx不匹配,需修改注解保持一致。
8. 调整路径重写规则测试
你的Ingress配置了nginx.ingress.kubernetes.io/rewrite-target: /,但Prefix类型路径的重写规则可能需要调整。可临时修改Ingress配置:
# 修改后的路径及注解示例 metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - http: paths: - path: /api(/|$)(.*) pathType: Prefix backend: service: name: api-svc port: number: 8100
应用修改后重新测试访问,排查是否因路径重写规则导致的路由失败。
9. 验证LoadBalancer外部IP可达性
从客户端执行连通性测试:
telnet 104.42.145.179 80 # 或用curl查看详细报错 curl -v http://104.42.145.179/api
如果telnet无法连通,说明外部IP本身不可达,需排查云平台LoadBalancer绑定状态或网络路由问题。
内容的提问来源于stack exchange,提问作者Marc

