如何正确配置 k8s nginx 入口基础 url 和处理 vuejs 客户端路由和 nodejs 服务器端的路径 api
How to properly configure k8s nginx ingress base url and path to handle vuejs client side routing and nodejs server side api
我正在尝试在同一个域上部署我的前端客户端应用程序和后端 API,我希望前端位于基本路径上:/
然而,我意识到前端和后端需要两个不同的重写目标来完成这个。
前端适用于:
nginx.ingress.kubernetes.io/rewrite-target: /
而后端使用:
nginx.ingress.kubernetes.io/rewrite-target: /
我尝试使用两种不同的入口服务以适应不同的重写目标,但失败了,因为主机是同一个域。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: test
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-staging
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/add-base-url: "true"
nginx.ingress.kubernetes.io/service-upstream: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
nginx.ingress.kubernetes.io/proxy-buffering: "on"
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "server: hide";
more_set_headers "X-Content-Type-Options: nosniff";
more_set_headers "X-Xss-Protection: 1";
spec:
tls:
- hosts:
- test.eastus.cloudapp.azure.com
secretName: tls-secret
rules:
- host: test.eastus.cloudapp.azure.com
http:
paths:
- backend:
serviceName: webapp
servicePort: 80
path: /
- backend:
serviceName: api
servicePort: 80
path: /api(/|$)(.*)
我知道如果我将前端路径更改为路径,我可以使两者都使用相同的重写目标 /
:/app(/|$)(.*) 但我不想这样做除了它是唯一的选择。
有没有办法让我更好地配置单个入口以用于 2 个不同的重写目标?
我不知道你会不会接受,但这可能是一个解决方案。您可以使用两个入口来实现您的目标。每一个都会使用不同的注解。它会很好地工作。
就像你现在的ingress yaml一样,再做一个yaml,在里面放两个不同的注解,把你的前端和后端也分别放进去。主机 (host: test.eastus.cloudapp.azure.com
) 将与您在此处提供的相同。
Ingress with API version networking.k8s.io/v1 with k8s version 1.19+ 可以解决你的问题。我在下面给出了一个例子。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: backend-service
port:
number: 8080
根据 kubernetes documentation:
In some cases, multiple paths within an Ingress will match a request. In those cases precedence will be given first to the longest matching path. If two paths are still equally matched, precedence will be given to paths with an exact path type over prefix path type.
因此,当您查找位于路径“/home.html”的资源时,它只与您的前端服务相匹配。但是当您寻找位于路径“/api/something”的资源时,它会同时匹配这两个服务。但由于上述最大路径匹配,它总是会转到后端服务。
我正在尝试在同一个域上部署我的前端客户端应用程序和后端 API,我希望前端位于基本路径上:/
然而,我意识到前端和后端需要两个不同的重写目标来完成这个。
前端适用于:
nginx.ingress.kubernetes.io/rewrite-target: /
而后端使用:
nginx.ingress.kubernetes.io/rewrite-target: /
我尝试使用两种不同的入口服务以适应不同的重写目标,但失败了,因为主机是同一个域。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: test
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-staging
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/add-base-url: "true"
nginx.ingress.kubernetes.io/service-upstream: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
nginx.ingress.kubernetes.io/proxy-buffering: "on"
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "server: hide";
more_set_headers "X-Content-Type-Options: nosniff";
more_set_headers "X-Xss-Protection: 1";
spec:
tls:
- hosts:
- test.eastus.cloudapp.azure.com
secretName: tls-secret
rules:
- host: test.eastus.cloudapp.azure.com
http:
paths:
- backend:
serviceName: webapp
servicePort: 80
path: /
- backend:
serviceName: api
servicePort: 80
path: /api(/|$)(.*)
我知道如果我将前端路径更改为路径,我可以使两者都使用相同的重写目标 /
:/app(/|$)(.*) 但我不想这样做除了它是唯一的选择。
有没有办法让我更好地配置单个入口以用于 2 个不同的重写目标?
我不知道你会不会接受,但这可能是一个解决方案。您可以使用两个入口来实现您的目标。每一个都会使用不同的注解。它会很好地工作。
就像你现在的ingress yaml一样,再做一个yaml,在里面放两个不同的注解,把你的前端和后端也分别放进去。主机 (host: test.eastus.cloudapp.azure.com
) 将与您在此处提供的相同。
Ingress with API version networking.k8s.io/v1 with k8s version 1.19+ 可以解决你的问题。我在下面给出了一个例子。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: backend-service
port:
number: 8080
根据 kubernetes documentation:
In some cases, multiple paths within an Ingress will match a request. In those cases precedence will be given first to the longest matching path. If two paths are still equally matched, precedence will be given to paths with an exact path type over prefix path type.
因此,当您查找位于路径“/home.html”的资源时,它只与您的前端服务相匹配。但是当您寻找位于路径“/api/something”的资源时,它会同时匹配这两个服务。但由于上述最大路径匹配,它总是会转到后端服务。