我有两个后端 api 服务:
- api-服务-v1
- api-服务-v2
均对“/api/”路径做出响应
我已将此配置作为 docker-compose 设置运行良好,其中 nginx 服务用作代理,配置文件如下
/etc/nginx/conf.d/default.conf:
server {
...
location /apiv1/ {
proxy_pass http://api-service-v1/api/;
}
...
location /apiv2/ {
proxy_pass http://api-service-v2/api/;
}
...
}
现在我想将设置部署到 k8s 集群。我被 ingress 配置卡住了。ingress.yml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dev-ingress
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: demo.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: frontend-service
port:
number: 80
- pathType: Prefix
path: "/apiv1/"
backend:
service:
name: api-service-v1
port:
number: 80
- pathType: Prefix
path: "/apiv2/"
backend:
service:
name: api-service-v2
port:
number: 80
路径“/”可以正常工作。但是路径“/apiv1/”和“/apiv2/”不起作用。
请帮忙。
谢谢!
答案1
入口只会将整个路径转发到服务。
例如,您api-service-v1
将收到诸如 https://yourhost/apiv1/asdfq 之类的 URL
如果你希望 ingress 修改用于访问服务的路径,你需要告诉它重写,如下所述:https://kubernetes.github.io/ingress-nginx/examples/rewrite/
path
将api-service 路径分别更改为/apiv1(/|$)(.*)
和/apiv2(/|$)(.*)
。
然后添加nginx.ingress.kubernetes.io/rewrite-target: /api$1$2
注释。
不幸的是,这也意味着您的 / 需要位于另一个入口,否则对前端的请求也将被重写以命中/api/
您的前端服务。
答案2
我正在尝试做同样的事情,但只使用一个 api 和前端。我无法让它工作... 只使用一个入口可以吗?
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dev-ingress
annotations:
spec:
rules:
- host: demo.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: frontend
port:
number: 80
- pathType: Prefix
path: "/api/"
backend:
service:
name: api
port:
number: 80