我在nodejs上使用React和backend构建了一个前端应用程序。 两者都有一个单独的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 [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/
的部分工作正常,但我无法弄清楚其他所有内容,我尝试使用/不使用通配符的不同组合,但它仍然无法按照需要的方式工作它起作用了。
我错过了什么?这甚至可能吗? 提前谢谢!
答案 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。祝你好运!