我有一个使用React和后端在nodejs上构建的前端应用程序 . 两者都有一个单独的Docker镜像,因此在k8s(gce)上有一个单独的部署 .
每个部署都有相应的k8s服务,比方说 fe-serice
和 be-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得到的:
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/
的一部分工作正常,但我无法弄清楚其他一切,我尝试使用/不使用通配符的不同组合,但它仍然无法按照希望它工作的方式工作 .
我错过了什么?这有可能吗?提前致谢!
2 回答
我不认为这里的问题是你的入口,而是你的nginx设置(没有看到它!) . 由于React应用程序是单页面应用程序,您需要告诉nginx服务器始终查找
index.html
而不是去寻找例如/usr/share/nginx/html/foo
哪里可能找不到任何东西 .我想你会找到相关信息,例如here . 祝好运!
我无法解释为什么/ foo不起作用
但
/ api / *在/ api /之后只覆盖/ api