Nginx 控制器的基于路径的路由不起作用

Path Based Routing with Nginx Controller not working

我一直在尝试我的 Nginx 基于路径的路由工作,但是,在花了将近 4 个小时之后,我无法理解,为什么它不工作。在有人降级我的问题之前,我已经在 Whosebug 上浏览了几乎所有可能的答案,但 none 对我有用。

所以这是我所做的:

  1. 我在单独的命名空间中使用 Helm 3 (https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-helm/) 安装了 nginx-ingress - nginx-test:

    helm install my-release nginx-stable/nginx-ingress

入口控制器的一个版本(https://hub.helm.sh/charts/nginx-edge/nginx-ingress):

$ POD_NAME=$(kubectl get pods -l app=nginx-controller-nginx-ingress -o jsonpath='{.items[0].metadata.name}')
$ 
$ kubectl exec -it $POD_NAME -- /nginx-ingress --version
Version=edge GitCommit=50e908aa
$ 
  1. 有 2 个基本的 nginx 部署,2 个服务已经在同一个命名空间中配置,并且在我为它们配置基于主机的路由时工作正常。

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

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: nginx1.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx1
          servicePort: 80

  - host: nginx2.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx2
          servicePort: 80

现在我想使用基于路径的路由实现相同的结果,其中将有 1 个 URL 和 2 个路径 /nginx1(指向 nginx1 服务)和 /nginx2(指向 nginx2 服务)。所以我配置了下面的入口资源(以及我根据互联网上的不同示例应用的许多排列和组合),none 其中对我有用。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-path-based
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    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/nginx1curl http://nginx.example.com/nginx2 - 我得到 404 Not Found 错误。

我期待收到与基于主机的路由相同的响应。但是好像不行。

所以最后我不得不使用清单安装控制器,而不是使用 helm charts(边缘版本)。

我是从这里安装的(https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal), changed NodePort to LoadBalancer to get a LoadBalancer IP. I am using MetalLB 在 BareMetal 上。

$ 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

-------------------------------------------------------------------------------

$ 

我的 Ingress 资源看起来和我在提问时发布的一样。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-path-based
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
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

现在我可以访问了 - http://nginx.example.com/nginx1 and http://nginx.example.com/nginx2

希望对大家有所帮助。我仍然需要弄清楚 Helm Charts 的设置。