如何在单个域上为React app + Express设置k8s入口?

时间:2018-03-06 22:11:53

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

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

每个部署都有相应的k8s服务,比方说fe-sericebe-service

我正在尝试设置Ingress,以便以下列方式在单个域上公开这两个服务:

  • /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 [ip] --header "Host: my-host" - > React app(按预期方式)

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 app

curl [ip]/api/foo --header "Host: my-host" - > nodejs app

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

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

3 个答案:

答案 0 :(得分:1)

我希望不要迟到回复。请使用 kubernetes use-regrex 注释以确保它映射到您的服务端点。请确保在重置结束时完成反应应用服务映射。使用以下 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

答案 1 :(得分:0)

我无法解释为什么/ foo无法正常工作

但是

在/ api /

之后,

/ api / *不会覆盖/ api

答案 2 :(得分:0)

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

我想你会找到相关信息,例如here。祝你好运!