如何在单个域上为 React 应用程序 + Express 设置 k8s 入口?



我有一个在nodejs上用React和后端构建的前端应用程序。 两者都有一个单独的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 app

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

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

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

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

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

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

我想您会在这里找到相关信息。祝你@Andrey好运,让我知道这是否有帮助!

我希望回复不会晚。请使用 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