微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确配置 k8s nginx 入口基本 url 和路径来处理 vuejs 客户端路由和 nodejs 服务器端 api

如何解决如何正确配置 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 举报,一经查实,本站将立刻删除。