我有一个在nodejs上用React和后端构建的前端应用程序。 两者都有一个单独的Docker镜像,因此在k8s(gce)上有一个单独的部署。
每个部署都有一个对应的k8s服务,假设fe-serice
和be-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