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

K8s中无需为后端配置Ingress 实现前端与内部服务连通

实现方案

首先明确核心逻辑:React打包后是运行在用户浏览器的静态资源,不属于K8s集群内组件,因此无法直接访问集群内的ClusterIP(即你列出的10.107.95.144:5000)——该地址仅集群内Pod可路由,用户浏览器无法连通。
正确的实现方式是复用现有Nginx Ingress做路径转发,不需要单独给后端创建Ingress,也不需要修改后端Service的类型,所有流量统一走已暴露的前端入口。


步骤1:修正并更新现有Ingress配置

你原有的Ingress配置存在两处问题:一是host与http规则缩进错误,会导致路由不生效;二是全局rewrite规则会影响后端路径匹配,需要调整。修改后的完整配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  annotations:
    # 调整重写规则,截取路径前缀后的真实请求路径转发给后端
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  defaultBackend:
    service:
      name: frontend
      port:
        number: 80
  rules:
    - host: myapp-hello.me
      http:
        paths:
        - path: /frontend(/|$)(.*)
          pathType: Prefix
          backend:
            service:
              name: frontend
              port:
                number: 80
        # 新增后端服务路由规则
        - path: /backend(/|$)(.*)
          pathType: Prefix
          backend:
            service:
              name: backend
              port:
                number: 5000

配置生效后,所有发往myapp-hello.me/backend/*的请求,都会被Ingress直接转发到集群内的backend Service,转发时会自动去掉/backend前缀,避免后端服务因路径不匹配返回404。


步骤2:修改React请求代码

直接使用同域名的相对路径即可,不需要配置跨域,也不需要暴露后端独立入口:

// 推荐使用相对路径,后续域名变更无需修改代码
fetch('/backend')
  .then(response => {
    response.text().then(text => {
      console.log(text);
      setData(text);
    })
  })

// 如需写绝对路径,格式为 http://myapp-hello.me/backend

注意事项

  • 不要在前端代码中直接填写后端Service的ClusterIP、K8s内部域名(如backend.default.svc.cluster.local),这类地址仅集群内DNS可解析,用户浏览器无法访问。
  • 本地开发环境联调时,可以在Vite/Webpack的devServer中配置代理转发/backend请求到后端地址,但该方案仅适用于开发阶段,生产环境打包后静态资源无代理能力,必须使用上述Ingress转发方案。

内容的提问来源于stack exchange,提问作者Seiteros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:03:26