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

如何将微服务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();
      }
      
  • 简化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:27:38