【问题标题】:How do you setup k8s ingress for React app + Express on single domain?如何在单个域上为 React app + Express 设置 k8s 入口?
【发布时间】:2018-08-14 21:39:49
【问题描述】:

我有一个使用 React 构建的前端应用程序和基于 nodejs 的后端。 两者都有单独的 Docker 映像,因此在 k8s (gce) 上单独部署。

每个部署都有一个对应的 k8s 服务,比如说fe-sericebe-service

我正在尝试设置一个入口,以便通过以下方式在单个域上公开两个服务:

  • /api/* - 被路由到be-service
  • 其他所有内容都路由到fe-service

这是我的 yaml 文件:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my-host
    http:
      paths:
      - path: /*
        backend:
          serviceName: fe-service
          servicePort: 80
      - path: /api/*
        backend:
          serviceName: be-service
          servicePort: 5000

这是我用 curl 得到的:

curl [ip] --header "Host: my-host" -> React 应用程序(如预期)

curl [ip]/foo --header "Host: my-host" -> nginx 404(为什么?)

curl [ip]/api --header "Host: my-host" -> nginx 404(为什么?)

curl [ip]/api/ --header "Host: my-host" -> nodejs 应用程序

curl [ip]/api/foo --header "Host: my-host" -> nodejs 应用程序

据我所知,api/ 的部分工作正常,但我无法弄清楚其他所有内容,我尝试了带/不带通配符的不同组合,但它仍然无法按我想要的方式工作工作。

我错过了什么?这甚至可能吗? 提前致谢!

【问题讨论】:

  • 正如@doe1331 所说,路径 /api/* 涵盖对 /api/ 的调用,但不包括对 /api 的调用 仔细检查 /foo 是否存在于 fe-service 下,这可能是 404 的原因。
  • @Andrey 你找到解决方案了吗?
  • @Andrey :我现在遇到了与 GKE 入口类似的问题,你解决了这个问题吗?
  • @Santhosha 在那一刻不,我没有。但那已经是前一阵子了 :) 现在我在私有集群上使用 Traefik 来做类似的事情,它工作正常
  • @Andrey:感谢您的更新,我正在使用 ingress-nginx / ingress-gce 研究类似的主题。以防万一,您是否曾在谷歌上使用过 nginx-ingress 控制器Kubernetes集群?如果是,我想知道您是否必须安装它/如何在集群上启用它

标签: docker kubernetes google-cloud-platform kubernetes-ingress


【解决方案1】:

我无法解释为什么 /foo 不起作用

但是

/api/* 不涵盖 /api,它只涵盖 /api/ 之后的任何内容

【讨论】:

    【解决方案2】:

    我认为这里的问题不是您的入口,而是您的 nginx 设置(没有看到它!)。由于 React 应用程序是单页应用程序,因此您需要告诉 nginx 服务器始终寻找 index.html 而不是去例如/usr/share/nginx/html/foo 那里可能没什么可找的。

    我认为您会找到相关信息,例如here。祝你好运@Andrey,如果这有帮助,请告诉我!

    【讨论】:

      【解决方案3】:

      我希望不会迟到回复。请使用 kubernetes use-regrex 注释以确保它映射到您的服务端点。请确保在重置结束时完成 React 应用服务映射。使用以下yaml

      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: my-ingress
        annotations:
          kubernetes.io/ingress.class: nginx
          nginx.ingress.kubernetes.io/use-regex: "true"
      spec:
        rules:
        - host: my-host
          http:
            paths:
            - path: /api/?(.*)
              backend:
                serviceName: be-service
                servicePort: 5000
             - path: /?(.*)
              backend:
                serviceName: fe-service
                servicePort: 80
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        • 2018-01-01
        • 2021-02-04
        • 1970-01-01
        • 1970-01-01
        • 2020-07-03
        • 1970-01-01
        相关资源
        最近更新 更多