Kubernetes Nginx控制器不工作时基于路径的路由

Kubernetes Nginx控制器不工作时基于路径的路由,kubernetes,kubernetes-ingress,nginx-ingress,Kubernetes,Kubernetes Ingress,Nginx Ingress,我一直在尝试使用基于Nginx路径的路由,但是,在花了将近4个小时之后,我不明白,为什么它不起作用。在有人对我的问题进行降级之前,我已经看过了几乎所有关于StackOverflow的可能答案,但没有一个对我有效 apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-path-based annotations: nginx.ingress.kubernetes.io/rewrite-

我一直在尝试使用基于Nginx路径的路由,但是,在花了将近4个小时之后,我不明白,为什么它不起作用。在有人对我的问题进行降级之前,我已经看过了几乎所有关于StackOverflow的可能答案,但没有一个对我有效

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-path-based
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: nginx.example.com
    http:
      paths:
      - path: /nginx1
        backend:
          serviceName: nginx1
          servicePort: 80
      - path: /nginx2
        backend:
          serviceName: nginx2
          servicePort: 80
我所做的是:

  • 我在一个单独的名称空间中使用Helm 3()安装了nginx入口-nginx测试:

    helm安装我的版本nginx稳定/nginx入口

  • 入口控制器()的一个版本:

  • 有两个基本的nginx部署,两个服务已经在同一名称空间中配置,并且在我为它们配置基于主机的路由时工作正常

  • 下面一个对我来说很好(当我定义基于主机的路由并在运行两个URL时获得所需的页面index.html时):

  • 现在我想使用基于路径的路由实现相同的结果,其中将有1个URL和2个路径/nginx1(指向nginx1服务)和/nginx2(指向nginx2服务)。因此,我配置了下面的入口资源(以及基于internet上不同示例应用的许多排列和组合),它们都不适合我

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-path-based
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1
        kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
      - host: nginx.example.com
        http:
          paths:
          - path: /nginx1
            backend:
              serviceName: nginx1
              servicePort: 80
          - path: /nginx2
            backend:
              serviceName: nginx2
              servicePort: 80
    
    当我直接访问服务时,它工作正常,但是当我尝试访问-
    curl时http://nginx.example.com/nginx1
    卷曲http://nginx.example.com/nginx2
    -我发现
    404未找到
    错误


    我希望收到与基于主机的路由相同的响应。但是它似乎不起作用。

    所以最后我不得不使用清单来安装控制器,而不是使用头盔图表(edge版本)

    我从这里安装了它(),将NodePort更改为LoadBalancer以获得LoadBalancer IP。我用的是纯金属

    $ POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l app.kubernetes.io/component=controller -o jsonpath='{.items[0].metadata.name}')
    $ kubectl exec -it $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version
    -------------------------------------------------------------------------------
    NGINX Ingress controller
      Release:       0.32.0
      Build:         git-446845114
      Repository:    https://github.com/kubernetes/ingress-nginx
      nginx version: nginx/1.17.10
    
    -------------------------------------------------------------------------------
    
    $ 
    
    我的入口资源看起来和我提问时发布的一样

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-path-based
      annotations:
        kubernetes.io/ingress.class: "nginx"
        nginx.ingress.kubernetes.io/rewrite-target: /$1
    spec:
      rules:
      - host: nginx.gofork8s.com
        http:
          paths:
          - path: /nginx1
            backend:
              serviceName: nginx1
              servicePort: 80
          - path: /nginx2
            backend:
              serviceName: nginx2
              servicePort: 80
    
    在/etc/hosts文件中修改了新的LoadBalancer IP以使域工作

    192.168.0.1 nginx.example.com
    
    现在,我可以访问-和


    我希望它能帮助别人。我仍然需要使用Helm图表确定设置。

    nginx ingress控制器版本?我看到您在基于路径的路由中使用“nginx.ingress.kubernetes.io/rewrite-target:/”,是否有重写的具体原因?你能试着删除它一次吗?@NaveenKulkarni我已经测试了几乎所有的实现方法,不管有没有它,它都不起作用。尽管我在提出一个问题时提到了它。@ArghyaSadhu-我已经用ingress controller版本编辑了我的问题。我一直在想这个版本肯定有问题。我计划手动安装它,而不是让helm检查它,但这也应该可以。如果版本是0.22或更高,那么您需要使用capture group
    192.168.0.1 nginx.example.com