Kubernetes集群通过Ingress访问NodeRED返回Cannot GET /nodered问题求助
问题根因
- 你当前的Nginx Ingress配置仅做了路径匹配,未配置路径重写规则:用户请求
host-name.com/nodered时,Ingress会将完整的/nodered路径直接转发给后端NodeRED服务,而NodeRED默认监听根路径/,没有定义/nodered路由,因此返回404报错。 - 你集群中其他可正常运行的服务大概率本身支持对应路径前缀的访问,因此不需要额外重写配置即可正常响应,和NodeRED的默认配置存在差异。
注意:以下两种方案二选一即可,不要同时配置,否则会出现路径双重处理导致的新404问题。
解决方案
方案1:新增Ingress重写注解(无需修改NodeRED配置)
在Ingress的annotations中新增重写规则,将匹配到的路径去除/nodered前缀后转发给后端,修改后的Ingress配置如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nodered-ingress namespace: {{ kubernetes_namespace_name }} annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/ssl-redirect: "false" # 新增以下重写注解 nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: host-name.com http: paths: - path: /nodered(/|$)(.*) backend: serviceName: nodered-app-service servicePort: 1880
修改后重新apply该Ingress资源即可生效。
方案2:修改NodeRED配置适配路径前缀(无需修改Ingress)
NodeRED原生支持自定义访问路径前缀,你可以通过环境变量直接配置,无需修改Ingress规则。在Deployment的containers.env中新增NODE_RED_HTTP_ROOT参数即可:
containers: - name: nodered-service-statefulset image: nodered/node-red:{{ nodered_service_version }} # 其他原有配置保持不变 env: - name: BUILD_TIME value: "{{ kubernetes_build_time }}" # 新增以下环境变量 - name: NODE_RED_HTTP_ROOT value: "/nodered"
修改后重新apply Deployment资源,等待Pod滚动重启完成即可正常访问。
内容的提问来源于stack exchange,提问作者i-haidar
相关产品推荐
相关产品推荐

