Ubuntu 18.04下ingress-nginx路由本地K8s服务无法访问问题求助
逐步骤排查与解决方法
1. 先确认ingress-nginx的流量入口能被本地访问
本地自建场景下最容易忽略的问题是ingress控制器的服务没有暴露到宿主机网络:
- 执行
kubectl get svc -n ingress-nginx查看ingress控制器的Service类型,如果显示为ClusterIP,代表服务仅能在K8s集群内部访问,宿主机发往127.0.0.1的请求根本碰不到ingress组件 - 根据集群类型调整暴露方式:
- 自定义kubeadm搭建的单节点集群:给ingress控制器的Deployment开启
hostNetwork: true配置,让ingress进程直接占用宿主机的80/443端口接收流量 - minikube/kind等本地集群:需要额外启动集群隧道(比如执行
minikube tunnel),把LoadBalancer类型的ingress服务映射到本地网卡
- 自定义kubeadm搭建的单节点集群:给ingress控制器的Deployment开启
- 执行
netstat -tulpn | grep -E ':80|:443'确认宿主机的80/443端口没有被本地nginx、apache等其他进程占用,如果有占用先停掉对应进程,不然ingress没法绑定端口接收流量
关键逻辑:你把ecommerce.dev映射到127.0.0.1,本质是让浏览器的请求发到本地回环地址的80端口,这一步如果端口上没有ingress在监听,就会直接触发“站点无法访问”的连接错误。
2. 修正Ingress资源的版本兼容性问题
你当前写的Ingress配置使用的是extensions/v1beta1 apiVersion,这个版本的API在K8s 1.19及以上版本已经被完全移除,ingress-nginx控制器根本不会解析这类资源:
- 执行
kubectl get ingress ingress-service查看资源详情,如果输出的规则、后端信息为空,基本就是版本不兼容导致的 - 把配置修正为当前集群支持的
networking.k8s.io/v1版本,调整后的可参考配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-service annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: 'true' spec: rules: - host: ecommerce.dev http: paths: - path: /api/users/?(.*) pathType: ImplementationSpecific backend: service: name: auth-srv port: number: 3000
- 重新应用配置后,执行
kubectl describe ingress ingress-service,确认输出里没有配置报错,Address字段能正常显示ingress控制器的监听地址
3. 验证后端服务的基础连通性
排除ingress本身的问题后,要确认对应的后端服务是正常可访问的:
- 执行
kubectl get endpoints auth-srv检查服务的端点列表,如果列表为空,代表服务没有匹配到正在运行的后端Pod,就算ingress通了也会返回502错误 - 临时创建一个测试Pod,直接通过集群内地址curl访问auth-srv,确认后端服务本身能正常返回响应
4. 排查hosts配置和浏览器的实际解析行为
很多时候hosts配置写对了,但实际流量根本没走本地配置:
- 终端执行
ping ecommerce.dev,确认返回的解析IP是127.0.0.1,没有被其他DNS配置覆盖 - 如果本地开了代理/VPN,浏览器默认会绕过本地hosts配置直接走公网DNS解析域名,需要把
ecommerce.dev加入代理的直连规则 - 注意不要直接输裸域名访问:如果浏览器默认开启HTTPS强制跳转,裸域名访问会被直接转到443端口,如果ingress没有配置443端口的证书监听,就会触发连接失败的错误。测试的时候要在地址栏手动输入完整的
http://ecommerce.dev,跳过强制HTTPS跳转。
内容的提问来源于stack exchange,提问作者Talha Chafekar
相关产品推荐
相关产品推荐

