如何解决如何正确配置 k8s nginx 入口基本 url 和路径来处理 vuejs 客户端路由和 nodejs 服务器端 api
我正在尝试在同一个域中部署我的前端客户端应用程序和后端 API,并且我希望前端位于基本路径上:/
然而,我意识到前端和后端需要两个不同的重写目标来实现这一点。
前端与:
Nginx.ingress.kubernetes.io/rewrite-target: /
后端与:
Nginx.ingress.kubernetes.io/rewrite-target: /$2
我尝试使用两种不同的入口服务来适应不同的重写目标,但由于主机是同一个域,所以失败了。
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: /$2
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(/|$)(.*)
我知道如果我将前端路径更改为 path: /app(/|$)(.*) ,我可以使用相同的重写目标 /$2
这是唯一的选择。
有没有办法让我更好地配置单个入口以适用于 2 个不同的重写目标?
解决方法
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:
在某些情况下,一个 Ingress 中的多个路径会匹配一个请求。在这些情况下,最长的匹配路径将首先获得优先权。如果两个路径仍然相等匹配,则优先于具有确切路径类型的路径而不是前缀路径类型。
因此,当您查找位于路径“/home.html”的资源时,它仅与您的前端服务匹配。但是当您寻找位于路径“/api/something”的资源时,它会匹配这两个服务。但是由于上面提到的最大路径匹配,它总是会转到后端服务。
,我不知道你会不会接受,但它可以是一个解决方案。您可以使用两个入口来实现您的目标。每个将使用不同的注释。它会正常工作。
就像你当前的入口 yaml 一样,制作另一个 yaml 并在其中放置两个不同的注释,并将您的前端和后端分别放入其中。主机 (host: test.eastus.cloudapp.azure.com
) 将与您在此处提供的相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。