如何将微服务API暴露至本地网络?Ingress NGINX配置问题排查
我正在开发一个基于Node.js的微服务API项目,用Docker容器本地运行,通过Kubernetes+Skaffold部署,用于IoT设备(传感器、ESP32)控制水培塔。现有服务包括:认证服务、设备服务、邮件服务,以及Next.js构建的客户端界面,所有后端服务基于Express,通过Ingress NGINX实现路由与服务间通信。
测试阶段遇到问题:同一局域网内的IoT设备向本地PC发起API请求时,返回“NGINX not found”错误。已尝试将自定义域名greenhive.io通过/etc/hosts指向127.0.0.1或PC本地网络IP,也配置了PC的80端口转发至Ingress Pod的80端口,但问题仍未解决,怀疑Ingress NGINX的部署或配置存在问题。
当前Ingress配置文件如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-srv annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: 'true' spec: rules: - host: 'greenhive.io' http: paths: - path: /api/users/?(.*) pathType: ImplementationSpecific backend: service: name: auth-srv port: number: 3000 - path: /api/devices/?(.*) pathType: ImplementationSpecific backend: service: name: devices-srv port: number: 3000 - path: /api/logs/?(.*) pathType: ImplementationSpecific backend: service: name: logs-srv port: number: 3000 - path: /api/readings/?(.*) pathType: ImplementationSpecific backend: service: name: readings-srv port: number: 3000 - path: /?(.*) pathType: ImplementationSpecific backend: service: name: client-srv port: number: 3000
以下是针对性的排查步骤和修复方案:
确认Ingress Controller的外部暴露方式
本地Kubernetes环境中,Ingress NGINX Controller默认可能是ClusterIP类型,外部设备无法直接访问。执行以下命令查看控制器服务状态:kubectl get service -n ingress-nginx如果类型是ClusterIP,将其修改为NodePort:
kubectl patch service ingress-nginx-controller -n ingress-nginx -p '{"spec":{"type":"NodePort"}}'记录映射的NodePort(比如80端口对应NodePort 30080),IoT设备请求时需使用
http://<PC本地IP>:<NodePort>/api/xxx格式。保证IoT设备的请求Host头匹配Ingress规则
Ingress规则是基于Host头匹配的,因此需确保IoT设备的请求中Host字段为greenhive.io:- 若设备支持配置hosts,添加
<PC本地IP> greenhive.io; - 若为ESP32,在请求代码中显式设置Host头(以Arduino HTTPClient为例):
#include <HTTPClient.h> void sendRequest() { HTTPClient http; http.begin("http://192.168.x.x/api/devices"); // 替换为PC本地IP http.addHeader("Host", "greenhive.io"); // 必须添加此头匹配Ingress规则 int httpCode = http.GET(); // 处理响应逻辑 http.end(); }
- 若设备支持配置hosts,添加
简化Ingress路径配置(可选)
当前配置使用正则路径,可尝试改用Prefix类型简化规则,避免正则匹配问题:# 示例:替换原/api/devices路径配置 - path: /api/devices pathType: Prefix backend: service: name: devices-srv port: number: 3000该配置会自动匹配
/api/devices下的所有子路径,无需正则表达式。验证Ingress资源与Controller状态
检查Ingress资源是否正确绑定:kubectl describe ingress ingress-srv确认
Address字段包含PC本地IP或Node IP;同时检查Ingress Pod是否正常运行:kubectl get pods -n ingress-nginx若Pod异常,重启控制器或查看日志排查:
kubectl logs -n ingress-nginx ingress-nginx-controller-xxx验证端口转发有效性
若使用端口转发,确保转发的是Ingress Controller的服务端口,而非单个微服务端口:kubectl port-forward -n ingress-nginx service/ingress-nginx-controller 80:80本地执行
curl http://greenhive.io/api/devices测试正常后,再在IoT设备上用PC本地IP请求http://<PC_IP>/api/devices验证。
内容的提问来源于stack exchange,提问作者Rodrigo Cruz

