Nginx Controller的基于路径的路由不起作用

时间:2020-05-31 20:55:12

标签: kubernetes kubernetes-ingress nginx-ingress

我一直在尝试基于Nginx路径的路由工作,但是,在花费了将近4个小时之后,我还是无法理解,为什么它不起作用。在有人降级我的问题之前,我已经对StackOverflow进行了几乎所有可能的回答,但没有一个对我有用。

这就是我所做的:

  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. 下面的一个对我来说很好(当我定义基于主机的路由并同时运行两个URL时获得所需的页面index.html时):

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
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服务)。因此,我配置了以下入口资源(以及根据互联网上的不同示例应用的许多排列和组合),但没有一个适合我。

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/nginx1curl http://nginx.example.com/nginx2时,出现404 Not Found错误。

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

1 个答案:

答案 0 :(得分:2)

所以最终我不得不使用清单而不是头盔图表(边缘版本)来安装控制器。

我从这里(https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal)安装它,将NodePort更改为LoadBalancer以获取LoadBalancer IP。我在BareMetal上使用MetalLB

$ 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: /$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

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

我希望它能对某人有所帮助。我仍然需要弄清楚“舵图”的设置。