【问题标题】:Nginx Ingress path is not pointing to service / pathNginx Ingress 路径未指向服务/路径
【发布时间】:2021-10-26 22:36:54
【问题描述】:

我的集群上安装了 nginx 入口。这是yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-client
  annotations:
    kubernetes.io/ingress.class: nginx
  namespace: dev
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: client-service
            port: 
              number: 80
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port: 
              number: 80

当我点击 / 前缀时,它很好。 curl http://example.com(都很好)

问题:

但是当我点击/api前缀时,它返回的是服务的/api而不是服务的/

curl http://example.com/api(它应该链接到 api-service,但它正在链接到 api-service/api)

任何帮助将不胜感激!

【问题讨论】:

    标签: docker kubernetes kubernetes-ingress nginx-ingress


    【解决方案1】:

    你可以使用nginx.ingress.kubernetes.io/rewrite-target:

    在某些情况下,后端服务中暴露的 URL 与 Ingress 规则中指定的路径不同。如果不进行重写,任何请求都将返回 404。将注释 nginx.ingress.kubernetes.io/rewrite-target 设置为服务预期的路径。

    所以,在这里你可以将你的入口更改为下一个:

    metadata:
      name: ingress-client
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/rewrite-target: /
      namespace: dev
    

    上面的入口定义将导致以下重写:

    • api-service/api 重写为 api-service/

    【讨论】:

      【解决方案2】:

      这是因为类型为Prefix 的路径/ 将匹配/ 以及之后的所有内容,包括/api。所以在某种意义上,你的第一条规则盖过了第二条规则。

      我不知道这是否适合您,但为两种服务使用不同的主机名可能是最优雅和惯用的。如果你部署cert-manager,这应该不是问题。

      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: client-service
                port: 
                  number: 80
      # use a different hostname for the api
      - host: api.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: api-service
                port: 
                  number: 80
      

      另一种选择是在您的前端路径规则中使用regex。并且当斜杠后跟api时让它不匹配。为此,您需要设置注释。

      annotations:
        nginx.ingress.kubernetes.io/use-regex: "true"
      

      然后您可以为您的前端服务执行以下操作。使用negative lookahead

      - path: /(?!api).*
      

      或者,但不那么漂亮,您可以向前端服务添加路径前缀,并通过 path rewrite 注释将其删除。但是,您可能必须编写两个单独的入口清单,因为这是两者的注释计数,或者您需要使用更复杂的路径重写规则。

      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$2
      
      - path: /ui(/|$)(.*)
      

      【讨论】:

        猜你喜欢
        • 2021-05-15
        • 2018-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多