我一直在尝试我的 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

入口 Controller 的一个版本( 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 
$  
  • 有 2 个基本的 nginx 部署,已在同一命名空间中配置了 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 错误。

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

    请您参考如下方法:

    所以最后我不得不使用 list 安装 Controller ,而不是 helm 图表(边缘版本)。

    我从这里安装了它( https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal ),将 NodePort 更改为 LoadBalancer 以获取 LoadBalancer IP。我正在使用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 .

    我希望它能对某人有所帮助。我仍然需要弄清楚 Helm Charts 的设置。


    评论关闭
    IT序号网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!