9阅网

您现在的位置是:首页 > 知识 > 正文

知识

nginx - NGINX入口控制器中的Stripprefix中间件。

admin2022-11-05知识15

我们已经在Kubernetes集群上部署了Traefik 2.2,并创建了以下的入口路径来访问我们的应用程序。这个配置对我们来说很好,目前对我们的生产系统也是如此。

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: application-xyz

spec:
  tls: {}
  entryPoints:
    - web
    - websecure
  routes:

    - match: "HostRegexp(`application-xyz.com`) && PathPrefix(`/`)"

      kind: Rule
      priority: 1
      services:
        - name: application-xyz-service
          port: 80


    - match: "PathPrefix(`/application-xyz/`)"
      kind: Rule
      services:
        - name: application-xyz-service
          port: 80
      middlewares:
        - name: application-xyz-stripprefix
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: application-xyz-stripprefix
  namespace: frontend
spec:
  stripPrefix:
    prefixes:
      - /application-xyz/
    forceSlash: false

问题1:我们现在计划从Traefik迁移到Nginx Ingress Controller。有没有什么方法可以让我们在Nginx上复制类似Traefik配置的配置。我不知道我比较的方式是否正确。如果我们能得到任何提示,将不胜感激。

问题2:我们希望在Nginx上实现stripprefix功能,但没有找到任何有用的文档。任何这方面的线索都是非常感激的。



【回答】:

在nginx ingress中的StripPrefix功能,你可以使用实现 rewrite-target 注释.当 rewrite-target 启用了 regexp 路径匹配,它允许你将路径的任何部分匹配成组,并基于此重写路径。

在你的情况下,它看起来像下面。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  name: rewrite
  namespace: default
spec:
  rules:
  - host: application-xyz.com
    http:
      paths:
      - backend:
          serviceName: application-xyz-service
          servicePort: 80
        path: /(.*)
  - http:
      paths:
      - backend:
          serviceName: application-xyz-service
          servicePort: 80
        path: /application-xyz/(.*)

如果你觉得我的回答需要更详细的解释,请随时提问。

【回答】:

@HelloWorld,谢谢你的回复。我已经尝试过这个配置,但没有达到预期的效果。请看下面我试过的代码。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: application-xyz-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: cname.application-xyz.com
      http:
        paths:
          - backend:
              serviceName: application-xyz-service
              servicePort: 80
            path: /(.*)
    - host: application-xyz.com
      http:
        paths:
          - path: /cname-sample/(.*)
            backend:
              serviceName: application-xyz-service
              servicePort: 80

在这个配置下,cname.application-xyz.com工作正常,但application-xyzcn-sample不工作,这是我想解决的首要问题。请把你的想法告诉我。

【回答】:

这个问题现在已经解决了。我们还没有部署一些应用程序的依赖关系,这让我们陷入了错误的方向。pods显示Running状态为,应用程序正在等待依赖关系加载,没有收到任何请求服务。感谢HelloWorld提出的正确方法。